From 43128234941b9d10e27ad990c23773b73cf6ff1b Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 3 Jan 2025 21:04:31 +0530 Subject: [PATCH 01/25] rm notes, plans, stripe, openapi, feature-flags and sample data --- backend/.env.dist.local | 19 - backend/.openapirc.js | 24 - backend/base.yaml | 33 - .../config/custom-environment-variables.json | 24 - backend/config/default.json | 4 - backend/openapi.json | 5852 ----------- backend/package.json | 17 - backend/src/api/apiDocumentation.ts | 41 - .../activity/activityTypes/examples.yaml | 148 - .../activity/activityTypes/inputs.yaml | 17 - .../activity/activityTypes/models.yaml | 39 - .../src/api/components/activity/examples.yaml | 343 - .../src/api/components/activity/inputs.yaml | 33 - .../src/api/components/activity/models.yaml | 113 - .../src/api/components/activity/query.yaml | 48 - .../api/components/activity/responses.yaml | 51 - backend/src/api/components/auth.yaml | 5 - .../api/components/automation/examples.yaml | 42 - .../src/api/components/automation/inputs.yaml | 33 - .../src/api/components/automation/models.yaml | 199 - .../api/components/conversation/examples.yaml | 503 - .../api/components/conversation/inputs.yaml | 2 - .../api/components/conversation/models.yaml | 81 - .../src/api/components/member/examples.yaml | 503 - backend/src/api/components/member/inputs.yaml | 70 - .../memberAttributeSettings/examples.yaml | 32 - .../memberAttributeSettings/inputs.yaml | 21 - .../memberAttributeSettings/models.yaml | 52 - .../memberAttributeSettings/responses.yaml | 23 - backend/src/api/components/member/models.yaml | 75 - backend/src/api/components/member/query.yaml | 49 - .../src/api/components/member/responses.yaml | 94 - backend/src/api/components/note/examples.yaml | 100 - backend/src/api/components/note/inputs.yaml | 15 - backend/src/api/components/note/models.yaml | 22 - backend/src/api/components/note/query.yaml | 39 - .../src/api/components/note/responses.yaml | 53 - .../api/components/organization/examples.yaml | 141 - .../api/components/organization/inputs.yaml | 16 - .../api/components/organization/models.yaml | 116 - .../api/components/organization/query.yaml | 47 - .../components/organization/responses.yaml | 71 - backend/src/api/components/parameters.yaml | 70 - backend/src/api/components/tag/examples.yaml | 130 - backend/src/api/components/tag/models.yaml | 59 - backend/src/api/components/task/examples.yaml | 113 - backend/src/api/components/task/inputs.yaml | 52 - backend/src/api/components/task/models.yaml | 32 - backend/src/api/components/task/query.yaml | 39 - .../src/api/components/task/responses.yaml | 71 - backend/src/api/index.ts | 49 +- backend/src/api/note/index.ts | 12 - backend/src/api/note/noteAutocomplete.ts | 11 - backend/src/api/note/noteCreate.ts | 29 - backend/src/api/note/noteDestroy.ts | 29 - backend/src/api/note/noteFind.ts | 26 - backend/src/api/note/noteImport.ts | 13 - backend/src/api/note/noteList.ts | 11 - backend/src/api/note/noteQuery.ts | 31 - backend/src/api/note/noteUpdate.ts | 30 - backend/src/api/plan/index.ts | 7 - backend/src/api/plan/stripe/checkout.ts | 65 - backend/src/api/plan/stripe/portal.ts | 55 - backend/src/api/plan/stripe/webhook.ts | 61 - backend/src/api/tenant/index.ts | 2 - .../src/api/tenant/tenantDeleteSampleData.ts | 22 - .../api/tenant/tenantGenerateSampleData.ts | 32 - backend/src/api/webhooks/discourse.ts | 105 - backend/src/api/webhooks/github.ts | 49 - backend/src/api/webhooks/index.ts | 7 - backend/src/api/webhooks/sendgrid.ts | 10 - backend/src/api/webhooks/stripe.ts | 10 - backend/src/bin/discord-ws.ts | 302 - backend/src/bin/scripts/unleash-init.ts | 476 - backend/src/conf/configTypes.ts | 25 - backend/src/conf/index.ts | 6 - .../database/initializers/sample-data.json | 8655 ---------------- .../initializers/suggested-tasks.json | 26 - .../src/database/initializers/widgets.json | 9186 ----------------- backend/src/database/models/member.ts | 7 +- backend/src/database/models/note.ts | 6 - backend/src/database/models/tenant.ts | 27 - .../repositories/IRepositoryOptions.ts | 2 - .../__tests__/noteRepository.test.ts | 332 - .../__tests__/tenantRepository.test.ts | 26 - .../database/repositories/memberRepository.ts | 58 - .../database/repositories/noteRepository.ts | 380 - .../repositories/sequelizeRepository.ts | 18 +- .../database/repositories/tenantRepository.ts | 77 - .../src/database/utils/sequelizeTestUtils.ts | 16 +- backend/src/documentation/openapi.json | 5455 ---------- .../getFeatureFlagTenantContext.ts | 44 - backend/src/feature-flags/isFeatureEnabled.ts | 11 - backend/src/security/permissions.ts | 668 -- backend/src/security/plans.ts | 67 - .../workers/sendgridWebhookWorker.ts | 90 - .../workers/stripeWebhookWorker.ts | 146 - backend/src/services/IServiceOptions.ts | 2 - .../services/__tests__/tenantService.test.ts | 8 +- backend/src/services/memberService.ts | 53 +- backend/src/services/noteService.ts | 141 - backend/src/services/sampleDataService.ts | 323 - backend/src/services/slackCommandService.ts | 2 - backend/src/services/tenantService.ts | 46 +- .../user/__tests__/permissionChecker.test.ts | 53 - .../src/services/user/permissionChecker.ts | 25 - backend/src/services/user/userDestroyer.ts | 21 - backend/src/services/user/userEditor.ts | 5 - backend/src/types/unleashContext.ts | 7 - backend/src/types/webhooks.ts | 91 - backend/tsconfig.json | 6 +- backend/util/openapi.json | 1 - backend/util/publish-docs.sh | 3 - pnpm-lock.yaml | 597 +- scripts/builders/backend.env | 2 +- scripts/cli | 18 +- scripts/deploy/kubernetes/.backend.env | 6 - scripts/deploy/kubernetes/unleash-db.yaml | 36 - scripts/deploy/kubernetes/unleash.yaml | 58 - .../deploy/pre-built/scaffold-services.yaml | 39 - scripts/premium-scaffold.yaml | 47 - scripts/services/discord-ws.yaml | 64 - services/apps/cache_worker/package.json | 1 - .../src/activities/getTenantSegmentInfo.ts | 6 - .../config/custom-environment-variables.json | 4 - .../apps/data_sink_worker/config/default.json | 1 - services/apps/data_sink_worker/package.json | 1 - .../data_sink_worker/src/bin/erase-member.ts | 1 - .../apps/data_sink_worker/src/conf/index.ts | 11 - .../exports_worker/src/activities/members.ts | 2 - .../config/custom-environment-variables.json | 4 - .../config/default.json | 1 - .../apps/integration_run_worker/package.json | 1 - .../integration_run_worker/src/conf/index.ts | 10 - .../config/custom-environment-variables.json | 4 - .../config/default.json | 1 - .../integration_stream_worker/package.json | 1 - .../src/conf/index.ts | 11 - .../members_enrichment_worker/package.json | 1 - .../merge_suggestions_worker/package.json | 1 - .../src/activities/common.ts | 22 +- .../package.json | 1 - .../apps/script_executor_worker/package.json | 1 - .../config/custom-environment-variables.json | 4 - services/apps/webhook_api/config/default.json | 1 - services/apps/webhook_api/package.json | 1 - services/apps/webhook_api/src/conf/index.ts | 11 - services/archetypes/standard/package.json | 1 - services/archetypes/standard/src/index.ts | 23 - services/libs/common/src/i18n/en.ts | 4 - services/libs/common/src/i18n/es.ts | 3 - services/libs/common_services/package.json | 1 - .../data-access-layer/src/members/others.ts | 58 - .../old/apps/automations_worker/data.repo.ts | 31 - .../data-access-layer/src/others/index.ts | 16 +- services/libs/feature-flags/package.json | 21 - services/libs/feature-flags/src/index.ts | 101 - services/libs/feature-flags/tsconfig.json | 4 - services/libs/opensearch/package.json | 1 - .../libs/opensearch/src/models/members.ts | 7 - .../libs/opensearch/src/repo/member.data.ts | 1 - .../libs/opensearch/src/repo/member.repo.ts | 16 - .../src/service/member.search.service.ts | 9 +- .../service/organization.search.service.ts | 10 +- services/libs/types/src/enums/priorities.ts | 3 - services/libs/types/src/enums/tenants.ts | 34 - services/libs/types/src/index.ts | 2 - services/libs/types/src/merging.ts | 3 - 168 files changed, 143 insertions(+), 38511 deletions(-) delete mode 100644 backend/.openapirc.js delete mode 100644 backend/base.yaml delete mode 100644 backend/openapi.json delete mode 100644 backend/src/api/apiDocumentation.ts delete mode 100644 backend/src/api/components/activity/activityTypes/examples.yaml delete mode 100644 backend/src/api/components/activity/activityTypes/inputs.yaml delete mode 100644 backend/src/api/components/activity/activityTypes/models.yaml delete mode 100644 backend/src/api/components/activity/examples.yaml delete mode 100644 backend/src/api/components/activity/inputs.yaml delete mode 100644 backend/src/api/components/activity/models.yaml delete mode 100644 backend/src/api/components/activity/query.yaml delete mode 100644 backend/src/api/components/activity/responses.yaml delete mode 100644 backend/src/api/components/auth.yaml delete mode 100644 backend/src/api/components/automation/examples.yaml delete mode 100644 backend/src/api/components/automation/inputs.yaml delete mode 100644 backend/src/api/components/automation/models.yaml delete mode 100644 backend/src/api/components/conversation/examples.yaml delete mode 100644 backend/src/api/components/conversation/inputs.yaml delete mode 100644 backend/src/api/components/conversation/models.yaml delete mode 100644 backend/src/api/components/member/examples.yaml delete mode 100644 backend/src/api/components/member/inputs.yaml delete mode 100644 backend/src/api/components/member/memberAttributeSettings/examples.yaml delete mode 100644 backend/src/api/components/member/memberAttributeSettings/inputs.yaml delete mode 100644 backend/src/api/components/member/memberAttributeSettings/models.yaml delete mode 100644 backend/src/api/components/member/memberAttributeSettings/responses.yaml delete mode 100644 backend/src/api/components/member/models.yaml delete mode 100644 backend/src/api/components/member/query.yaml delete mode 100644 backend/src/api/components/member/responses.yaml delete mode 100644 backend/src/api/components/note/examples.yaml delete mode 100644 backend/src/api/components/note/inputs.yaml delete mode 100644 backend/src/api/components/note/models.yaml delete mode 100644 backend/src/api/components/note/query.yaml delete mode 100644 backend/src/api/components/note/responses.yaml delete mode 100644 backend/src/api/components/organization/examples.yaml delete mode 100644 backend/src/api/components/organization/inputs.yaml delete mode 100644 backend/src/api/components/organization/models.yaml delete mode 100644 backend/src/api/components/organization/query.yaml delete mode 100644 backend/src/api/components/organization/responses.yaml delete mode 100644 backend/src/api/components/parameters.yaml delete mode 100644 backend/src/api/components/tag/examples.yaml delete mode 100644 backend/src/api/components/tag/models.yaml delete mode 100644 backend/src/api/components/task/examples.yaml delete mode 100644 backend/src/api/components/task/inputs.yaml delete mode 100644 backend/src/api/components/task/models.yaml delete mode 100644 backend/src/api/components/task/query.yaml delete mode 100644 backend/src/api/components/task/responses.yaml delete mode 100644 backend/src/api/note/index.ts delete mode 100644 backend/src/api/note/noteAutocomplete.ts delete mode 100644 backend/src/api/note/noteCreate.ts delete mode 100644 backend/src/api/note/noteDestroy.ts delete mode 100644 backend/src/api/note/noteFind.ts delete mode 100644 backend/src/api/note/noteImport.ts delete mode 100644 backend/src/api/note/noteList.ts delete mode 100644 backend/src/api/note/noteQuery.ts delete mode 100644 backend/src/api/note/noteUpdate.ts delete mode 100644 backend/src/api/plan/index.ts delete mode 100644 backend/src/api/plan/stripe/checkout.ts delete mode 100644 backend/src/api/plan/stripe/portal.ts delete mode 100644 backend/src/api/plan/stripe/webhook.ts delete mode 100644 backend/src/api/tenant/tenantDeleteSampleData.ts delete mode 100644 backend/src/api/tenant/tenantGenerateSampleData.ts delete mode 100644 backend/src/api/webhooks/discourse.ts delete mode 100644 backend/src/api/webhooks/github.ts delete mode 100644 backend/src/api/webhooks/index.ts delete mode 100644 backend/src/api/webhooks/sendgrid.ts delete mode 100644 backend/src/api/webhooks/stripe.ts delete mode 100644 backend/src/bin/discord-ws.ts delete mode 100644 backend/src/bin/scripts/unleash-init.ts delete mode 100644 backend/src/database/initializers/sample-data.json delete mode 100644 backend/src/database/initializers/suggested-tasks.json delete mode 100644 backend/src/database/initializers/widgets.json delete mode 100644 backend/src/database/repositories/__tests__/noteRepository.test.ts delete mode 100644 backend/src/database/repositories/noteRepository.ts delete mode 100644 backend/src/documentation/openapi.json delete mode 100644 backend/src/feature-flags/getFeatureFlagTenantContext.ts delete mode 100644 backend/src/feature-flags/isFeatureEnabled.ts delete mode 100644 backend/src/security/plans.ts delete mode 100644 backend/src/serverless/integrations/workers/sendgridWebhookWorker.ts delete mode 100644 backend/src/serverless/integrations/workers/stripeWebhookWorker.ts delete mode 100644 backend/src/services/noteService.ts delete mode 100644 backend/src/services/sampleDataService.ts delete mode 100644 backend/src/services/user/__tests__/permissionChecker.test.ts delete mode 100644 backend/src/types/unleashContext.ts delete mode 100644 backend/src/types/webhooks.ts delete mode 100644 backend/util/openapi.json delete mode 100644 backend/util/publish-docs.sh delete mode 100644 scripts/deploy/kubernetes/unleash-db.yaml delete mode 100644 scripts/deploy/kubernetes/unleash.yaml delete mode 100644 scripts/premium-scaffold.yaml delete mode 100644 scripts/services/discord-ws.yaml delete mode 100644 services/libs/feature-flags/package.json delete mode 100644 services/libs/feature-flags/src/index.ts delete mode 100644 services/libs/feature-flags/tsconfig.json delete mode 100644 services/libs/types/src/enums/tenants.ts diff --git a/backend/.env.dist.local b/backend/.env.dist.local index 2cc3409ab6..652f8e81b9 100755 --- a/backend/.env.dist.local +++ b/backend/.env.dist.local @@ -75,14 +75,6 @@ CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS= CROWD_SENDGRID_TEMPLATE_INTEGRATION_DONE= CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID= -# Stripe settings -CROWD_STRIPE_PRICE_PREMIUM= -CROWD_STRIPE_PRICE_ENTERPRISE= -CROWD_STRIPE_SECRET_KEY= -CROWD_STRIPE_WEBHOOK_SIGNING_SECRET= -CROWD_STRIPE_EAGLE_EYE_PLAN_PRODUCT_ID= -CROWD_STRIPE_GROWTH_PLAN_PRODUCT_ID= - # Twitter settings CROWD_TWITTER_CLIENT_ID= CROWD_TWITTER_CLIENT_SECRET= @@ -143,17 +135,6 @@ CROWD_EAGLE_EYE_API_KEY= # Slack alerting settings CROWD_SLACK_ALERTING_URL= -# Unleash settings -CROWD_UNLEASH_URL= -CROWD_UNLEASH_ADMIN_API_KEY= -CROWD_UNLEASH_FRONTEND_API_KEY= -CROWD_UNLEASH_BACKEND_API_KEY= -CROWD_UNLEASH_DB_HOST= -CROWD_UNLEASH_DB_PORT= -CROWD_UNLEASH_DB_USERNAME= -CROWD_UNLEASH_DB_PASSWORD= -CROWD_UNLEASH_DB_DATABASE= - # Weekly emails settings CROWD_WEEKLY_EMAILS_ENABLED="true" diff --git a/backend/.openapirc.js b/backend/.openapirc.js deleted file mode 100644 index 3f9aead4ac..0000000000 --- a/backend/.openapirc.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - extension: ['.js', '.cjs', '.mjs', '.ts', '.tsx', '.jsx', '.yaml', '.yml'], - include: ['**'], - exclude: [ - 'coverage/**', - 'packages/*/test{,s}/**', - '**/docker/**', - '**/serverless/**', - '**/*.d.ts', - 'test{,s}/**', - 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}', - '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}', - '**/__tests__/**', - '**/{ava,babel,nyc}.config.{js,cjs,mjs}', - '**/jest.config.{js,cjs,mjs,ts}', - '**/{karma,rollup,webpack}.config.js', - '**/.{eslint,mocha}rc.{js,cjs}', - '**/.{travis,yarnrc}.yml', - '**/{docker-compose}.yml', - ], - excludeNodeModules: true, - verbose: true, - throwLevel: 'off', -} diff --git a/backend/base.yaml b/backend/base.yaml deleted file mode 100644 index bcc964aa72..0000000000 --- a/backend/base.yaml +++ /dev/null @@ -1,33 +0,0 @@ -openapi: 3.0.3 -info: - title: crowd.dev API - version: 1.0.5 - description: > - crowd.dev API - contact: - email: joan@crowd.dev - license: - name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html - x-github: https://github.com/crowdHQ - -servers: - - url: https://app.crowd.dev/api - -tags: - - name: Members - description: Everything about members - - name: Member Attributes - description: Settings for member's attributes - - name: Activities - description: Everything about activities - - name: Organizations - description: Everything about organizations - - name: Conversations - description: Everything about conversations - - name: Tags - description: Everything about tags - - name: Automations - description: Everything about automations - - name: Notes - description: Everything about notes diff --git a/backend/config/custom-environment-variables.json b/backend/config/custom-environment-variables.json index 5a62cf1c8b..666581c176 100644 --- a/backend/config/custom-environment-variables.json +++ b/backend/config/custom-environment-variables.json @@ -81,14 +81,6 @@ "templateEagleEyeDigest": "CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST", "weeklyAnalyticsUnsubscribeGroupId": "CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID" }, - "plans": { - "stripePricePremium": "CROWD_STRIPE_PRICE_PREMIUM", - "stripePriceEnterprise": "CROWD_STRIPE_PRICE_ENTERPRISE", - "stripeSecretKey": "CROWD_STRIPE_SECRET_KEY", - "stripWebhookSigningSecret": "CROWD_STRIPE_WEBHOOK_SIGNING_SECRET", - "stripeEagleEyePlanProductId": "CROWD_STRIPE_EAGLE_EYE_PLAN_PRODUCT_ID", - "stripeGrowthPlanProductId": "CROWD_STRIPE_GROWTH_PLAN_PRODUCT_ID" - }, "twitter": { "clientId": "CROWD_TWITTER_CLIENT_ID", "clientSecret": "CROWD_TWITTER_CLIENT_SECRET", @@ -169,22 +161,6 @@ "slackAlerting": { "url": "CROWD_SLACK_ALERTING_URL" }, - "sampleData": { - "tenantId": "CROWD_SAMPLE_DATA_TENANT_ID" - }, - "unleash": { - "url": "CROWD_UNLEASH_URL", - "adminApiKey": "CROWD_UNLEASH_ADMIN_API_KEY", - "frontendApiKey": "CROWD_UNLEASH_FRONTEND_API_KEY", - "backendApiKey": "CROWD_UNLEASH_BACKEND_API_KEY", - "db": { - "host": "CROWD_UNLEASH_DB_HOST", - "port": "CROWD_UNLEASH_DB_PORT", - "username": "CROWD_UNLEASH_DB_USERNAME", - "password": "CROWD_UNLEASH_DB_PASSWORD", - "database": "CROWD_UNLEASH_DB_DATABASE" - } - }, "weeklyEmails": { "enabled": "CROWD_WEEKLY_EMAILS_ENABLED" }, diff --git a/backend/config/default.json b/backend/config/default.json index e13ef80f6d..d6f5ccad63 100644 --- a/backend/config/default.json +++ b/backend/config/default.json @@ -20,7 +20,6 @@ "clearbit": {}, "netlify": {}, "sendgrid": {}, - "plans": {}, "twitter": { "maxRetrospectInSeconds": 7380, "limitResetFrequencyDays": 30 @@ -40,9 +39,6 @@ "organizationEnrichment": {}, "eagleEye": {}, "githubToken": {}, - "unleash": { - "db": {} - }, "slackAlerting": { "url": "" }, diff --git a/backend/openapi.json b/backend/openapi.json deleted file mode 100644 index a7a02745ed..0000000000 --- a/backend/openapi.json +++ /dev/null @@ -1,5852 +0,0 @@ -{ - "openapi": "3.0.3", - "info": { - "title": "crowd.dev API", - "version": "1.0.5", - "description": "crowd.dev API\n", - "contact": { "email": "joan@crowd.dev" }, - "license": { "name": "Apache 2.0", "url": "http://www.apache.org/licenses/LICENSE-2.0.html" }, - "x-github": "https://github.com/crowdHQ" - }, - "servers": [{ "url": "https://app.crowd.dev/api" }], - "paths": { - "/tenant/{tenantId}/activity/with-member": { - "post": { - "summary": "Create or update an activity with a member", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Create or update an activity with a member\nActivity existence is checked by sourceId and tenantId\nMember existence is checked by platform and username", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityUpsertWithMemberInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity": { - "post": { - "summary": "Create or update an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Create or update an activity. Existence is checked by sourceId and tenantId", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity/{id}": { - "delete": { - "summary": "Delete an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Delete a activity given an ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Find a single activity by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityResponse" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Update an activity given an ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity/query": { - "post": { - "summary": "Query activities", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Query activities. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityList" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation": { - "post": { - "summary": "Create an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Create a new automation for the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationCreateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List automations", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get all existing automation data for tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[type]", - "in": "query", - "description": "Filter by type of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[trigger]", - "in": "query", - "description": "Filter by trigger type of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[state]", - "in": "query", - "description": "Filter by state of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationPage" }, - "examples": { "AutomationPage": { "$ref": "#/components/examples/AutomationPage" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation/{automationId}": { - "delete": { - "summary": "Destroy an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Destroys an existing automation in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to update", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "204": { "description": "Ok - No content" }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get an existing automation data in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to find", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Updates an existing automation in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to update", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationUpdateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation/{automationId}/executions": { - "get": { - "summary": "Get automation history", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get all automation execution history for tenant and automation", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "How many elements from the beginning would you like to skip", - "required": false, - "schema": { "type": "integer", "default": 0 } - }, - { - "name": "limit", - "in": "query", - "description": "How many elements would you like to fetch", - "required": false, - "schema": { "type": "integer", "default": 10 } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationExecutionPage" }, - "examples": { - "AutomationExecutionPage": { - "$ref": "#/components/examples/AutomationExecutionPage" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/conversation": { - "post": { - "summary": "Create a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Create a conversation.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ConversationNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List conversations", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Get a list of conversations with filtering, sorting and offsetting.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[title]", - "in": "query", - "description": "Filter by the title of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[slug]", - "in": "query", - "description": "Filter by the slug of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[published]", - "in": "query", - "description": "Filter by whether it is published or not.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[platform]", - "in": "query", - "description": "Filter by the platform of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[channel]", - "in": "query", - "description": "Filter by the channel of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activitiesCountRange]", - "in": "query", - "description": "activitiesCount lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "Send this parameter twice with [min] and [max].", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default timestamp_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/ConversationSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ConversationList" }, - "examples": { - "Conversations": { "$ref": "#/components/examples/ConversationList" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/conversation/{id}": { - "delete": { - "summary": "Delete a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Delete a conversation.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Find a conversation by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID.", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation.", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Update a conversation given an ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ConversationNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/active": { - "get": { - "summary": "List active members", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "List active members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[platforms]", - "in": "query", - "description": "Filter by activity platforms (comma separated list without spaces)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[isTeamMember]", - "in": "query", - "description": "If true we will return just team members, if false we will return just non-team members, if undefined we will return both.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[isBot]", - "in": "query", - "description": "If true we will return just members who are bots, if false we will return just non-bot members, if undefined we will return both.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[isOrganization]", - "in": "query", - "description": "If true we will return just members who are organizations (such as linkedin organizations that post), if false we will return just non-organization members, if undefined we will return both.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activityTimestampFrom]", - "in": "query", - "description": "Filter by activity timestamp from (required)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activityTimestampTo]", - "in": "query", - "description": "Filter by activity timestamp to (required)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activityIsContribution]", - "in": "query", - "description": "Filter by activities that are contributions", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "How to sort results. Available values: activityCount_DESC, activityCount_ASC, activeDaysCount_DESC, activeDaysCount_ASC (default activityCount_DESC)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 20.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member": { - "post": { - "summary": "Create or update a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Create or update a member. Existence is checked by platform and username.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Member" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/{id}": { - "delete": { - "summary": "Delete a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Delete a member given an ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Find a single member by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberResponse" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Update a member", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberUpdateInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Member" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/export": { - "post": { - "summary": "Export members as CSV", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Export members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberQuery" } } - } - }, - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/query": { - "post": { - "summary": "Query members", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Query members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberList" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note": { - "post": { - "summary": "Create a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Create a note", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Note" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note/{id}": { - "delete": { - "summary": "Delete a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Delete a note.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Find a note by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID.", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note.", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/NoteResponse" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Update a note", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Note" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note/query": { - "post": { - "summary": "Query notes", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Query notes. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/NoteList" }, - "examples": { "Note": { "$ref": "#/components/examples/NoteList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization": { - "post": { - "summary": "Create a organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Create a organization", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Organization" }, - "examples": { - "Organization": { "$ref": "#/components/examples/OrganizationCreate" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization/{id}": { - "delete": { - "summary": "Delete a organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Delete a organization.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Find an organization by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/OrganizationResponse" }, - "examples": { "Organization": { "$ref": "#/components/examples/Organization" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Update a organization", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Organization" }, - "examples": { - "Organization": { "$ref": "#/components/examples/OrganizationCreate" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization/query": { - "post": { - "summary": "Query organizations", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Query organizations. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/OrganizationList" }, - "examples": { "Organization": { "$ref": "#/components/examples/OrganizationList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/activity/types": { - "post": { - "summary": "Create an activity type", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Create a custom activity type", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityTypesCreateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityTypes" }, - "examples": { "ActivityTypes": { "$ref": "#/components/examples/ActivityTypes" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List all activity types", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "List all activity types", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityTypes" }, - "examples": { "ActivityTypes": { "$ref": "#/components/examples/ActivityTypes" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/activity/types/{key}": { - "put": { - "summary": "Update an activity type", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Update a custom activity type", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "key", - "in": "path", - "description": "The key of the activity type", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityTypesUpdateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityTypes" }, - "examples": { "ActivityTypes": { "$ref": "#/components/examples/ActivityTypes" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/members/attributes": { - "post": { - "summary": "Attribute settings: create", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Create a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsCreateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "delete": { - "summary": "Attribute settings: delete", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Delete a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "query", - "description": "Id to destroy", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Attributes settings: list", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Get a list of members' attribute settings", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[label]", - "in": "query", - "description": "Filter by label of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[name]", - "in": "query", - "description": "Filter by name of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[type]", - "in": "query", - "description": "Filter by type of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[canDelete]", - "in": "query", - "description": "Filter by canDelete: \"true\" or \"false\"", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[show]", - "in": "query", - "description": "Filter by show: \"true\" or \"false\"", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "CreatedAt lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default createdAt_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsList" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettingsList" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/members/attributes/{id}": { - "get": { - "summary": "Attributes settings: find", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Find a single members' attribute setting by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member attribute's settings", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Attribute settings: update", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Update a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member attribute settings", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsUpdateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/tag": { - "post": { - "summary": "Create a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Create a tag", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TagNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List tags", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Get a list of tags with filtering, sorting and offsetting.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[name]", - "in": "query", - "description": "Filter by the name of the tag.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "Created at lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default timestamp_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/TagSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TagList" }, - "examples": { "Tags": { "$ref": "#/components/examples/TagList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/tag/{id}": { - "delete": { - "summary": "Delete a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Delete a tag.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Find a tag by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Update a tag", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TagNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/batch": { - "post": { - "summary": "Make batch operations on tasks", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Make batch operations on tasks", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskBatchInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskFindAndUpdateAll" }, - "examples": { "Task": { "$ref": "#/components/examples/TaskFindAndUpdateAll" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task": { - "post": { - "summary": "Create a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Create a task", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Task" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/{id}": { - "delete": { - "summary": "Delete a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Delete a task.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Find a task by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskResponse" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Update a task", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Task" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/query": { - "post": { - "summary": "Query tasks", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Query tasks. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskList" }, - "examples": { "Task": { "$ref": "#/components/examples/TaskList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/enrichment/member/{id}": { - "put": { - "summary": "Enrich a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Enrich a member.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberResponse" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - } - }, - "components": { - "securitySchemes": { "Bearer": { "type": "http", "scheme": "bearer" } }, - "schemas": { - "MemberType": { "type": "string", "enum": ["member"] }, - "MemberScore": { "type": "integer", "minimum": -1, "maximum": 10 }, - "MemberSort": { - "type": "string", - "enum": [ - "activitiesCount_ASC", - "activitiesCount_DESC", - "score_ASC", - "score_ASC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC" - ] - }, - "ActivitySort": { - "type": "string", - "enum": [ - "timestamp_DESC", - "timestamp_ASC", - "createdAt_DESC", - "createdAt_ASC", - "score_DESC", - "score_ASC", - "type_DESC", - "type_ASC", - "platform_DESC", - "platform_ASC", - "createdBy_DESC", - "createdBy_ASC" - ] - }, - "ConversationSort": { - "type": "string", - "enum": [ - "createdAt_DESC", - "createdAt_ASC", - "activityCount_DESC", - "activityCount_ASC", - "platform_DESC", - "platform_ASC", - "channel_DESC", - "channel_ASC", - "createdBy_DESC", - "createdBy_ASC" - ] - }, - "TagSort": { - "type": "string", - "enum": ["name_ASC", "name_DESC", "createdAt_DESC", "createdAt_ASC"] - }, - "MemberAttributeSettingsSort": { - "type": "string", - "enum": [ - "label_ASC", - "label_DESC", - "type_ASC", - "type_DESC", - "createdAt_DESC", - "createdAt_ASC" - ] - }, - "ActivityRelationsInput": { - "description": "Relations of an activity.", - "type": "object", - "properties": { - "tasks": { - "description": "Tasks associated with the activity", - "type": "array", - "items": { "$ref": "#/components/schemas/TaskNoId" } - } - } - }, - "ActivityUpsertInput": { - "required": ["memberId"], - "description": "An activity performed by a member of your community. The member is sent as an ID.", - "allOf": [ - { "$ref": "#/components/schemas/ActivityNoId" }, - { "$ref": "#/components/schemas/ActivityRelationsInput" } - ], - "properties": { - "memberId": { "description": "The ID of the member that performed the activity" } - } - }, - "ActivityUpsertWithMemberInput": { - "type": "object", - "description": "An activity performed by a member of your community. The member is sent as a whole object.", - "allOf": [ - { "$ref": "#/components/schemas/ActivityNoId" }, - { "$ref": "#/components/schemas/ActivityRelationsInput" } - ], - "properties": { "member": { "$ref": "#/components/schemas/MemberNoId" } } - }, - "ActivityNoId": { - "description": "An activity performed by a member of your community.", - "type": "object", - "required": ["type", "platform", "timestamp", "sourceId"], - "properties": { - "type": { "description": "Type of activity", "type": "string" }, - "timestamp": { - "description": "Date and time when the activity took place", - "type": "string", - "format": "date-time" - }, - "platform": { - "description": "Platform on which the activity took place", - "type": "string" - }, - "title": { "description": "Title of the activity", "type": "string" }, - "body": { "description": "Body of the activity", "type": "string" }, - "channel": { "description": "Channel of the activity", "type": "string" }, - "sentiment": { - "description": "Sentiment of the activity", - "type": "object", - "properties": { - "sentiment": { - "description": "Default sentiment score.
Computed by mapping (positive - negative) from 0 to 100", - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "label": { - "description": "Sentiment label", - "type": "string", - "enum": ["positive", "negative", "neutral", "mixed"] - }, - "positive": { - "description": "Positive sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "negative": { - "description": "Negative sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "neutral": { - "description": "Neutral sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "mixed": { - "description": "Mixed sentiment score. Mixed contains both positive and negative sentiments", - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "sourceId": { - "description": "The id of the activity in the platform (e.g. the id of the message in Discord)", - "type": "string" - }, - "sourceParentId": { - "description": "The id of the parent activity in the platform (e.g. the id of the parent message in Discord)", - "type": "string" - }, - "parentId": { - "description": "Id of the parent activity, if the activity has a parent", - "type": "string", - "format": "uuid" - }, - "score": { "description": "Score associated with the activity", "type": "number" }, - "isContribution": { - "description": "Whether the activity was a contribution", - "type": "boolean" - }, - "attributes": { - "description": "Extra attributes of the activity", - "type": "object", - "additionalProperties": true - }, - "createdAt": { - "description": "Date the activity was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the activity was last updated", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "ActivityNoId" } - }, - "FilterType": { - "type": "object", - "additionalProperties": { - "oneOf": [{ "type": "string" }, { "$ref": "#/components/schemas/FilterType" }] - } - }, - "ActivityQuery": { - "description": "All the parameters you can use to query activitys.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "activitiesCount_DESC", - "score_ASC", - "score_ASC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Activity": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/ActivityNoId" }], - "properties": { "id": { "description": "The unique identifier for an activity." } } - }, - "ActivityRelationsResponse": { - "description": "Relations of an activity.", - "type": "object", - "properties": { - "member": { - "description": "Member that performed the activity", - "$ref": "#/components/schemas/Member" - }, - "tasks": { - "description": "Tasks associated with the activity.", - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - } - } - }, - "ActivityResponse": { - "description": "An activity performed by a member.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Activity" }, - { "$ref": "#/components/schemas/ActivityRelationsResponse" } - ] - }, - "ActivityList": { - "description": "List and count of activities.", - "type": "object", - "properties": { - "rows": { - "description": "List of activities", - "type": "array", - "items": { "$ref": "#/components/schemas/ActivityResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "ActivitiesList" } - }, - "AutomationCreateInput": { - "type": "object", - "description": "Data to create a new automation.", - "required": ["type", "trigger", "settings"], - "properties": { - "type": { "$ref": "#/components/schemas/AutomationType" }, - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" } - } - }, - "AutomationUpdateInput": { - "type": "object", - "description": "Data to update an existing automation.", - "required": ["trigger", "settings", "state"], - "properties": { - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" }, - "state": { "$ref": "#/components/schemas/AutomationState" } - } - }, - "AutomationType": { "description": "Automation type", "type": "string", "enum": ["webhook"] }, - "AutomationState": { - "description": "Automation state", - "type": "string", - "enum": ["active", "disabled"] - }, - "AutomationTrigger": { - "description": "What will trigger an automation", - "type": "string", - "enum": ["new_activity", "new_member"] - }, - "AutomationExecutionState": { - "description": "What was the state of the automation execution", - "type": "string", - "enum": ["success", "error"] - }, - "WebhookAutomationSettings": { - "description": "Settings used by automation with type webhook", - "type": "object", - "required": ["url"], - "properties": { - "url": { "description": "URL to POST webhook data to", "type": "string", "format": "uri" } - } - }, - "NewActivityAutomationSettings": { - "description": "Settings used by automation that is triggered by new activities", - "type": "object", - "required": ["types", "platforms", "keywords", "teamMemberActivities"], - "properties": { - "types": { - "description": "If activity type matches any of these we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "platforms": { - "description": "If activity came from any of these platforms we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "keywords": { - "description": "If activity content contains any of these keywords we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "teamMemberActivities": { - "description": "If activity came from any of our team members - should we trigger automation or not?", - "type": "boolean" - } - } - }, - "AutomationSettings": { - "description": "Settings based on automation type and trigger - you need to provide union object of both automation type based settings and trigger based settings", - "type": "object", - "anyOf": [ - { "$ref": "#/components/schemas/WebhookAutomationSettings" }, - { "$ref": "#/components/schemas/NewActivityAutomationSettings" } - ] - }, - "Automation": { - "type": "object", - "required": ["id", "type", "tenantId", "trigger", "settings", "state", "createdAt"], - "properties": { - "id": { "description": "Automation unique ID", "type": "string", "format": "uuid" }, - "type": { "$ref": "#/components/schemas/AutomationType" }, - "tenantId": { - "description": "Automation tenant unique ID", - "type": "string", - "format": "uuid" - }, - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" }, - "state": { "$ref": "#/components/schemas/AutomationState" }, - "createdAt": { - "description": "When was automation created", - "type": "string", - "format": "date-time" - }, - "lastExecutionAt": { - "description": "When was automation last executed", - "type": "string", - "format": "date-time" - }, - "lastExecutionState": { - "description": "State of the last automation execution", - "$ref": "#/components/schemas/AutomationExecutionState" - }, - "lastExecutionError": { - "description": "Error information if last automation execution failed", - "type": "object" - } - } - }, - "AutomationPage": { - "type": "object", - "required": ["rows", "count", "offset", "limit"], - "properties": { - "rows": { - "description": "Array of automations that were fetched", - "type": "array", - "items": { "$ref": "#/components/schemas/Automation" } - }, - "count": { "description": "How many total automations there are", "type": "integer" }, - "offset": { - "description": "What offset was used when preparing this response", - "type": "integer" - }, - "limit": { - "description": "What limit was used when preparing this response", - "type": "integer" - } - } - }, - "AutomationExecution": { - "type": "object", - "required": ["id", "automationId", "state", "executedAt", "eventId", "payload"], - "properties": { - "id": { - "description": "Automation execution unique ID", - "type": "string", - "format": "uuid" - }, - "automationId": { - "description": "Automation unique ID", - "type": "string", - "format": "uuid" - }, - "state": { - "description": "Automation execution state", - "$ref": "#/components/schemas/AutomationExecutionState" - }, - "error": { - "description": "If execution was not successful this object will contain error information", - "type": "object" - }, - "executedAt": { - "description": "Automation execution timestamp", - "type": "string", - "format": "date-time" - }, - "eventId": { - "description": "Unique ID of the event that triggered this automation execution.", - "type": "string" - }, - "payload": { - "description": "Payload that was sent when this execution was processed", - "type": "object" - } - } - }, - "AutomationExecutionPage": { - "type": "object", - "required": ["rows", "count", "offset", "limit"], - "properties": { - "rows": { - "description": "Automation Execution List", - "type": "array", - "items": { "$ref": "#/components/schemas/AutomationExecution" } - }, - "count": { "description": "How many items are there in total", "type": "integer" }, - "offset": { - "description": "What offset was used when preparing this response", - "type": "integer" - }, - "limit": { - "description": "What limit was used when preparing this response", - "type": "integer" - } - } - }, - "ConversationNoId": { - "type": "object", - "required": ["platform", "slug", "tenantId"], - "description": "A conversation is a group of activities. Some attributes, like slug, are mostly used in public pages.", - "properties": { - "title": { "description": "Title of the conversation", "type": "string" }, - "slug": { "description": "Unique slug of the conversation", "type": "string" }, - "published": { - "description": "Whether the conversation is publicaly visible from open pages.", - "type": "boolean", - "default": false - }, - "conversationStarter": { - "description": "The conversation starter activity", - "type": "object", - "additionalProperties": { "$ref": "#/components/schemas/Activity" } - }, - "memberCount": { - "description": "Number of participating members in the conversation.", - "type": "integer" - }, - "lastActive": { - "description": "Last activity time in the conversation", - "type": "string", - "format": "date-time" - }, - "createdAt": { - "description": "Date the conversation was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the conversation was last updated", - "type": "string", - "format": "date-time" - }, - "tenantId": { - "description": "Your workspace/tenant id", - "type": "string", - "format": "uuid" - } - }, - "xml": { "name": "Conversation" } - }, - "Conversation": { - "allOf": [{ "$ref": "#/components/schemas/ConversationNoId" }], - "properties": { - "id": { "description": "Unique identifier of the conversation", "type": "string" }, - "activities": { - "description": "List of IDs of the activities in the conversation", - "type": "array", - "items": { "type": "string" } - } - } - }, - "ConversationList": { - "type": "object", - "properties": { - "rows": { "type": "array", "items": { "$ref": "#/components/schemas/Conversation" } }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - } - }, - "MemberPlatformHelper": { - "type": "object", - "required": ["platform"], - "properties": { - "platform": { - "type": "string", - "description": "Platform for which to check member existence." - } - } - }, - "MemberOrganizations": { - "type": "object", - "properties": { - "organizations": { - "description": "Organizations associated with the member. Each element in the array is the name of the organization, or an organization object. If the organization does not exist, it will be created.", - "type": "array", - "items": { "$ref": "#/components/schemas/OrganizationNoId" } - } - } - }, - "MemberOrganizationsUpdate": { - "type": "object", - "properties": { - "organizations": { - "description": "Organizations associated with the member. Each element in the array is the name of the organization, or an organization object. If the organization does not exist, it will be created.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "MemberInputRelations": { - "type": "object", - "properties": { - "tags": { - "description": "Tags associated with the member. Each element in the array is the ID of the tag.", - "type": "array", - "items": { "type": "string" } - }, - "tasks": { - "description": "Tasks associated with the member. Each element in the array is the ID of the task.", - "type": "array", - "items": { "type": "string" } - }, - "notes": { - "description": "Notes associated with the member. Each element in the array is the ID of the note.", - "type": "array", - "items": { "type": "string" } - }, - "activities": { - "description": "Activities associated with the member. Each element in the array is the ID of the activity.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "MemberUpsertInput": { - "allOf": [ - { "$ref": "#/components/schemas/MemberPlatformHelper" }, - { "$ref": "#/components/schemas/MemberNoId" }, - { "$ref": "#/components/schemas/MemberOrganizations" }, - { "$ref": "#/components/schemas/MemberInputRelations" } - ] - }, - "MemberUpdateInput": { - "allOf": [ - { "$ref": "#/components/schemas/MemberPlatformHelper" }, - { "$ref": "#/components/schemas/MemberNoId" }, - { "$ref": "#/components/schemas/MemberInputRelations" }, - { "$ref": "#/components/schemas/MemberOrganizationsUpdate" } - ] - }, - "MemberNoId": { - "description": "A member of your community.", - "type": "object", - "required": ["username"], - "properties": { - "username": { - "description": "Usernames of the member in each platform. Exactly one for each platform in which the member is active.
Example: ```{ github: 'iamgilfoyle', discord: 'gilfoyle '}```", - "type": "object", - "additionalProperties": true - }, - "displayName": { "description": "UI friendly name of the member", "type": "string" }, - "emails": { - "description": "Email addresses of the member", - "type": "array", - "items": { "type": "string" } - }, - "joinedAt": { - "description": "Date of joining the community", - "type": "string", - "format": "date-time" - }, - "score": { - "description": "Engagement score of the member. From 0 to 10. Set -1 for not yet calculated.", - "type": "number" - }, - "reach": { - "description": "Reach of the member in each platform. At most one for each platform in which the member is active.
Example: ```{ github: 10, twitter: 250, total: 260 }```", - "type": "object", - "properties": { - "total": { "description": "Sum of all the platform reaches.", "type": "number" } - }, - "additionalProperties": true - }, - "attributes": { - "description": "Attributes associated to the member. Each attribute must be an object with it's value for each platform, and a default.
For example: ```{\"location\": {\"github\": \"San Francisco\", \"twitter\": \"California\", \"default\": \"San Francisco\"}}```", - "type": "object", - "additionalProperties": { "$ref": "#/components/schemas/MemberAttribute" } - }, - "createdAt": { - "description": "Date the member was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the member was last updated", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Member" } - }, - "MemberAttribute": { - "description": "A key for each platform.
- ```default``` is the value that will be displayed by default in the app
- ```custom``` is the value that will be displayed if the user has set a custom value for the attribute", - "type": "object", - "properties": { - "default": { - "description": "Default value for the attribute. This is set automatically according to crowd.dev rules.", - "type": "string" - }, - "custom": { - "description": "Custom value for the attribute. This is optionally set by the user. It will always be picked as the default when sent.", - "type": "string" - } - }, - "additionalProperties": true - }, - "MemberQuery": { - "description": "All the parameters you can use to query members.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "activityCount_ASC", - "activityCount_DESC", - "score_ASC", - "score_DESC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Member": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/MemberNoId" }], - "properties": { - "id": { "description": "The unique identifier for a member of your community." }, - "activityCount": { - "description": "Number of activities performed by the member.", - "type": "integer" - }, - "lastActivity": { - "description": "Timestamp, type and platform of the last activity performed by the member.", - "type": "object", - "properties": { - "type": { "description": "Type of the last activity", "type": "string" }, - "timestamp": { - "description": "Date and time of the last activity", - "type": "string", - "format": "date-time" - }, - "platform": { "description": "Platform of the last activity", "type": "string" } - } - }, - "averageSentiment": { - "description": "Average sentiment of the member. From 0 to 100.", - "type": "number" - }, - "identities": { - "description": "List of platforms the member has identities in.", - "type": "array", - "items": { "type": "string" } - }, - "activeOn": { - "description": "List of platforms the member is active on.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "MemberRelationsResponse": { - "description": "Relations of a member.", - "type": "object", - "properties": { - "tags": { - "description": "Tags associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Tag" } - }, - "notes": { - "description": "Notes associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Note" } - }, - "tasks": { - "description": "Tasks associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - }, - "organizations": { - "description": "Organizations associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Organization" } - } - } - }, - "MemberResponse": { - "description": "A member of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Member" }, - { "$ref": "#/components/schemas/MemberRelationsResponse" } - ] - }, - "MemberList": { - "description": "List and count of members.", - "type": "object", - "properties": { - "rows": { - "description": "List of members", - "type": "array", - "items": { "$ref": "#/components/schemas/MemberResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "MembersList" } - }, - "NoteInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the note. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "NoteInput": { - "allOf": [ - { "$ref": "#/components/schemas/NoteNoId" }, - { "$ref": "#/components/schemas/NoteInputRelations" } - ] - }, - "NoteNoId": { - "description": "A created note.", - "type": "object", - "properties": { - "body": { "description": "The body of the note.", "type": "string", "format": "blob" }, - "createdAt": { - "description": "Date the note was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the note was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Note" } - }, - "NoteQuery": { - "description": "All the parameters you can use to query notes.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { "type": "string", "enum": ["createdAt_ASC", "createdAt_DESC"] }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Note": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/NoteNoId" }], - "properties": { - "id": { "description": "The ID of the note." }, - "body": { "description": "The body of the note.", "type": "string", "format": "blob" } - } - }, - "NoteRelationsResponse": { - "description": "Relations of a note.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the note.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - } - } - }, - "NoteResponse": { - "description": "A note of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Note" }, - { "$ref": "#/components/schemas/NoteRelationsResponse" } - ] - }, - "NoteList": { - "description": "List and count of notes.", - "type": "object", - "properties": { - "rows": { - "description": "List of notes", - "type": "array", - "items": { "$ref": "#/components/schemas/NoteResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "NotesList" } - }, - "OrganizationInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the organization. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - } - } - }, - "OrganizationInput": { - "allOf": [ - { "$ref": "#/components/schemas/OrganizationNoId" }, - { "$ref": "#/components/schemas/OrganizationInputRelations" } - ] - }, - "OrganizationNoId": { - "description": "A created organization.", - "type": "object", - "required": ["name"], - "properties": { - "name": { "description": "The name of the organization.", "type": "string" }, - "url": { "description": "The URL of the organization.", "type": "string" }, - "description": { - "description": "A short description of the organization.", - "type": "string", - "format": "blob" - }, - "logo": { "description": "A URL for logo of the organization.", "type": "string" }, - "emails": { - "description": "The emails for contacting the organization.", - "type": "array", - "items": { "type": "string" } - }, - "phoneNumbers": { - "description": "The phone numbers for contacting for the organization.", - "type": "array", - "items": { "type": "string" } - }, - "parentUrl": { - "description": "The URL of the parent organization if it has one (for example if it has been acquired).", - "type": "string" - }, - "tags": { - "description": "Tags associated with the organization.", - "type": "array", - "items": { "type": "string" } - }, - "twitter": { - "description": "Twitter information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The Twitter handle for the organization.", - "type": "string" - }, - "id": { "description": "The Twitter ID for the organization.", "type": "string" }, - "bio": { "description": "The Twitter bio for the organization.", "type": "string" }, - "followers": { - "description": "The number of followers on Twitter.", - "type": "integer" - }, - "location": { - "description": "The Twitter location for the organization.", - "type": "string" - }, - "site": { - "description": "The website linked to the organization's Twitter profile.", - "type": "string" - }, - "avatar": { - "description": "The URL for the organization's Twitter avatar.", - "type": "string" - } - } - }, - "employees": { - "description": "The number of employees of the organization.", - "type": "integer" - }, - "revenueRange": { - "description": "The estimated revenue range of the organization.", - "type": "object", - "properties": { - "min": { - "description": "The minimum estimated revenue of the organization.", - "type": "integer" - }, - "max": { - "description": "The maximum estimated revenue of the organization.", - "type": "integer" - } - } - }, - "linkedin": { - "description": "LinkedIn information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The LinkedIn handle for the organization.", - "type": "string" - } - } - }, - "crunchbase": { - "description": "Crunchbase information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The Crunchbase handle for the organization.", - "type": "string" - } - } - }, - "activeOn": { - "description": "List of platforms the organization members are active on.", - "type": "array", - "items": { "type": "string" } - }, - "identities": { - "description": "List of platforms the organization members have identities in.", - "type": "array", - "items": { "type": "string" } - }, - "memberCount": { - "description": "Number of members organization has.", - "type": "integer" - }, - "createdAt": { - "description": "Date the organization was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the organization was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Organization" } - }, - "OrganizationQuery": { - "description": "All the parameters you can use to query organizations.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "createdAt_ASC", - "createdAt_DESC", - "memberCount_ASC", - "memberCount_DESC", - "activityCount_ASC", - "activityCount_DESC", - "joinedAt_ASC", - "joinedAt_DESC", - "lastActive_ASC", - "lastActive_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Organization": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/OrganizationNoId" }], - "properties": { - "id": { "description": "The ID of the organization." }, - "body": { - "description": "The body of the organization.", - "type": "string", - "format": "blob" - } - } - }, - "OrganizationRelationsResponse": { - "description": "Relations of a organization.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the organization.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - }, - "activeOn": { - "description": "The platforms where the organization is active.", - "type": "array", - "items": { "type": "string" } - }, - "identities": { - "description": "The list of identities of the members in the organization.", - "type": "array", - "items": { "type": "string" } - }, - "lastActive": { - "description": "The last time the organization was active.", - "type": "string", - "format": "date-time" - }, - "joinedAt": { - "description": "The date the first member from the organization joined the community.", - "type": "string", - "format": "date-time" - } - } - }, - "OrganizationResponse": { - "description": "A organization of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Organization" }, - { "$ref": "#/components/schemas/OrganizationRelationsResponse" } - ] - }, - "OrganizationList": { - "description": "List and count of organizations.", - "type": "object", - "properties": { - "rows": { - "description": "List of organizations", - "type": "array", - "items": { "$ref": "#/components/schemas/OrganizationResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "OrganizationsList" } - }, - "TagNoId": { - "description": "A tag associated with a member.", - "type": "object", - "required": ["name", "tenantId"], - "properties": { - "name": { "description": "The name of the tag", "type": "string" }, - "createdAt": { - "description": "Date the tag was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the tag was last updated", - "type": "string", - "format": "date-time" - }, - "tenantId": { - "description": "Your workspace/tenant id", - "type": "string", - "format": "uuid" - } - }, - "xml": { "name": "Tag" } - }, - "Tag": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/TagNoId" }], - "properties": { "id": { "description": "The unique identifier for a tag." } } - }, - "TagList": { - "description": "List and count of tags.", - "type": "object", - "properties": { - "rows": { - "description": "List of tags", - "type": "array", - "items": { "$ref": "#/components/schemas/Tag" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "TagsList" } - }, - "TaskInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the task. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - }, - "activities": { - "description": "Activities associated with the task. Each element in the array is the ID of the activity.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - }, - "assignees": { - "description": "Users assigned with the task. Each element in the array is the ID of the user.", - "type": "string", - "format": "uuid", - "default": null - } - } - }, - "TaskInput": { - "allOf": [ - { "$ref": "#/components/schemas/TaskNoId" }, - { "$ref": "#/components/schemas/TaskInputRelations" } - ] - }, - "TaskBatchInput": { - "type": "object", - "properties": { - "operation": { - "description": "Batch operation name.", - "type": "string", - "enum": ["findAndUpdateAll"] - }, - "payload": { - "type": "object", - "description": "Payload to send to the batch operation", - "properties": { - "filter": { - "description": "Filter to select the task entities. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "update": { - "description": "key value object with desired updated fields.", - "type": "object" - } - } - } - } - }, - "TaskNoId": { - "description": "A created task.", - "type": "object", - "properties": { - "name": { "description": "The name of the task.", "type": "string" }, - "body": { "description": "The body of the task.", "type": "string", "format": "blob" }, - "status": { - "description": "The status of the task.", - "type": "string", - "enum": ["in-progress", "done"], - "default": null - }, - "createdAt": { - "description": "Date the task was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the task was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Task" } - }, - "TaskQuery": { - "description": "All the parameters you can use to query tasks.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { "type": "string", "enum": ["createdAt_ASC", "createdAt_DESC"] }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Task": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/TaskNoId" }], - "properties": { - "id": { "description": "The ID of the task." }, - "body": { "description": "The body of the task.", "type": "string", "format": "blob" } - } - }, - "TaskRelationsResponse": { - "description": "Relations of a task.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the task.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - }, - "activities": { - "description": "Activities associated with the task.", - "type": "array", - "items": { "$ref": "#/components/schemas/Activity" } - }, - "assignedTo": { - "description": "The workspace member assigned to the task.", - "$ref": "#/components/schemas/Member" - } - } - }, - "TaskResponse": { - "description": "A task of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Task" }, - { "$ref": "#/components/schemas/TaskRelationsResponse" } - ] - }, - "TaskList": { - "description": "List and count of tasks.", - "type": "object", - "properties": { - "rows": { - "description": "List of tasks", - "type": "array", - "items": { "$ref": "#/components/schemas/TaskResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "TasksList" } - }, - "TaskFindAndUpdateAll": { - "description": "Returns number of tasks updated", - "type": "object", - "properties": { - "rowsUpdated": { "description": "Number of tasks updated", "type": "integer" } - } - }, - "ActivityTypesCreateInput": { - "description": "An activity type.", - "properties": { - "type": { - "description": "Human-friendly type of the activity. Default and short displays will set to this and key will be generated using this value." - } - } - }, - "ActivityTypesUpdateInput": { - "description": "An activity type.", - "properties": { - "type": { - "description": "Human-friendly type of the activity. Default and short displays will set to this and key will be generated using this value." - } - } - }, - "ActivityTypeDisplayOptions": { - "type": "object", - "required": ["default", "short", "channel"], - "description": "Activity type display options.", - "properties": { - "default": { - "description": "Default display of an activity type. Used in the activity module in the app.", - "type": "string" - }, - "short": { - "description": "Short display version of an activity type. Used in the member list -> last activity.", - "type": "string" - }, - "channel": { - "description": "Channel display of an activity type. Used in Dashboard -> trending conversations.", - "type": "string" - } - }, - "xml": { "name": "ActivityTypeDisplayOptions" } - }, - "ActivityTypes": { - "type": "object", - "properties": { - "custom": { - "type": "object", - "description": "Custom activity types defined by the user.", - "additionalProperties": { "$ref": "#/components/schemas/ActivityTypeDisplayOptions" } - }, - "default": { - "type": "object", - "description": "Default activity types used by the integrations.", - "additionalProperties": { "$ref": "#/components/schemas/ActivityTypeDisplayOptions" } - } - } - }, - "MemberAttributeSettingsCreateInput": { - "description": "A member attribute.", - "allOf": [{ "$ref": "#/components/schemas/MemberAttributeSettingsNoId" }] - }, - "MemberAttributeSettingsUpdateInput": { - "description": "A member attribute.", - "properties": { - "label": { - "description": "Human-friendly name of the attribute. Label is unique in workspaces.", - "type": "string" - }, - "show": { - "description": "Whether to show the member attribute in the web app or not.", - "type": "boolean", - "default": true - } - } - }, - "MemberAttributeSettingsNoId": { - "type": "object", - "required": ["label", "type"], - "description": "A member attribute that can be created dynamically.", - "properties": { - "label": { - "description": "Human-friendly name of the attribute. Label is unique in workspaces.", - "type": "string" - }, - "name": { - "description": "Camel-case code friendly name of the attribute. If ommited, name will be generated from the label. Name is unique in workspaces.", - "type": "string" - }, - "type": { - "description": "Type of the attribute's value", - "type": "string", - "enum": ["boolean", "number", "email", "string", "url", "date"] - }, - "canDelete": { - "description": "If set to false, member attribute can not be deleted in future requests.", - "type": "boolean", - "default": false - }, - "show": { - "description": "Whether to show the member attribute in the web app or not.", - "type": "boolean", - "default": true - }, - "createdAt": { - "description": "Date the member attribute was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the member attribute was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "MemberAttributeSettings" } - }, - "MemberAttributeSettings": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/MemberAttributeSettingsNoId" }], - "properties": { "id": { "description": "The attribute settings ID." } } - }, - "MemberAttributeSettingsList": { - "description": "List and count member attribute settings.", - "type": "object", - "properties": { - "rows": { - "description": "List of member attribute settings", - "type": "array", - "items": { "$ref": "#/components/schemas/MemberAttributeSettings" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "MemberAttributeSettingsList" } - } - }, - "examples": { - "ActivityUpsert": { - "value": { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": null, - "tasks": [] - } - }, - "ActivityFind": { - "value": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:20:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have fewer bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-03T15:30:55.679Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": null, - "tasks": [] - } - }, - "ActivityFind2": { - "value": { - "id": "73aa13b7-1ef9-4987-a273-e560edff94ca", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_2", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "I will never underestimate my talents again.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 14.308956265449524, - "neutral": 14.437079429626465, - "negative": 9.826807677745819, - "positive": 61.42715811729431, - "sentiment": 86 - }, - "importHash": null, - "createdAt": "2022-10-03T15:38:05.847Z", - "updatedAt": "2022-10-03T15:46:34.610Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-03T15:30:55.679Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have less bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "importHash": null, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "tasks": [] - } - }, - "ActivityFind3": { - "value": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have less bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "importHash": null, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "tasks": [] - } - }, - "ActivityList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/ActivityFind" }, - { "$ref": "#/components/examples/ActivityFind2" }, - { "$ref": "#/components/examples/ActivityFind3" } - ], - "count": 3, - "limit": 10, - "offset": 0 - } - }, - "Automation": { - "value": { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "type": "webhook", - "tenantId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "trigger": "new_activity", - "settings": { "url": "https://webhook.url/new_activities" }, - "createdAt": "2022-03-29T09:22:31.989Z" - } - }, - "AutomationPage": { - "value": { - "count": 1, - "offset": 0, - "limit": 10, - "rows": [ - { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "type": "webhook", - "tenantId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "trigger": "new_activity", - "settings": { "url": "https://webhook.url/new_activities" }, - "createdAt": "2022-03-29T09:22:31.989Z" - } - ] - } - }, - "AutomationExecutionPage": { - "value": { - "count": 1, - "offset": 0, - "limit": 10, - "rows": [ - { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "automationId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "state": "success", - "executedAt": "2022-03-29T09:22:31.989Z", - "eventId": "a3297f3b-6924-4e92-80e7-ef2e0d87a121", - "payload": [ - { - "id": "a3297f3b-6924-4e92-80e7-ef2e0d87a121", - "type": "comment", - "timestamp": "2022-03-29T09:22:31.989Z", - "platform": "twitter" - } - ] - } - ] - } - }, - "Conversation": { - "value": { - "id": "24bdea79-3125-4950-bb38-07fa4a555012", - "title": "Best of dinesh and Gilfoyle", - "slug": "best-of-dinesh-and-gilfoyle", - "published": true, - "createdAt": "2022-10-05T12:21:53.271Z", - "updatedAt": "2022-10-05T12:21:53.271Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activities": [ - { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "activityCount": 2, - "memberCount": 2, - "platform": "discord", - "channel": "piedpiper", - "lastActive": "2020-06-27T15:13:30.000Z" - } - }, - "ConversationList": { - "value": { - "rows": [ - { - "id": "291af008-7717-457e-9242-f5c507c8987b", - "title": "Code sprint over!", - "slug": "code-sprint-over", - "published": false, - "createdAt": "2022-10-03T15:38:05.900Z", - "updatedAt": "2022-10-03T15:38:05.900Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "platform": "github", - "activityCount": 3, - "lastActive": "2021-07-27T20:23:30.000Z", - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "lastReplies": [ - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "memberCount": 2, - "channel": null - }, - { - "id": "24bdea79-3125-4950-bb38-07fa4a555012", - "title": "Best of dinesh and Gilfoyle", - "slug": "best-of-dinesh-and-gilfoyle", - "published": true, - "createdAt": "2022-10-05T12:21:53.271Z", - "updatedAt": "2022-10-05T12:21:53.271Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "platform": "discord", - "activityCount": 1, - "lastActive": "2020-06-29T15:13:30.000Z", - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-05-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Best of Dinesh and gilfoyle", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 1.6482997238636017, - "neutral": 12.5749893784523, - "negative": 62.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "lastReplies": [ - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-29T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "A very last reply to the conversation.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "memberCount": 2, - "channel": "dev" - } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "MemberUpsert": { - "value": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "MemberFind": { - "value": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activities": [ - { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-03T15:26:02.599Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "lastActivity": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "lastActive": "2021-07-27T20:23:30.000Z", - "activityCount": 3, - "averageSentiment": 34.67, - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "parentUrl": null, - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tasks": [], - "notes": [], - "noMerge": [], - "toMerge": [] - } - }, - "MemberList": { - "value": { - "rows": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "identities": ["github", "twitter"], - "activeOn": ["github"], - "activityCount": "2", - "lastActive": "2021-07-27T20:22:30.000Z", - "averageSentiment": "82.50", - "noMerge": [], - "toMerge": [], - "lastActivity": { - "id": "73aa13b7-1ef9-4987-a273-e560edff94ca", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_2", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "I will never underestimate my talents again.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 14.308956265449524, - "neutral": 14.437079429626465, - "negative": 9.826807677745819, - "positive": 61.42715811729431, - "sentiment": 86 - }, - "importHash": null, - "createdAt": "2022-10-03T15:38:05.847Z", - "updatedAt": "2022-10-03T15:46:34.610Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "parentUrl": null, - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - }, - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activityCount": "3", - "lastActive": "2021-07-27T20:23:30.000Z", - "averageSentiment": "34.67", - "noMerge": [], - "toMerge": [], - "lastActivity": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "parentUrl": null, - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - ], - "count": 2, - "offset": 0, - "limit": 10 - } - }, - "Note2": { - "value": { - "id": "39c850f6-fb96-4d16-8e8c-cd7072e33925", - "body": "Refused to have a user feedback call", - "importHash": null, - "createdAt": "2022-10-03T16:00:57.867Z", - "updatedAt": "2022-10-03T16:00:57.867Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "Note": { - "value": { - "id": "196c07da-14e0-419e-bd9a-5f15c721a694", - "body": "Likes frunks", - "importHash": null, - "createdAt": "2022-10-05T11:58:30.977Z", - "updatedAt": "2022-10-05T11:58:30.977Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "NoteList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Note" }, - { "$ref": "#/components/examples/Note2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "OrganizationCreate": { - "value": { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "parentUrl": null, - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 2, - "activityCount": 4 - } - }, - "Organization": { - "value": { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "parentUrl": null, - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "identities": ["github", "twitter"], - "activeOn": ["github"], - "lastActive": "2022-10-03T16:15:21.812Z", - "joinedAt": "2022-05-03T11:16:32.812Z", - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 2, - "activityCount": 4 - } - }, - "Organization2": { - "value": { - "id": "65257687-0bfa-498e-8b2f-53559f41522b", - "name": "Hooli", - "url": "https://hooli.xyz", - "description": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "parentUrl": null, - "emails": ["gavin@hooli.xyz"], - "phoneNumbers": null, - "logo": null, - "tags": ["hooli", "tethics", "not-google"], - "identities": ["devto", "github", "twitter"], - "activeOn": ["devto"], - "lastActive": "2022-10-04", - "joinedAt": "2020-01-30", - "twitter": { - "bio": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "handle": "hooli", - "location": "Menlo Park", - "followers": 500000, - "following": 0 - }, - "linkedin": { "handle": "company/Hooli" }, - "crunchbase": { "handle": "company/Hooli" }, - "employees": 4000, - "revenueRange": { "max": 500, "min": 100 }, - "importHash": null, - "createdAt": "2022-10-05T12:03:11.228Z", - "updatedAt": "2022-10-05T12:03:11.228Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 0, - "activityCount": 0 - } - }, - "OrganizationList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Organization" }, - { "$ref": "#/components/examples/Organization2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "Tag": { - "value": { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "Tag2": { - "value": { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "TagList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Tag" }, - { "$ref": "#/components/examples/Tag2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "Task": { - "value": { - "id": "8a127785-f11d-4102-804d-5b79ccddd4cc", - "name": "Ask for tips on building a new Anton", - "body": null, - "status": null, - "dueDate": "2022-05-27T15:13:30.000Z", - "importHash": null, - "createdAt": "2022-10-03T16:00:18.701Z", - "updatedAt": "2022-10-03T16:00:18.701Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "assignedToId": null, - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "activities": [] - } - }, - "Task2": { - "value": { - "id": "ef22fb05-a41b-472e-9917-a4d10d19fcc6", - "name": "Ask if we can use as quote", - "body": null, - "status": null, - "dueDate": "2022-08-27T00:00:00.000Z", - "importHash": null, - "createdAt": "2022-10-05T11:55:55.606Z", - "updatedAt": "2022-10-05T11:55:55.606Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "assignedToId": null, - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [], - "activities": [ - { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "TaskList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Task" }, - { "$ref": "#/components/examples/Task2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "TaskFindAndUpdateAll": { "value": { "rowsUpdated": 5 } }, - "ActivityTypes": { - "value": { - "default": { - "github": { - "discussion-started": { - "default": "started a discussion in {channel}", - "short": "started a discussion", - "channel": "{channel}" - }, - "discussion-comment": { - "default": "commented on a discussion in {channel}", - "short": "commented on a discussion", - "channel": "{channel}" - }, - "fork": { "default": "forked {channel}", "short": "forked", "channel": "{channel}" }, - "issues-closed": { - "default": "closed an issue in {channel}", - "short": "closed an issue", - "channel": "{channel}" - }, - "issues-opened": { - "default": "opened a new issue in {channel}", - "short": "opened an issue", - "channel": "{channel}" - }, - "issue-comment": { - "default": "commented on an issue in {channel}", - "short": "commented on an issue", - "channel": "{channel}" - }, - "pull_request-closed": { - "default": "closed a pull request in {channel}", - "short": "closed a pull request", - "channel": "{channel}" - }, - "pull_request-opened": { - "default": "opened a new pull request in {channel}", - "short": "opened a pull request", - "channel": "{channel}" - }, - "pull_request-comment": { - "default": "commented on a pull request in {channel}", - "short": "commented on a pull request", - "channel": "{channel}" - }, - "star": { - "default": "starred {channel}", - "short": "starred", - "channel": "{channel}" - }, - "unstar": { - "default": "unstarred {channel}", - "short": "unstarred", - "channel": "{channel}" - } - }, - "devto": { - "comment": { - "default": "commented on {attributes.articleTitle}", - "short": "commented", - "channel": "{attributes.articleTitle}" - } - }, - "discord": { - "joined_guild": { - "default": "joined server", - "short": "joined server", - "channel": "" - }, - "message": { - "default": "sent a message in #{channel}", - "short": "sent a message", - "channel": "#{channel}" - }, - "thread_started": { - "default": "started a new thread", - "short": "started a new thread", - "channel": "" - }, - "thread_message": { - "default": "replied to a message in thread #{channel} -> {attributes.parentChannel}", - "short": "replied to a message", - "channel": "thread #{channel} -> #{attributes.parentChannel}" - } - }, - "hackernews": { - "comment": { - "default": "commented on {attributes.parentTitle}", - "short": "commented", - "channel": "{channel}" - }, - "post": { - "default": "posted mentioning {channel}", - "short": "posted", - "channel": "{channel}" - } - }, - "linkedin": { - "comment": { - "default": "commented on a post {attributes.postBody}", - "short": "commented", - "channel": "{attributes.postBody}" - }, - "message": { "default": "sent a message", "short": "sent a message", "channel": "" }, - "reaction": { - "default": "reacted with on a post {attributes.postBody}", - "short": "reacted", - "channel": "{attributes.postBody}" - } - }, - "reddit": { - "comment": { - "default": "commented in subreddit r/{channel}", - "short": "commented on a post", - "channel": "r/{channel}" - }, - "post": { - "default": "posted in subreddit r/{channel}", - "short": "posted in subreddit", - "channel": "r/{channel}" - } - }, - "slack": { - "channel_joined": { - "default": "joined channel {channel}", - "short": "joined channel", - "channel": "{channel}" - }, - "message": { - "default": "sent a message in {channel}", - "short": "sent a message", - "channel": "{channel}" - } - }, - "twitter": { - "hashtag": { "default": "posted a tweet", "short": "posted a tweet", "channel": "" }, - "follow": { "default": "followed you", "short": "followed you", "channel": "" }, - "mention": { - "default": "mentioned you in a tweet", - "short": "mentioned you", - "channel": "" - } - }, - "stackoverflow": { - "question": { - "default": "Asked a question {self}", - "short": "asked a question", - "channel": "" - }, - "answer": { - "default": "Answered a question {self}", - "short": "answered a question", - "channel": "" - } - } - }, - "custom": { - "other": { - "attended-a-meeting": { - "short": "Attended a meeting", - "channel": "", - "default": "Attended a meeting" - }, - "asked-question-in-webinar": { - "default": "Asked question in webinar", - "short": "Asked question in webinar", - "channel": "" - } - } - } - } - }, - "MemberAttributeSettings": { - "value": { - "id": "9eaedce9-1f3a-4a75-adc8-e475cbc47553'", - "type": "string", - "canDelete": false, - "show": true, - "label": "Url", - "name": "url", - "createdAt": "2022-09-07", - "updatedAt": "2022-09-07", - "tenantId": "fcd5b9cc-144b-4687-8fd9-34818f35e70d" - } - }, - "MemberAttributeSettings2": { - "value": { - "id": "13bb9e12-c371-44ad-8806-0678c2f53dd1", - "type": "boolean", - "canDelete": false, - "show": true, - "label": "is Hireable", - "name": "isHireable", - "createdAt": "2022-09-07", - "updatedAt": "2022-09-07", - "tenantId": "fcd5b9cc-144b-4687-8fd9-34818f35e70d" - } - }, - "MemberAttributeSettingsList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/MemberAttributeSettings" }, - { "$ref": "#/components/examples/MemberAttributeSettings2" } - ], - "count": 2 - } - } - } - }, - "tags": [ - { "name": "Members", "description": "Everything about members" }, - { "name": "Member Attributes", "description": "Settings for member's attributes" }, - { "name": "Activities", "description": "Everything about activities" }, - { "name": "Organizations", "description": "Everything about organizations" }, - { "name": "Conversations", "description": "Everything about conversations" }, - { "name": "Tags", "description": "Everything about tags" }, - { "name": "Automations", "description": "Everything about automations" }, - { "name": "Notes", "description": "Everything about notes" } - ] -} diff --git a/backend/package.json b/backend/package.json index 8dade3c2aa..23207e081c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,22 +8,10 @@ "start:job-generator": "SERVICE=job-generator TS_NODE_TRANSPILE_ONLY=true tsx src/bin/job-generator.ts", "start:job-generator:dev": "nodemon --watch \"src/**/*.ts\" --watch ../services/libs -e ts,json --exec \"pnpm run start:job-generator\"", "start:job-generator:dev:local": "set -a && . ./.env.dist.local && . ./.env.override.local && set +a && pnpm run start:job-generator:dev", - "start:discord-ws": "SERVICE=discord-ws TS_NODE_TRANSPILE_ONLY=true tsx src/bin/discord-ws.ts", - "start:discord-ws:dev": "nodemon --watch \"src/**/*.ts\" --watch ../services/libs -e ts,json --exec \"pnpm run start:discord-ws\"", - "start:discord-ws:dev:local": "set -a && . ./.env.dist.local && . ./.env.override.local && set +a && pnpm run start:discord-ws:dev", "build": "tsc && pnpm run build:documentation && cp package*json dist/ && cp .sequelizerc dist/.sequelizerc ", "test": "../scripts/cli scaffold up-test && jest --clearCache && set -a && . ./.env.dist.local && . ./.env.test && set +a && NODE_ENV=test SERVICE=test jest --runInBand --verbose --forceExit", - "build:documentation": "copyfiles --flat ./src/documentation/openapi.json ./dist/documentation/", - "db:create:test": "tsx ./src/database/initializers/create test", - "db:create:dev:source": "tsx ./src/database/initializers/create dev", - "db:seed:test": "tsx ./src/database/initializers/seed test", - "db:seed:dev": "tsx ./src/database/initializers/seed dev", - "db:publish": "bash ./util/publish-db.sh", - "docs": "bash ./util/publish-docs.sh", "sequelize-cli:source": "pnpm run build && npx sequelize --config src/database/sequelize-cli-config.ts --migrations-source-path src/database/migrations", "sequelize-cli:build": "npx sequelize --config database/sequelize-cli-config.js --migrations-compiled-path database/migrations", - "stripe:login": "stripe login", - "stripe:start": "stripe listen --forward-to localhost:8080/api/plan/stripe/webhook", "lint": "eslint .", "format": "prettier --write .", "format-check": "prettier --check .", @@ -33,7 +21,6 @@ "script:change-tenant-plan": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/change-tenant-plan.ts", "script:trigger-webhook": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/trigger-webhook.ts", "script:send-weekly-analytics-email": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/send-weekly-analytics-email.ts", - "script:unleash-init": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/unleash-init.ts", "script:merge-organizations": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/merge-organizations.ts", "script:refresh-materialized-views": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/refresh-materialized-views.ts", "script:unmerge-members": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/unmerge-members.ts", @@ -56,7 +43,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/opensearch": "workspace:*", @@ -120,7 +106,6 @@ "mv": "2.1.1", "node-fetch": "^2.6.7", "omit-deep-by-values": "^1.0.2", - "openapi-comment-parser": "^1.0.0", "passport": "0.6.0", "passport-facebook": "3.0.0", "passport-github2": "^0.1.12", @@ -135,7 +120,6 @@ "sequelize-cli-typescript": "^3.2.0-c", "slack-block-builder": "^2.7.2", "socket.io": "^4.5.4", - "stripe": "^10.0.0", "superagent": "^8.0.0", "swagger-ui-dist": "4.1.3", "tsconfig-paths": "^4.2.0", @@ -171,7 +155,6 @@ "eslint-config-airbnb-typescript": "^16.1.4", "eslint-config-prettier": "^8.5.0", "eslint-plugin-import": "^2.25.4", - "eslint-plugin-openapi": "^0.0.4", "jest": "^29.5.0", "node-mocks-http": "1.9.0", "nodemon": "2.0.4", diff --git a/backend/src/api/apiDocumentation.ts b/backend/src/api/apiDocumentation.ts deleted file mode 100644 index f6b50d6219..0000000000 --- a/backend/src/api/apiDocumentation.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { API_CONFIG } from '../conf' - -const express = require('express') -const fs = require('fs') -const path = require('path') - -export default function setupSwaggerUI(app) { - if (API_CONFIG.documentation) { - return - } - - const serveSwaggerDef = function serveSwaggerDef(req, res) { - res.sendFile(path.resolve(`${__dirname}/../documentation/openapi.json`)) - } - app.get('/documentation-config', serveSwaggerDef) - - const swaggerUiAssetPath = require('swagger-ui-dist').getAbsoluteFSPath() - const swaggerFiles = express.static(swaggerUiAssetPath) - - const urlRegex = /url: "[^"]*",/ - - const patchIndex = function patchIndex(req, res) { - const indexContent = fs - .readFileSync(`${swaggerUiAssetPath}/index.html`) - .toString() - .replace(urlRegex, 'url: "../documentation-config",') - res.send(indexContent) - } - - app.get('/documentation', (req, res) => { - let targetUrl = req.originalUrl - if (!targetUrl.endsWith('/')) { - targetUrl += '/' - } - targetUrl += 'index.html' - res.redirect(targetUrl) - }) - app.get('/documentation/index.html', patchIndex) - - app.use('/documentation', swaggerFiles) -} diff --git a/backend/src/api/components/activity/activityTypes/examples.yaml b/backend/src/api/components/activity/activityTypes/examples.yaml deleted file mode 100644 index 1462d69dbf..0000000000 --- a/backend/src/api/components/activity/activityTypes/examples.yaml +++ /dev/null @@ -1,148 +0,0 @@ -components: - examples: - ActivityTypes: - value: - default: - github: - discussion-started: - default: started a discussion in {channel} - short: started a discussion - channel: '{channel}' - discussion-comment: - default: commented on a discussion in {channel} - short: commented on a discussion - channel: '{channel}' - fork: - default: forked {channel} - short: forked - channel: '{channel}' - issues-closed: - default: closed an issue in {channel} - short: closed an issue - channel: '{channel}' - issues-opened: - default: opened a new issue in {channel} - short: opened an issue - channel: '{channel}' - issue-comment: - default: commented on an issue in {channel} - short: commented on an issue - channel: '{channel}' - pull_request-closed: - default: closed a pull request in {channel} - short: closed a pull request - channel: '{channel}' - pull_request-opened: - default: opened a new pull request in {channel} - short: opened a pull request - channel: '{channel}' - pull_request-comment: - default: commented on a pull request in {channel} - short: commented on a pull request - channel: '{channel}' - star: - default: starred {channel} - short: starred - channel: '{channel}' - unstar: - default: unstarred {channel} - short: unstarred - channel: '{channel}' - devto: - comment: - default: commented on {attributes.articleTitle} - short: commented - channel: {attributes.articleTitle} - discord: - joined_guild: - default: joined server - short: joined server - channel: '' - message: - default: sent a message in #{channel} - short: sent a message - channel: #{channel} - thread_started: - default: started a new thread - short: started a new thread - channel: '' - thread_message: - default: replied to a message in thread #{channel} -> {attributes.parentChannel} - short: replied to a message - channel: 'thread #{channel} - -> #{attributes.parentChannel}' - hackernews: - comment: - default: commented on {attributes.parentTitle} - short: commented - channel: '{channel}' - post: - default: posted mentioning {channel} - short: posted - channel: '{channel}' - linkedin: - comment: - default: commented on a post {attributes.postBody} - short: commented - channel: {attributes.postBody} - message: - default: sent a message - short: sent a message - channel: '' - reaction: - default: - reacted with - on a post {attributes.postBody} - short: reacted - channel: {attributes.postBody} - reddit: - comment: - default: commented in subreddit r/{channel} - short: commented on a post - channel: r/{channel} - post: - default: posted in subreddit r/{channel} - short: posted in subreddit - channel: r/{channel} - slack: - channel_joined: - default: joined channel {channel} - short: joined channel - channel: '{channel}' - message: - default: sent a message in {channel} - short: sent a message - channel: '{channel}' - twitter: - hashtag: - default: posted a tweet - short: posted a tweet - channel: '' - follow: - default: followed you - short: followed you - channel: '' - mention: - default: mentioned you in a tweet - short: mentioned you - channel: '' - stackoverflow: - question: - default: Asked a question {self} - short: asked a question - channel: '' - answer: - default: Answered a question {self} - short: answered a question - channel: '' - custom: - other: - attended-a-meeting: - short: Attended a meeting - channel: '' - default: Attended a meeting - asked-question-in-webinar: - default: Asked question in webinar - short: Asked question in webinar - channel: '' diff --git a/backend/src/api/components/activity/activityTypes/inputs.yaml b/backend/src/api/components/activity/activityTypes/inputs.yaml deleted file mode 100644 index 86160b3ebb..0000000000 --- a/backend/src/api/components/activity/activityTypes/inputs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -components: - schemas: - ActivityTypesCreateInput: - description: >- - An activity type. - properties: - type: - description: >- - Human-friendly type of the activity. Default and short displays will set to this and key will be generated using this value. - - ActivityTypesUpdateInput: - description: >- - An activity type. - properties: - type: - description: >- - Human-friendly type of the activity. Default and short displays will set to this and key will be generated using this value. diff --git a/backend/src/api/components/activity/activityTypes/models.yaml b/backend/src/api/components/activity/activityTypes/models.yaml deleted file mode 100644 index 6e4b1e62a6..0000000000 --- a/backend/src/api/components/activity/activityTypes/models.yaml +++ /dev/null @@ -1,39 +0,0 @@ -components: - schemas: - # defines the display options of a single activity type - ActivityTypeDisplayOptions: - type: object - required: - - default - - short - - channel - - description: Activity type display options. - properties: - default: - description: Default display of an activity type. Used in the activity module in the app. - type: string - short: - description: Short display version of an activity type. Used in the member list -> last activity. - type: string - channel: - description: Channel display of an activity type. Used in Dashboard -> trending conversations. - type: string - - xml: - name: ActivityTypeDisplayOptions - - # defines the custom and default activity type settings - ActivityTypes: - type: object - properties: - custom: - type: object - description: Custom activity types defined by the user. - additionalProperties: - $ref: '#/components/schemas/ActivityTypeDisplayOptions' - default: - type: object - description: Default activity types used by the integrations. - additionalProperties: - $ref: '#/components/schemas/ActivityTypeDisplayOptions' diff --git a/backend/src/api/components/activity/examples.yaml b/backend/src/api/components/activity/examples.yaml deleted file mode 100644 index 48fc826041..0000000000 --- a/backend/src/api/components/activity/examples.yaml +++ /dev/null @@ -1,343 +0,0 @@ -components: - examples: - ActivityUpsert: - value: - id: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - type: message - timestamp: '2020-05-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '1234' - sourceParentId: null - attributes: - reactions: 43 - channel: dev - body: It's not magic. It's talend and sweat. - title: null - url: discord.gg/1234 - sentiment: - label: negative - mixed: 1.1410574428737164 - neutral: 11.00325882434845 - negative: 85.99738478660583 - positive: 1.8582981079816818 - sentiment: 2 - importHash: null - createdAt: '2022-10-03T15:18:11.294Z' - updatedAt: '2022-10-03T15:21:49.402Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: null - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-03T15:17:27.073Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - parent: null - tasks: [] - - ActivityFind: - value: - id: 462ddc6b-5672-43b2-9018-4e3fd7332228 - type: pull_request-closed - timestamp: '2021-07-27T20:20:30.000Z' - platform: github - isContribution: true - score: 10 - sourceId: gh_1 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Last one to finish the code sprint! But I will have fewer bugs than Gilfoyle. - title: Code sprint over! - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 0.7594161201268435 - neutral: 39.13898766040802 - negative: 12.336093187332153 - positive: 47.76550233364105 - sentiment: 79 - createdAt: '2022-10-03T15:36:43.775Z' - updatedAt: '2022-10-03T15:39:38.199Z' - deletedAt: null - memberId: 2effc566-1932-44f3-a821-2d692933a953 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: 2effc566-1932-44f3-a821-2d692933a953 - username: - github: dinesh - twitter: dinesh.chugtai - attributes: - bio: - github: Lead developer at Pied Piper - default: Pakistani Denzel. Tesla and gold chain owner. - twitter: Pakistani Denzel. Tesla and gold chain owner. - url: - github: https://github.com/dinesh - default: https://t.co/d - twitter: https://t.co/d - location: - custom: Silicon Valley - github: Palo alto - default: Silicon Valley - displayName: Dinesh - email: dinesh@piedpiper.io - score: 9 - joinedAt: '2022-10-03T15:30:55.672Z' - importHash: null - reach: - total: 100 - github: 60 - twitter: 40 - createdAt: '2022-10-03T15:30:55.679Z' - updatedAt: '2022-10-03T15:30:55.679Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - parent: null - tasks: [] - - ActivityFind2: - value: - id: 73aa13b7-1ef9-4987-a273-e560edff94ca - type: pull_request-comment - timestamp: '2021-07-27T20:22:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_2 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: I will never underestimate my talents again. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 14.308956265449524 - neutral: 14.437079429626465 - negative: 9.826807677745819 - positive: 61.42715811729431 - sentiment: 86 - importHash: null - createdAt: '2022-10-03T15:38:05.847Z' - updatedAt: '2022-10-03T15:46:34.610Z' - deletedAt: null - memberId: 2effc566-1932-44f3-a821-2d692933a953 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: 2effc566-1932-44f3-a821-2d692933a953 - username: - github: dinesh - twitter: dinesh.chugtai - attributes: - bio: - github: Lead developer at Pied Piper - default: Pakistani Denzel. Tesla and gold chain owner. - twitter: Pakistani Denzel. Tesla and gold chain owner. - url: - github: https://github.com/dinesh - default: https://t.co/d - twitter: https://t.co/d - location: - custom: Silicon Valley - github: Palo alto - default: Silicon Valley - displayName: Dinesh - email: dinesh@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:30:55.672Z' - importHash: null - reach: - total: 100 - github: 60 - twitter: 40 - createdAt: '2022-10-03T15:30:55.679Z' - updatedAt: '2022-10-03T15:30:55.679Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - parent: - id: 462ddc6b-5672-43b2-9018-4e3fd7332228 - type: pull_request-closed - timestamp: '2021-07-27T20:22:30.000Z' - platform: github - isContribution: true - score: 10 - sourceId: gh_1 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Last one to finish the code sprint! But I will have less bugs than Gilfoyle. - title: Code sprint over! - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 0.7594161201268435 - neutral: 39.13898766040802 - negative: 12.336093187332153 - positive: 47.76550233364105 - sentiment: 79 - importHash: null - createdAt: '2022-10-03T15:36:43.775Z' - updatedAt: '2022-10-03T15:39:38.199Z' - deletedAt: null - memberId: 2effc566-1932-44f3-a821-2d692933a953 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - tasks: [] - - ActivityFind3: - value: - id: 2dcbe40e-36e0-4929-ab21-a30467fd9a65 - type: pull_request-comment - timestamp: '2021-07-27T20:23:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_3 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: Don't worry. I will continue to do it for you. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 2.9098065569996834 - neutral: 25.578168034553528 - negative: 2.241993509232998 - positive: 69.27002668380737 - sentiment: 97 - importHash: null - createdAt: '2022-10-03T15:47:20.151Z' - updatedAt: '2022-10-03T15:47:20.220Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-03T15:17:27.073Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - parent: - id: 462ddc6b-5672-43b2-9018-4e3fd7332228 - type: pull_request-closed - timestamp: '2021-07-27T20:22:30.000Z' - platform: github - isContribution: true - score: 10 - sourceId: gh_1 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Last one to finish the code sprint! But I will have less bugs than Gilfoyle. - title: Code sprint over! - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 0.7594161201268435 - neutral: 39.13898766040802 - negative: 12.336093187332153 - positive: 47.76550233364105 - sentiment: 79 - importHash: null - createdAt: '2022-10-03T15:36:43.775Z' - updatedAt: '2022-10-03T15:39:38.199Z' - deletedAt: null - memberId: 2effc566-1932-44f3-a821-2d692933a953 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - tasks: [] - - ActivityList: - value: - rows: - - $ref: '#/components/examples/ActivityFind' - - $ref: '#/components/examples/ActivityFind2' - - $ref: '#/components/examples/ActivityFind3' - count: 3 - limit: 10 - offset: 0 diff --git a/backend/src/api/components/activity/inputs.yaml b/backend/src/api/components/activity/inputs.yaml deleted file mode 100644 index 4b631c8ad1..0000000000 --- a/backend/src/api/components/activity/inputs.yaml +++ /dev/null @@ -1,33 +0,0 @@ -components: - schemas: - ActivityRelationsInput: - description: Relations of an activity. - type: object - properties: - tasks: - description: Tasks associated with the activity - type: array - items: - $ref: '#/components/schemas/TaskNoId' - - ActivityUpsertInput: - required: [memberId] - description: >- - An activity performed by a member of your community. The member is sent as an ID. - allOf: - - $ref: '#/components/schemas/ActivityNoId' - - $ref: '#/components/schemas/ActivityRelationsInput' - properties: - memberId: - description: The ID of the member that performed the activity - - ActivityUpsertWithMemberInput: - type: object - description: >- - An activity performed by a member of your community. The member is sent as a whole object. - allOf: - - $ref: '#/components/schemas/ActivityNoId' - - $ref: '#/components/schemas/ActivityRelationsInput' - properties: - member: - $ref: '#/components/schemas/MemberNoId' diff --git a/backend/src/api/components/activity/models.yaml b/backend/src/api/components/activity/models.yaml deleted file mode 100644 index fd357f108e..0000000000 --- a/backend/src/api/components/activity/models.yaml +++ /dev/null @@ -1,113 +0,0 @@ -components: - schemas: - # defines the attributes of an activity, excluding the ID - ActivityNoId: - description: An activity performed by a member of your community. - type: object - - required: - - type - - platform - - timestamp - - sourceId - - properties: - type: - description: Type of activity - type: string - - timestamp: - description: Date and time when the activity took place - type: string - format: date-time - - platform: - description: Platform on which the activity took place - type: string - - title: - description: Title of the activity - type: string - - body: - description: Body of the activity - type: string - - channel: - description: Channel of the activity - type: string - - sentiment: - description: Sentiment of the activity - type: object - properties: - sentiment: - description: >- - Default sentiment score. -
Computed by mapping (positive - negative) from 0 to 100 - type: number - minimum: 0 - maximum: 100 - label: - description: Sentiment label - type: string - enum: [positive, negative, neutral, mixed] - positive: - description: Positive sentiment score - type: number - minimum: 0 - maximum: 1 - negative: - description: Negative sentiment score - type: number - minimum: 0 - maximum: 1 - neutral: - description: Neutral sentiment score - type: number - minimum: 0 - maximum: 1 - mixed: - description: Mixed sentiment score. Mixed contains both positive and negative sentiments - type: number - minimum: 0 - maximum: 1 - - sourceId: - description: The id of the activity in the platform (e.g. the id of the message in Discord) - type: string - - sourceParentId: - description: The id of the parent activity in the platform (e.g. the id of the parent message in Discord) - type: string - - parentId: - description: Id of the parent activity, if the activity has a parent - type: string - format: uuid - - score: - description: Score associated with the activity - type: number - - isContribution: - description: Whether the activity was a contribution - type: boolean - - attributes: - description: Extra attributes of the activity - type: object - additionalProperties: true - - createdAt: - description: Date the activity was created - type: string - format: date-time - - updatedAt: - description: Date the activity was last updated - type: string - format: date-time - - xml: - name: ActivityNoId diff --git a/backend/src/api/components/activity/query.yaml b/backend/src/api/components/activity/query.yaml deleted file mode 100644 index 20a83f3919..0000000000 --- a/backend/src/api/components/activity/query.yaml +++ /dev/null @@ -1,48 +0,0 @@ -components: - schemas: - FilterType: - type: object - additionalProperties: - oneOf: - - type: string - - $ref: '#/components/schemas/FilterType' - - ActivityQuery: - description: >- - All the parameters you can use to query activitys. - - properties: - filter: - description: >- - Filter. Please refer to filter docs. - type: string - format: blob - - orderBy: - type: string - enum: - - activitiesCount_DESC - - score_ASC - - score_ASC - - joinedAt_ASC - - joinedAt_DESC - - createdAt_ASC - - createdAt_DESC - - organisation_ASC - - organisation_DESC - - location_ASC - - location_DESC - - limit: - description: >- - Limit the number of records returned. Default is 10. - type: integer - minimum: 1 - maximum: 200 - default: 10 - offset: - description: >- - Offset the number of records returned. Default is 0. - type: integer - minimum: 0 - default: 0 diff --git a/backend/src/api/components/activity/responses.yaml b/backend/src/api/components/activity/responses.yaml deleted file mode 100644 index 65fc16f6cf..0000000000 --- a/backend/src/api/components/activity/responses.yaml +++ /dev/null @@ -1,51 +0,0 @@ -components: - schemas: - # defines a complete activity, including the ID - Activity: - type: object - allOf: - - $ref: '#/components/schemas/ActivityNoId' - properties: - id: - description: The unique identifier for an activity. - - ActivityRelationsResponse: - description: Relations of an activity. - type: object - properties: - member: - description: Member that performed the activity - $ref: '#/components/schemas/Member' - tasks: - description: Tasks associated with the activity. - type: array - items: - $ref: '#/components/schemas/Task' - - ActivityResponse: - description: An activity performed by a member. - type: object - allOf: - - $ref: '#/components/schemas/Activity' - - $ref: '#/components/schemas/ActivityRelationsResponse' - - ActivityList: - description: List and count of activities. - type: object - properties: - rows: - description: List of activities - type: array - items: - $ref: '#/components/schemas/ActivityResponse' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: ActivitiesList diff --git a/backend/src/api/components/auth.yaml b/backend/src/api/components/auth.yaml deleted file mode 100644 index f16a980eaa..0000000000 --- a/backend/src/api/components/auth.yaml +++ /dev/null @@ -1,5 +0,0 @@ -components: - securitySchemes: - Bearer: - type: http - scheme: bearer diff --git a/backend/src/api/components/automation/examples.yaml b/backend/src/api/components/automation/examples.yaml deleted file mode 100644 index 5d7163e5d4..0000000000 --- a/backend/src/api/components/automation/examples.yaml +++ /dev/null @@ -1,42 +0,0 @@ -components: - examples: - Automation: - value: - id: b3297f3b-6924-4e92-80e7-ef2e0d87a120 - type: 'webhook' - tenantId: a3297f3b-6924-4e92-80e7-ef2e0d87a120 - trigger: 'new_activity' - settings: - url: 'https://webhook.url/new_activities' - createdAt: '2022-03-29T09:22:31.989Z' - - AutomationPage: - value: - count: 1 - offset: 0 - limit: 10 - rows: - - id: b3297f3b-6924-4e92-80e7-ef2e0d87a120 - type: 'webhook' - tenantId: a3297f3b-6924-4e92-80e7-ef2e0d87a120 - trigger: 'new_activity' - settings: - url: 'https://webhook.url/new_activities' - createdAt: '2022-03-29T09:22:31.989Z' - - AutomationExecutionPage: - value: - count: 1 - offset: 0 - limit: 10 - rows: - - id: 'b3297f3b-6924-4e92-80e7-ef2e0d87a120' - automationId: 'a3297f3b-6924-4e92-80e7-ef2e0d87a120' - state: success - executedAt: '2022-03-29T09:22:31.989Z' - eventId: 'a3297f3b-6924-4e92-80e7-ef2e0d87a121' - payload: - - id: 'a3297f3b-6924-4e92-80e7-ef2e0d87a121' - type: 'comment' - timestamp: '2022-03-29T09:22:31.989Z' - platform: 'twitter' diff --git a/backend/src/api/components/automation/inputs.yaml b/backend/src/api/components/automation/inputs.yaml deleted file mode 100644 index 6d1d508499..0000000000 --- a/backend/src/api/components/automation/inputs.yaml +++ /dev/null @@ -1,33 +0,0 @@ -components: - schemas: - AutomationCreateInput: - type: object - description: >- - Data to create a new automation. - required: - - type - - trigger - - settings - properties: - type: - $ref: '#/components/schemas/AutomationType' - trigger: - $ref: '#/components/schemas/AutomationTrigger' - settings: - $ref: '#/components/schemas/AutomationSettings' - - AutomationUpdateInput: - type: object - description: >- - Data to update an existing automation. - required: - - trigger - - settings - - state - properties: - trigger: - $ref: '#/components/schemas/AutomationTrigger' - settings: - $ref: '#/components/schemas/AutomationSettings' - state: - $ref: '#/components/schemas/AutomationState' diff --git a/backend/src/api/components/automation/models.yaml b/backend/src/api/components/automation/models.yaml deleted file mode 100644 index 428bf3d888..0000000000 --- a/backend/src/api/components/automation/models.yaml +++ /dev/null @@ -1,199 +0,0 @@ -components: - schemas: - # defines automation type enum - AutomationType: - description: Automation type - type: string - enum: ['webhook'] - - # defines automation state enum - AutomationState: - description: Automation state - type: string - enum: ['active', 'disabled'] - - # defines automation triggers - AutomationTrigger: - description: What will trigger an automation - type: string - enum: ['new_activity', 'new_member'] - - # defines automation execution state - AutomationExecutionState: - description: What was the state of the automation execution - type: string - enum: ['success', 'error'] - - # defines webhook automation settings - WebhookAutomationSettings: - description: Settings used by automation with type webhook - type: object - required: - - url - properties: - url: - description: URL to POST webhook data to - type: string - format: uri - - # defines new activity triggered automation settings - NewActivityAutomationSettings: - description: Settings used by automation that is triggered by new activities - type: object - required: - - types - - platforms - - keywords - - teamMemberActivities - properties: - types: - description: 'If activity type matches any of these we should trigger this automation' - type: array - items: - type: string - platforms: - description: 'If activity came from any of these platforms we should trigger this automation' - type: array - items: - type: string - keywords: - description: 'If activity content contains any of these keywords we should trigger this automation' - type: array - items: - type: string - teamMemberActivities: - description: 'If activity came from any of our team members - should we trigger automation or not?' - type: boolean - - # defines automation settings object - AutomationSettings: - description: Settings based on automation type and trigger - you need to provide union object of both automation type based settings and trigger based settings - type: object - anyOf: - - $ref: '#/components/schemas/WebhookAutomationSettings' - - $ref: '#/components/schemas/NewActivityAutomationSettings' - - # Responses - Automation: - type: object - required: - - id - - type - - tenantId - - trigger - - settings - - state - - createdAt - properties: - id: - description: Automation unique ID - type: string - format: uuid - type: - $ref: '#/components/schemas/AutomationType' - tenantId: - description: Automation tenant unique ID - type: string - format: uuid - trigger: - $ref: '#/components/schemas/AutomationTrigger' - settings: - $ref: '#/components/schemas/AutomationSettings' - state: - $ref: '#/components/schemas/AutomationState' - createdAt: - description: When was automation created - type: string - format: date-time - lastExecutionAt: - description: When was automation last executed - type: string - format: date-time - lastExecutionState: - description: State of the last automation execution - $ref: '#/components/schemas/AutomationExecutionState' - lastExecutionError: - description: Error information if last automation execution failed - type: object - - # Responses - AutomationPage: - type: object - required: - - rows - - count - - offset - - limit - properties: - rows: - description: Array of automations that were fetched - type: array - items: - $ref: '#/components/schemas/Automation' - count: - description: How many total automations there are - type: integer - offset: - description: What offset was used when preparing this response - type: integer - limit: - description: What limit was used when preparing this response - type: integer - - AutomationExecution: - type: object - required: - - id - - automationId - - state - - executedAt - - eventId - - payload - properties: - id: - description: Automation execution unique ID - type: string - format: uuid - automationId: - description: Automation unique ID - type: string - format: uuid - state: - description: Automation execution state - $ref: '#/components/schemas/AutomationExecutionState' - error: - description: If execution was not successful this object will contain error information - type: object - executedAt: - description: Automation execution timestamp - type: string - format: date-time - eventId: - description: Unique ID of the event that triggered this automation execution. - type: string - payload: - description: Payload that was sent when this execution was processed - type: object - - AutomationExecutionPage: - type: object - required: - - rows - - count - - offset - - limit - properties: - rows: - description: Automation Execution List - type: array - items: - $ref: '#/components/schemas/AutomationExecution' - count: - description: How many items are there in total - type: integer - offset: - description: What offset was used when preparing this response - type: integer - limit: - description: What limit was used when preparing this response - type: integer diff --git a/backend/src/api/components/conversation/examples.yaml b/backend/src/api/components/conversation/examples.yaml deleted file mode 100644 index cc1139bf61..0000000000 --- a/backend/src/api/components/conversation/examples.yaml +++ /dev/null @@ -1,503 +0,0 @@ -components: - examples: - Conversation: - value: - id: 24bdea79-3125-4950-bb38-07fa4a555012 - title: Best of dinesh and Gilfoyle - slug: best-of-dinesh-and-gilfoyle - published: true - createdAt: '2022-10-05T12:21:53.271Z' - updatedAt: '2022-10-05T12:21:53.271Z' - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - activities: - - id: 89a136ed-336d-4586-8842-790775465212 - type: message - timestamp: '2020-06-27T14:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: d42 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Sooner or later Gilfoyle's servers are going to fail and then it's all done - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: negative - mixed: 3.6482997238636017 - neutral: 19.5749893784523 - negative: 75.36468505859375 - positive: 1.4120269566774368 - sentiment: 2 - importHash: null - createdAt: '2022-10-05T12:09:44.414Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: c39dc046-da1d-4a25-8624-6b78aad00f30 - type: message - timestamp: '2020-06-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '2345' - sourceParentId: '1234' - attributes: - reactions: 68 - channel: dev - body: My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase. - title: null - url: discord.gg/2345 - sentiment: - label: negative - mixed: 5.963129922747612 - neutral: 20.673033595085144 - negative: 69.99874711036682 - positive: 3.365083411335945 - sentiment: 5 - importHash: null - createdAt: '2022-10-03T15:19:30.415Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - conversationStarter: - id: 89a136ed-336d-4586-8842-790775465212 - type: message - timestamp: '2020-06-27T14:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: d42 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Sooner or later Gilfoyle's servers are going to fail and then it's all done - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: negative - mixed: 3.6482997238636017 - neutral: 19.5749893784523 - negative: 75.36468505859375 - positive: 1.4120269566774368 - sentiment: 2 - importHash: null - createdAt: '2022-10-05T12:09:44.414Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - activityCount: 2 - memberCount: 2 - platform: discord - channel: piedpiper - lastActive: '2020-06-27T15:13:30.000Z' - - ConversationList: - value: - rows: - - id: 291af008-7717-457e-9242-f5c507c8987b - title: Code sprint over! - slug: code-sprint-over - published: false - createdAt: '2022-10-03T15:38:05.900Z' - updatedAt: '2022-10-03T15:38:05.900Z' - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - platform: github - activityCount: 3 - lastActive: '2021-07-27T20:23:30.000Z' - conversationStarter: - id: 89a136ed-336d-4586-8842-790775465212 - type: message - timestamp: '2020-06-27T14:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: d42 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Sooner or later Gilfoyle's servers are going to fail and then it's all done - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: negative - mixed: 3.6482997238636017 - neutral: 19.5749893784523 - negative: 75.36468505859375 - positive: 1.4120269566774368 - sentiment: 2 - importHash: null - createdAt: '2022-10-05T12:09:44.414Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - lastReplies: - - id: c39dc046-da1d-4a25-8624-6b78aad00f30 - type: message - timestamp: '2020-06-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '2345' - sourceParentId: '1234' - attributes: - reactions: 68 - channel: dev - body: My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase. - title: null - url: discord.gg/2345 - sentiment: - label: negative - mixed: 5.963129922747612 - neutral: 20.673033595085144 - negative: 69.99874711036682 - positive: 3.365083411335945 - sentiment: 5 - importHash: null - createdAt: '2022-10-03T15:19:30.415Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - memberCount: 2 - channel: null - - id: 24bdea79-3125-4950-bb38-07fa4a555012 - title: Best of dinesh and Gilfoyle - slug: best-of-dinesh-and-gilfoyle - published: true - createdAt: '2022-10-05T12:21:53.271Z' - updatedAt: '2022-10-05T12:21:53.271Z' - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - platform: discord - activityCount: 1 - lastActive: '2020-06-29T15:13:30.000Z' - conversationStarter: - id: 89a136ed-336d-4586-8842-790775465212 - type: message - timestamp: '2020-05-27T14:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: d42 - sourceParentId: null - attributes: {} - channel: piedpiper - body: Best of Dinesh and gilfoyle - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: negative - mixed: 1.6482997238636017 - neutral: 12.5749893784523 - negative: 62.36468505859375 - positive: 1.4120269566774368 - sentiment: 2 - importHash: null - createdAt: '2022-10-05T12:09:44.414Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - lastReplies: - - id: c39dc046-da1d-4a25-8624-6b78aad00f30 - type: message - timestamp: '2020-06-29T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '2345' - sourceParentId: '1234' - attributes: - reactions: 68 - channel: dev - body: A very last reply to the conversation. - title: null - url: discord.gg/2345 - sentiment: - label: negative - mixed: 5.963129922747612 - neutral: 20.673033595085144 - negative: 69.99874711036682 - positive: 3.365083411335945 - sentiment: 5 - importHash: null - createdAt: '2022-10-03T15:19:30.415Z' - updatedAt: '2022-10-05T12:21:53.279Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 24bdea79-3125-4950-bb38-07fa4a555012 - parentId: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - member: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - memberCount: 2 - channel: dev - count: 2 - limit: 10 - offset: 0 diff --git a/backend/src/api/components/conversation/inputs.yaml b/backend/src/api/components/conversation/inputs.yaml deleted file mode 100644 index 8e3819f7f0..0000000000 --- a/backend/src/api/components/conversation/inputs.yaml +++ /dev/null @@ -1,2 +0,0 @@ -components: - schemas: diff --git a/backend/src/api/components/conversation/models.yaml b/backend/src/api/components/conversation/models.yaml deleted file mode 100644 index 99432ac467..0000000000 --- a/backend/src/api/components/conversation/models.yaml +++ /dev/null @@ -1,81 +0,0 @@ -components: - schemas: - # defines the attributes of a conversation, excluding the ID - ConversationNoId: - type: object - required: - - platform - - slug - - tenantId - - description: A conversation is a group of activities. Some attributes, like slug, are mostly used in public pages. - properties: - title: - description: Title of the conversation - type: string - slug: - description: Unique slug of the conversation - type: string - published: - description: Whether the conversation is publicaly visible from open pages. - type: boolean - default: false - conversationStarter: - description: The conversation starter activity - type: object - additionalProperties: - $ref: '#/components/schemas/Activity' - memberCount: - description: Number of participating members in the conversation. - type: integer - lastActive: - description: Last activity time in the conversation - type: string - format: date-time - createdAt: - description: Date the conversation was created - type: string - format: date-time - updatedAt: - description: Date the conversation was last updated - type: string - format: date-time - tenantId: - description: Your workspace/tenant id - type: string - format: uuid - - xml: - name: Conversation - - # defines a complete conversation, including the ID - Conversation: - allOf: - - $ref: '#/components/schemas/ConversationNoId' - properties: - id: - description: Unique identifier of the conversation - type: string - activities: - description: List of IDs of the activities in the conversation - type: array - items: - type: string - - # Responses - ConversationList: - type: object - properties: - rows: - type: array - items: - $ref: '#/components/schemas/Conversation' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer diff --git a/backend/src/api/components/member/examples.yaml b/backend/src/api/components/member/examples.yaml deleted file mode 100644 index fc7ce57435..0000000000 --- a/backend/src/api/components/member/examples.yaml +++ /dev/null @@ -1,503 +0,0 @@ -components: - examples: - MemberUpsert: - value: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-03T15:17:27.073Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - MemberFind: - value: - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - activities: - - id: 2dcbe40e-36e0-4929-ab21-a30467fd9a65 - type: pull_request-comment - timestamp: '2021-07-27T20:23:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_3 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: Don't worry. I will continue to do it for you. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 2.9098065569996834 - neutral: 25.578168034553528 - negative: 2.241993509232998 - positive: 69.27002668380737 - sentiment: 97 - importHash: null - createdAt: '2022-10-03T15:47:20.151Z' - updatedAt: '2022-10-03T15:47:20.220Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: c39dc046-da1d-4a25-8624-6b78aad00f30 - type: message - timestamp: '2020-06-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '2345' - sourceParentId: '1234' - attributes: - reactions: 68 - channel: dev - body: My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase. - title: null - url: discord.gg/2345 - sentiment: - label: negative - mixed: 5.963129922747612 - neutral: 20.673033595085144 - negative: 69.99874711036682 - positive: 3.365083411335945 - sentiment: 5 - importHash: null - createdAt: '2022-10-03T15:19:30.415Z' - updatedAt: '2022-10-03T15:26:02.599Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: null - parentId: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - type: message - timestamp: '2020-05-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '1234' - sourceParentId: null - attributes: - reactions: 43 - channel: dev - body: It's not magic. It's talend and sweat. - title: null - url: discord.gg/1234 - sentiment: - label: negative - mixed: 1.1410574428737164 - neutral: 11.00325882434845 - negative: 85.99738478660583 - positive: 1.8582981079816818 - sentiment: 2 - importHash: null - createdAt: '2022-10-03T15:18:11.294Z' - updatedAt: '2022-10-03T15:21:49.402Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: null - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - lastActivity: - id: 2dcbe40e-36e0-4929-ab21-a30467fd9a65 - type: pull_request-comment - timestamp: '2021-07-27T20:23:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_3 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: Don't worry. I will continue to do it for you. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 2.9098065569996834 - neutral: 25.578168034553528 - negative: 2.241993509232998 - positive: 69.27002668380737 - sentiment: 97 - importHash: null - createdAt: '2022-10-03T15:47:20.151Z' - updatedAt: '2022-10-03T15:47:20.220Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - lastActive: '2021-07-27T20:23:30.000Z' - activityCount: 3 - averageSentiment: 34.67 - tags: - - id: 38807625-6302-47b5-9f35-58566ddec83b - name: developer - importHash: null - createdAt: '2022-10-05T11:41:20.162Z' - updatedAt: '2022-10-05T11:41:20.162Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: dca36c33-38cd-4e68-8ba8-515167e00971 - name: attended-hooli-con - importHash: null - createdAt: '2022-10-05T11:42:17.414Z' - updatedAt: '2022-10-05T11:42:17.414Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - organizations: - - id: 31bff99a-2eac-49f5-b015-cba95aa6e530 - name: Pied Piper - url: https://piedpiper.io - description: The new internet - emails: - - richard@piedpiper.io - - hello@piedpiper.io - phoneNumbers: null - logo: null - tags: - - new-internet - - making-the-world-a-better-place - - not-like-hooli - twitter: - bio: The internet we deserve - handle: PiedPiper - location: The valley - followers: 5000 - following: 20 - linkedin: - handle: company/PiedPiper - crunchbase: - handle: company/PiedPiper - employees: 50 - revenueRange: - max: 50 - min: 10 - importHash: null - createdAt: '2022-10-03T16:15:21.812Z' - updatedAt: '2022-10-03T16:15:21.812Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - tasks: [] - notes: [] - noMerge: [] - toMerge: [] - - MemberList: - value: - rows: - - id: 2effc566-1932-44f3-a821-2d692933a953 - username: - github: dinesh - twitter: dinesh.chugtai - attributes: - bio: - github: Lead developer at Pied Piper - default: Pakistani Denzel. Tesla and gold chain owner. - twitter: Pakistani Denzel. Tesla and gold chain owner. - url: - github: https://github.com/dinesh - default: https://t.co/d - twitter: https://t.co/d - location: - custom: Silicon Valley - github: Palo alto - default: Silicon Valley - displayName: Dinesh - email: dinesh@piedpiper.io - score: 9 - joinedAt: '2022-10-03T15:30:55.672Z' - importHash: null - reach: - total: 100 - github: 60 - twitter: 40 - createdAt: '2022-10-03T15:30:55.679Z' - updatedAt: '2022-10-05T11:39:58.095Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - identities: - - github - - twitter - activeOn: - - github - activityCount: '2' - lastActive: '2021-07-27T20:22:30.000Z' - averageSentiment: '82.50' - noMerge: [] - toMerge: [] - lastActivity: - id: 73aa13b7-1ef9-4987-a273-e560edff94ca - type: pull_request-comment - timestamp: '2021-07-27T20:22:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_2 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: I will never underestimate my talents again. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 14.308956265449524 - neutral: 14.437079429626465 - negative: 9.826807677745819 - positive: 61.42715811729431 - sentiment: 86 - importHash: null - createdAt: '2022-10-03T15:38:05.847Z' - updatedAt: '2022-10-03T15:46:34.610Z' - deletedAt: null - memberId: 2effc566-1932-44f3-a821-2d692933a953 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - organizations: - - id: 31bff99a-2eac-49f5-b015-cba95aa6e530 - name: Pied Piper - url: https://piedpiper.io - description: The new internet - emails: - - richard@piedpiper.io - - hello@piedpiper.io - phoneNumbers: null - logo: null - tags: - - new-internet - - making-the-world-a-better-place - - not-like-hooli - twitter: - bio: The internet we deserve - handle: PiedPiper - location: The valley - followers: 5000 - following: 20 - linkedin: - handle: company/PiedPiper - crunchbase: - handle: company/PiedPiper - employees: 50 - revenueRange: - max: 50 - min: 10 - importHash: null - createdAt: '2022-10-03T16:15:21.812Z' - updatedAt: '2022-10-03T16:15:21.812Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - tags: - - id: 38807625-6302-47b5-9f35-58566ddec83b - name: developer - importHash: null - createdAt: '2022-10-05T11:41:20.162Z' - updatedAt: '2022-10-05T11:41:20.162Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - activityCount: '3' - lastActive: '2021-07-27T20:23:30.000Z' - averageSentiment: '34.67' - noMerge: [] - toMerge: [] - lastActivity: - id: 2dcbe40e-36e0-4929-ab21-a30467fd9a65 - type: pull_request-comment - timestamp: '2021-07-27T20:23:30.000Z' - platform: github - isContribution: true - score: 3 - sourceId: gh_3 - sourceParentId: gh_1 - attributes: {} - channel: piedpiper - body: Don't worry. I will continue to do it for you. - title: null - url: github.com/piedpiper/piedpier - sentiment: - label: positive - mixed: 2.9098065569996834 - neutral: 25.578168034553528 - negative: 2.241993509232998 - positive: 69.27002668380737 - sentiment: 97 - importHash: null - createdAt: '2022-10-03T15:47:20.151Z' - updatedAt: '2022-10-03T15:47:20.220Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: 291af008-7717-457e-9242-f5c507c8987b - parentId: 462ddc6b-5672-43b2-9018-4e3fd7332228 - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - organizations: - - id: 31bff99a-2eac-49f5-b015-cba95aa6e530 - name: Pied Piper - url: https://piedpiper.io - description: The new internet - emails: - - richard@piedpiper.io - - hello@piedpiper.io - phoneNumbers: null - logo: null - tags: - - new-internet - - making-the-world-a-better-place - - not-like-hooli - twitter: - bio: The internet we deserve - handle: PiedPiper - location: The valley - followers: 5000 - following: 20 - linkedin: - handle: company/PiedPiper - crunchbase: - handle: company/PiedPiper - employees: 50 - revenueRange: - max: 50 - min: 10 - importHash: null - createdAt: '2022-10-03T16:15:21.812Z' - updatedAt: '2022-10-03T16:15:21.812Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - tags: - - id: 38807625-6302-47b5-9f35-58566ddec83b - name: developer - importHash: null - createdAt: '2022-10-05T11:41:20.162Z' - updatedAt: '2022-10-05T11:41:20.162Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: dca36c33-38cd-4e68-8ba8-515167e00971 - name: attended-hooli-con - importHash: null - createdAt: '2022-10-05T11:42:17.414Z' - updatedAt: '2022-10-05T11:42:17.414Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - count: 2 - offset: 0 - limit: 10 diff --git a/backend/src/api/components/member/inputs.yaml b/backend/src/api/components/member/inputs.yaml deleted file mode 100644 index 451e881980..0000000000 --- a/backend/src/api/components/member/inputs.yaml +++ /dev/null @@ -1,70 +0,0 @@ -components: - schemas: - MemberPlatformHelper: - type: object - required: - - platform - properties: - platform: - type: string - description: Platform for which to check member existence. - - MemberOrganizations: - type: object - properties: - organizations: - description: >- - Organizations associated with the member. Each element in the array is the name of the organization, or an organization object. - If the organization does not exist, it will be created. - type: array - items: - $ref: '#/components/schemas/OrganizationNoId' - - MemberOrganizationsUpdate: - type: object - properties: - organizations: - description: >- - Organizations associated with the member. Each element in the array is the name of the organization, or an organization object. - If the organization does not exist, it will be created. - type: array - items: - type: string - - MemberInputRelations: - type: object - properties: - tags: - description: Tags associated with the member. Each element in the array is the ID of the tag. - type: array - items: - type: string - tasks: - description: Tasks associated with the member. Each element in the array is the ID of the task. - type: array - items: - type: string - notes: - description: Notes associated with the member. Each element in the array is the ID of the note. - type: array - items: - type: string - activities: - description: Activities associated with the member. Each element in the array is the ID of the activity. - type: array - items: - type: string - - MemberUpsertInput: - allOf: - - $ref: '#/components/schemas/MemberPlatformHelper' - - $ref: '#/components/schemas/MemberNoId' - - $ref: '#/components/schemas/MemberOrganizations' - - $ref: '#/components/schemas/MemberInputRelations' - - MemberUpdateInput: - allOf: - - $ref: '#/components/schemas/MemberPlatformHelper' - - $ref: '#/components/schemas/MemberNoId' - - $ref: '#/components/schemas/MemberInputRelations' - - $ref: '#/components/schemas/MemberOrganizationsUpdate' diff --git a/backend/src/api/components/member/memberAttributeSettings/examples.yaml b/backend/src/api/components/member/memberAttributeSettings/examples.yaml deleted file mode 100644 index 8de609b41f..0000000000 --- a/backend/src/api/components/member/memberAttributeSettings/examples.yaml +++ /dev/null @@ -1,32 +0,0 @@ -components: - examples: - MemberAttributeSettings: - value: - id: 9eaedce9-1f3a-4a75-adc8-e475cbc47553' - type: 'string' - canDelete: false - show: true - label: 'Url' - name: 'url' - createdAt: '2022-09-07' - updatedAt: '2022-09-07' - tenantId: 'fcd5b9cc-144b-4687-8fd9-34818f35e70d' - - MemberAttributeSettings2: - value: - id: '13bb9e12-c371-44ad-8806-0678c2f53dd1' - type: 'boolean' - canDelete: false - show: true - label: 'is Hireable' - name: 'isHireable' - createdAt: '2022-09-07' - updatedAt: '2022-09-07' - tenantId: 'fcd5b9cc-144b-4687-8fd9-34818f35e70d' - - MemberAttributeSettingsList: - value: - rows: - - $ref: '#/components/examples/MemberAttributeSettings' - - $ref: '#/components/examples/MemberAttributeSettings2' - count: 2 diff --git a/backend/src/api/components/member/memberAttributeSettings/inputs.yaml b/backend/src/api/components/member/memberAttributeSettings/inputs.yaml deleted file mode 100644 index a78edca3d6..0000000000 --- a/backend/src/api/components/member/memberAttributeSettings/inputs.yaml +++ /dev/null @@ -1,21 +0,0 @@ -components: - schemas: - MemberAttributeSettingsCreateInput: - description: >- - A member attribute. - allOf: - - $ref: '#/components/schemas/MemberAttributeSettingsNoId' - - MemberAttributeSettingsUpdateInput: - description: >- - A member attribute. - properties: - label: - description: >- - Human-friendly name of the attribute. Label is unique in workspaces. - type: string - show: - description: >- - Whether to show the member attribute in the web app or not. - type: boolean - default: true diff --git a/backend/src/api/components/member/memberAttributeSettings/models.yaml b/backend/src/api/components/member/memberAttributeSettings/models.yaml deleted file mode 100644 index d32f1d72c4..0000000000 --- a/backend/src/api/components/member/memberAttributeSettings/models.yaml +++ /dev/null @@ -1,52 +0,0 @@ -components: - schemas: - # defines the settings of a member attribute, excluding the ID - MemberAttributeSettingsNoId: - type: object - required: - - label - - type - - description: A member attribute that can be created dynamically. - properties: - label: - description: Human-friendly name of the attribute. Label is unique in workspaces. - type: string - name: - description: Camel-case code friendly name of the attribute. If ommited, name will be generated from the label. Name is unique in workspaces. - type: string - type: - description: Type of the attribute's value - type: string - enum: ['boolean', 'number', 'email', 'string', 'url', 'date'] - - canDelete: - description: If set to false, member attribute can not be deleted in future requests. - type: boolean - default: false - - show: - description: Whether to show the member attribute in the web app or not. - type: boolean - default: true - - createdAt: - description: Date the member attribute was created. - type: string - format: date-time - updatedAt: - description: Date the member attribute was last updated. - type: string - format: date-time - - xml: - name: MemberAttributeSettings - - # defines the settings of a member attribute, including the ID - MemberAttributeSettings: - type: object - allOf: - - $ref: '#/components/schemas/MemberAttributeSettingsNoId' - properties: - id: - description: The attribute settings ID. diff --git a/backend/src/api/components/member/memberAttributeSettings/responses.yaml b/backend/src/api/components/member/memberAttributeSettings/responses.yaml deleted file mode 100644 index d980fe97cf..0000000000 --- a/backend/src/api/components/member/memberAttributeSettings/responses.yaml +++ /dev/null @@ -1,23 +0,0 @@ -components: - schemas: - # defines the response for a list of member attribute settings - MemberAttributeSettingsList: - description: List and count member attribute settings. - type: object - properties: - rows: - description: List of member attribute settings - type: array - items: - $ref: '#/components/schemas/MemberAttributeSettings' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: MemberAttributeSettingsList diff --git a/backend/src/api/components/member/models.yaml b/backend/src/api/components/member/models.yaml deleted file mode 100644 index caaaf71f4d..0000000000 --- a/backend/src/api/components/member/models.yaml +++ /dev/null @@ -1,75 +0,0 @@ -components: - schemas: - # defines a member, excluding the ID - MemberNoId: - description: A member of your community. - type: object - required: - - username - - properties: - username: - description: >- - Usernames of the member in each platform. Exactly one for each platform in which the member is active. -
Example: ```{ github: 'iamgilfoyle', discord: 'gilfoyle '}``` - type: object - additionalProperties: true - displayName: - description: UI friendly name of the member - type: string - emails: - description: Email addresses of the member - type: array - items: - type: string - joinedAt: - description: Date of joining the community - type: string - format: date-time - score: - description: Engagement score of the member. From 0 to 10. Set -1 for not yet calculated. - type: number - reach: - description: >- - Reach of the member in each platform. At most one for each platform in which the member is active. -
Example: ```{ github: 10, twitter: 250, total: 260 }``` - type: object - properties: - total: - description: Sum of all the platform reaches. - type: number - additionalProperties: true - attributes: - description: >- - Attributes associated to the member. Each attribute must be an object with it's value for each platform, and a default. -
For example: ```{"location": {"github": "San Francisco", "twitter": "California", "default": "San Francisco"}}``` - type: object - additionalProperties: - $ref: '#/components/schemas/MemberAttribute' - createdAt: - description: Date the member was created - type: string - format: date-time - updatedAt: - description: Date the member was last updated - type: string - format: date-time - - xml: - name: Member - - # Member attribute - MemberAttribute: - description: >- - A key for each platform. -
- ```default``` is the value that will be displayed by default in the app -
- ```custom``` is the value that will be displayed if the user has set a custom value for the attribute - type: object - properties: - default: - description: Default value for the attribute. This is set automatically according to crowd.dev rules. - type: string - custom: - description: Custom value for the attribute. This is optionally set by the user. It will always be picked as the default when sent. - type: string - additionalProperties: true diff --git a/backend/src/api/components/member/query.yaml b/backend/src/api/components/member/query.yaml deleted file mode 100644 index 3edef18a02..0000000000 --- a/backend/src/api/components/member/query.yaml +++ /dev/null @@ -1,49 +0,0 @@ -components: - schemas: - FilterType: - type: object - additionalProperties: - oneOf: - - type: string - - $ref: '#/components/schemas/FilterType' - - MemberQuery: - description: >- - All the parameters you can use to query members. - - properties: - filter: - description: >- - Filter. Please refer to filter docs. - type: string - format: blob - - orderBy: - type: string - enum: - - activityCount_ASC - - activityCount_DESC - - score_ASC - - score_DESC - - joinedAt_ASC - - joinedAt_DESC - - createdAt_ASC - - createdAt_DESC - - organisation_ASC - - organisation_DESC - - location_ASC - - location_DESC - - limit: - description: >- - Limit the number of records returned. Default is 10. - type: integer - minimum: 1 - maximum: 200 - default: 10 - offset: - description: >- - Offset the number of records returned. Default is 0. - type: integer - minimum: 0 - default: 0 diff --git a/backend/src/api/components/member/responses.yaml b/backend/src/api/components/member/responses.yaml deleted file mode 100644 index 0a658ffb91..0000000000 --- a/backend/src/api/components/member/responses.yaml +++ /dev/null @@ -1,94 +0,0 @@ -components: - schemas: - # Single member - Member: - type: object - allOf: - - $ref: '#/components/schemas/MemberNoId' - properties: - id: - description: The unique identifier for a member of your community. - activityCount: - description: Number of activities performed by the member. - type: integer - lastActivity: - description: Timestamp, type and platform of the last activity performed by the member. - type: object - properties: - type: - description: Type of the last activity - type: string - timestamp: - description: Date and time of the last activity - type: string - format: date-time - platform: - description: Platform of the last activity - type: string - averageSentiment: - description: Average sentiment of the member. From 0 to 100. - type: number - identities: - description: List of platforms the member has identities in. - type: array - items: - type: string - activeOn: - description: List of platforms the member is active on. - type: array - items: - type: string - - MemberRelationsResponse: - description: Relations of a member. - type: object - properties: - tags: - description: Tags associated with the member. - type: array - items: - $ref: '#/components/schemas/Tag' - notes: - description: Notes associated with the member. - type: array - items: - $ref: '#/components/schemas/Note' - tasks: - description: Tasks associated with the member. - type: array - items: - $ref: '#/components/schemas/Task' - organizations: - description: Organizations associated with the member. - type: array - items: - $ref: '#/components/schemas/Organization' - - MemberResponse: - description: A member of your community. - type: object - allOf: - - $ref: '#/components/schemas/Member' - - $ref: '#/components/schemas/MemberRelationsResponse' - - # List - MemberList: - description: List and count of members. - type: object - properties: - rows: - description: List of members - type: array - items: - $ref: '#/components/schemas/MemberResponse' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: MembersList diff --git a/backend/src/api/components/note/examples.yaml b/backend/src/api/components/note/examples.yaml deleted file mode 100644 index 743eea2785..0000000000 --- a/backend/src/api/components/note/examples.yaml +++ /dev/null @@ -1,100 +0,0 @@ -components: - examples: - Note2: - value: - id: 39c850f6-fb96-4d16-8e8c-cd7072e33925 - body: Refused to have a user feedback call - importHash: null - createdAt: '2022-10-03T16:00:57.867Z' - updatedAt: '2022-10-03T16:00:57.867Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: - - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-03T15:17:27.073Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - Note: - value: - id: 196c07da-14e0-419e-bd9a-5f15c721a694 - body: Likes frunks - importHash: null - createdAt: '2022-10-05T11:58:30.977Z' - updatedAt: '2022-10-05T11:58:30.977Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: - - id: 2effc566-1932-44f3-a821-2d692933a953 - username: - github: dinesh - twitter: dinesh.chugtai - attributes: - bio: - github: Lead developer at Pied Piper - default: Pakistani Denzel. Tesla and gold chain owner. - twitter: Pakistani Denzel. Tesla and gold chain owner. - url: - github: https://github.com/dinesh - default: https://t.co/d - twitter: https://t.co/d - location: - custom: Silicon Valley - github: Palo alto - default: Silicon Valley - displayName: Dinesh - email: dinesh@piedpiper.io - score: 9 - joinedAt: '2022-10-03T15:30:55.672Z' - importHash: null - reach: - total: 100 - github: 60 - twitter: 40 - createdAt: '2022-10-03T15:30:55.679Z' - updatedAt: '2022-10-05T11:39:58.095Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - NoteList: - value: - rows: - - $ref: '#/components/examples/Note' - - $ref: '#/components/examples/Note2' - count: 2 - limit: 10 - offset: 0 diff --git a/backend/src/api/components/note/inputs.yaml b/backend/src/api/components/note/inputs.yaml deleted file mode 100644 index d3d0debf7b..0000000000 --- a/backend/src/api/components/note/inputs.yaml +++ /dev/null @@ -1,15 +0,0 @@ -components: - schemas: - NoteInputRelations: - type: object - properties: - members: - description: Members associated with the note. Each element in the array is the ID of the member. - type: array - items: - type: string - - NoteInput: - allOf: - - $ref: '#/components/schemas/NoteNoId' - - $ref: '#/components/schemas/NoteInputRelations' diff --git a/backend/src/api/components/note/models.yaml b/backend/src/api/components/note/models.yaml deleted file mode 100644 index 7ca2a67ef1..0000000000 --- a/backend/src/api/components/note/models.yaml +++ /dev/null @@ -1,22 +0,0 @@ -components: - schemas: - # defines a note, excluding the ID - NoteNoId: - description: A created note. - type: object - properties: - body: - description: The body of the note. - type: string - format: blob - createdAt: - description: Date the note was created. - type: string - format: date-time - updatedAt: - description: Date the note was last updated. - type: string - format: date-time - - xml: - name: Note diff --git a/backend/src/api/components/note/query.yaml b/backend/src/api/components/note/query.yaml deleted file mode 100644 index b28c34f3c2..0000000000 --- a/backend/src/api/components/note/query.yaml +++ /dev/null @@ -1,39 +0,0 @@ -components: - schemas: - FilterType: - type: object - additionalProperties: - oneOf: - - type: string - - $ref: '#/components/schemas/FilterType' - - NoteQuery: - description: >- - All the parameters you can use to query notes. - - properties: - filter: - description: >- - Filter. Please refer to filter docs. - type: string - format: blob - - orderBy: - type: string - enum: - - createdAt_ASC - - createdAt_DESC - - limit: - description: >- - Limit the number of records returned. Default is 10. - type: integer - minimum: 1 - maximum: 200 - default: 10 - offset: - description: >- - Offset the number of records returned. Default is 0. - type: integer - minimum: 0 - default: 0 diff --git a/backend/src/api/components/note/responses.yaml b/backend/src/api/components/note/responses.yaml deleted file mode 100644 index eb2a501768..0000000000 --- a/backend/src/api/components/note/responses.yaml +++ /dev/null @@ -1,53 +0,0 @@ -components: - schemas: - # Single note - Note: - type: object - allOf: - - $ref: '#/components/schemas/NoteNoId' - properties: - id: - description: The ID of the note. - body: - description: The body of the note. - type: string - format: blob - - NoteRelationsResponse: - description: Relations of a note. - type: object - properties: - members: - description: Members associated with the note. - type: array - items: - $ref: '#/components/schemas/Member' - - NoteResponse: - description: A note of your community. - type: object - allOf: - - $ref: '#/components/schemas/Note' - - $ref: '#/components/schemas/NoteRelationsResponse' - - # List - NoteList: - description: List and count of notes. - type: object - properties: - rows: - description: List of notes - type: array - items: - $ref: '#/components/schemas/NoteResponse' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: NotesList diff --git a/backend/src/api/components/organization/examples.yaml b/backend/src/api/components/organization/examples.yaml deleted file mode 100644 index 9c3f1daed8..0000000000 --- a/backend/src/api/components/organization/examples.yaml +++ /dev/null @@ -1,141 +0,0 @@ -components: - examples: - OrganizationCreate: - value: - id: 31bff99a-2eac-49f5-b015-cba95aa6e530 - name: Pied Piper - url: https://piedpiper.io - description: The new internet - emails: - - richard@piedpiper.io - - hello@piedpiper.io - phoneNumbers: null - logo: null - tags: - - new-internet - - making-the-world-a-better-place - - not-like-hooli - twitter: - bio: The internet we deserve - handle: PiedPiper - location: The valley - followers: 5000 - following: 20 - linkedin: - handle: company/PiedPiper - crunchbase: - handle: company/PiedPiper - employees: 50 - revenueRange: - max: 50 - min: 10 - importHash: null - createdAt: '2022-10-03T16:15:21.812Z' - updatedAt: '2022-10-03T16:15:21.812Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - memberCount: 2 - activityCount: 4 - - Organization: - value: - id: 31bff99a-2eac-49f5-b015-cba95aa6e530 - name: Pied Piper - url: https://piedpiper.io - description: The new internet - emails: - - richard@piedpiper.io - - hello@piedpiper.io - phoneNumbers: null - logo: null - tags: - - new-internet - - making-the-world-a-better-place - - not-like-hooli - identities: - - github - - twitter - activeOn: - - github - lastActive: '2022-10-03T16:15:21.812Z' - joinedAt: '2022-05-03T11:16:32.812Z' - twitter: - bio: The internet we deserve - handle: PiedPiper - location: The valley - followers: 5000 - following: 20 - linkedin: - handle: company/PiedPiper - crunchbase: - handle: company/PiedPiper - employees: 50 - revenueRange: - max: 50 - min: 10 - importHash: null - createdAt: '2022-10-03T16:15:21.812Z' - updatedAt: '2022-10-03T16:15:21.812Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - memberCount: 2 - activityCount: 4 - - Organization2: - value: - id: 65257687-0bfa-498e-8b2f-53559f41522b - name: Hooli - url: https://hooli.xyz - description: Hooli is an international corporation founded by Gavin Belson and Peter Gregory - emails: - - gavin@hooli.xyz - phoneNumbers: null - logo: null - tags: - - hooli - - tethics - - not-google - identities: - - devto - - github - - twitter - activeOn: - - devto - lastActive: '2022-10-04' - joinedAt: '2020-01-30' - twitter: - bio: Hooli is an international corporation founded by Gavin Belson and Peter Gregory - handle: hooli - location: Menlo Park - followers: 500000 - following: 0 - linkedin: - handle: company/Hooli - crunchbase: - handle: company/Hooli - employees: 4000 - revenueRange: - max: 500 - min: 100 - importHash: null - createdAt: '2022-10-05T12:03:11.228Z' - updatedAt: '2022-10-05T12:03:11.228Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - memberCount: 0 - activityCount: 0 - - OrganizationList: - value: - rows: - - $ref: '#/components/examples/Organization' - - $ref: '#/components/examples/Organization2' - count: 2 - limit: 10 - offset: 0 diff --git a/backend/src/api/components/organization/inputs.yaml b/backend/src/api/components/organization/inputs.yaml deleted file mode 100644 index 6b8276301b..0000000000 --- a/backend/src/api/components/organization/inputs.yaml +++ /dev/null @@ -1,16 +0,0 @@ -components: - schemas: - OrganizationInputRelations: - type: object - properties: - members: - description: Members associated with the organization. Each element in the array is the ID of the member. - type: array - items: - type: string - format: uuid - - OrganizationInput: - allOf: - - $ref: '#/components/schemas/OrganizationNoId' - - $ref: '#/components/schemas/OrganizationInputRelations' diff --git a/backend/src/api/components/organization/models.yaml b/backend/src/api/components/organization/models.yaml deleted file mode 100644 index 695131f34f..0000000000 --- a/backend/src/api/components/organization/models.yaml +++ /dev/null @@ -1,116 +0,0 @@ -components: - schemas: - # defines a organization, excluding the ID - OrganizationNoId: - description: A created organization. - type: object - required: - - name - properties: - name: - description: The name of the organization. - type: string - url: - description: The URL of the organization. - type: string - description: - description: A short description of the organization. - type: string - format: blob - logo: - description: A URL for logo of the organization. - type: string - emails: - description: The emails for contacting the organization. - type: array - items: - type: string - phoneNumbers: - description: The phone numbers for contacting for the organization. - type: array - items: - type: string - parentUrl: - description: The URL of the parent organization if it has one (for example if it has been acquired). - type: string - tags: - description: Tags associated with the organization. - type: array - items: - type: string - twitter: - description: Twitter information for the organization. - type: object - properties: - handle: - description: The Twitter handle for the organization. - type: string - id: - description: The Twitter ID for the organization. - type: string - bio: - description: The Twitter bio for the organization. - type: string - followers: - description: The number of followers on Twitter. - type: integer - location: - description: The Twitter location for the organization. - type: string - site: - description: The website linked to the organization's Twitter profile. - type: string - avatar: - description: The URL for the organization's Twitter avatar. - type: string - employees: - description: The number of employees of the organization. - type: integer - revenueRange: - description: The estimated revenue range of the organization. - type: object - properties: - min: - description: The minimum estimated revenue of the organization. - type: integer - max: - description: The maximum estimated revenue of the organization. - type: integer - linkedin: - description: 'LinkedIn information for the organization.' - type: object - properties: - handle: - description: The LinkedIn handle for the organization. - type: string - crunchbase: - description: 'Crunchbase information for the organization.' - type: object - properties: - handle: - description: The Crunchbase handle for the organization. - type: string - activeOn: - description: List of platforms the organization members are active on. - type: array - items: - type: string - identities: - description: List of platforms the organization members have identities in. - type: array - items: - type: string - memberCount: - description: Number of members organization has. - type: integer - createdAt: - description: Date the organization was created. - type: string - format: date-time - updatedAt: - description: Date the organization was last updated. - type: string - format: date-time - - xml: - name: Organization diff --git a/backend/src/api/components/organization/query.yaml b/backend/src/api/components/organization/query.yaml deleted file mode 100644 index 14f00224f7..0000000000 --- a/backend/src/api/components/organization/query.yaml +++ /dev/null @@ -1,47 +0,0 @@ -components: - schemas: - FilterType: - type: object - additionalProperties: - oneOf: - - type: string - - $ref: '#/components/schemas/FilterType' - - OrganizationQuery: - description: >- - All the parameters you can use to query organizations. - - properties: - filter: - description: >- - Filter. Please refer to filter docs. - type: string - format: blob - - orderBy: - type: string - enum: - - createdAt_ASC - - createdAt_DESC - - memberCount_ASC - - memberCount_DESC - - activityCount_ASC - - activityCount_DESC - - joinedAt_ASC - - joinedAt_DESC - - lastActive_ASC - - lastActive_DESC - - limit: - description: >- - Limit the number of records returned. Default is 10. - type: integer - minimum: 1 - maximum: 200 - default: 10 - offset: - description: >- - Offset the number of records returned. Default is 0. - type: integer - minimum: 0 - default: 0 diff --git a/backend/src/api/components/organization/responses.yaml b/backend/src/api/components/organization/responses.yaml deleted file mode 100644 index d210b950a5..0000000000 --- a/backend/src/api/components/organization/responses.yaml +++ /dev/null @@ -1,71 +0,0 @@ -components: - schemas: - # Single organization - Organization: - type: object - allOf: - - $ref: '#/components/schemas/OrganizationNoId' - properties: - id: - description: The ID of the organization. - body: - description: The body of the organization. - type: string - format: blob - - OrganizationRelationsResponse: - description: Relations of a organization. - type: object - properties: - members: - description: Members associated with the organization. - type: array - items: - $ref: '#/components/schemas/Member' - activeOn: - description: The platforms where the organization is active. - type: array - items: - type: string - identities: - description: The list of identities of the members in the organization. - type: array - items: - type: string - lastActive: - description: The last time the organization was active. - type: string - format: date-time - joinedAt: - description: The date the first member from the organization joined the community. - type: string - format: date-time - - OrganizationResponse: - description: A organization of your community. - type: object - allOf: - - $ref: '#/components/schemas/Organization' - - $ref: '#/components/schemas/OrganizationRelationsResponse' - - # List - OrganizationList: - description: List and count of organizations. - type: object - properties: - rows: - description: List of organizations - type: array - items: - $ref: '#/components/schemas/OrganizationResponse' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: OrganizationsList diff --git a/backend/src/api/components/parameters.yaml b/backend/src/api/components/parameters.yaml deleted file mode 100644 index 7e28f60f71..0000000000 --- a/backend/src/api/components/parameters.yaml +++ /dev/null @@ -1,70 +0,0 @@ -components: - schemas: - MemberType: - type: string - enum: - - member - MemberScore: - type: integer - minimum: -1 - maximum: 10 - MemberSort: - type: string - enum: - - activitiesCount_ASC - - activitiesCount_DESC - - score_ASC - - score_ASC - - joinedAt_ASC - - joinedAt_DESC - - createdAt_ASC - - createdAt_DESC - - organisation_ASC - - organisation_DESC - - location_ASC - - location_DESC - ActivitySort: - type: string - enum: - - timestamp_DESC - - timestamp_ASC - - createdAt_DESC - - createdAt_ASC - - score_DESC - - score_ASC - - type_DESC - - type_ASC - - platform_DESC - - platform_ASC - - createdBy_DESC - - createdBy_ASC - ConversationSort: - type: string - enum: - - createdAt_DESC - - createdAt_ASC - - activityCount_DESC - - activityCount_ASC - - platform_DESC - - platform_ASC - - channel_DESC - - channel_ASC - - createdBy_DESC - - createdBy_ASC - TagSort: - type: string - enum: - - name_ASC - - name_DESC - - createdAt_DESC - - createdAt_ASC - - MemberAttributeSettingsSort: - type: string - enum: - - label_ASC - - label_DESC - - type_ASC - - type_DESC - - createdAt_DESC - - createdAt_ASC diff --git a/backend/src/api/components/tag/examples.yaml b/backend/src/api/components/tag/examples.yaml deleted file mode 100644 index 621a7de40e..0000000000 --- a/backend/src/api/components/tag/examples.yaml +++ /dev/null @@ -1,130 +0,0 @@ -components: - examples: - Tag: - value: - id: dca36c33-38cd-4e68-8ba8-515167e00971 - name: attended-hooli-con - importHash: null - createdAt: '2022-10-05T11:42:17.414Z' - updatedAt: '2022-10-05T11:42:17.414Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: - - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - Tag2: - value: - id: 38807625-6302-47b5-9f35-58566ddec83b - name: developer - createdAt: '2022-10-05T11:41:20.162Z' - updatedAt: '2022-10-05T11:41:20.162Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: - - id: 2effc566-1932-44f3-a821-2d692933a953 - username: - github: dinesh - twitter: dinesh.chugtai - attributes: - bio: - github: Lead developer at Pied Piper - default: Pakistani Denzel. Tesla and gold chain owner. - twitter: Pakistani Denzel. Tesla and gold chain owner. - url: - github: https://github.com/dinesh - default: https://t.co/d - twitter: https://t.co/d - location: - custom: Silicon Valley - github: Palo alto - default: Silicon Valley - displayName: Dinesh - email: dinesh@piedpiper.io - score: 9 - joinedAt: '2022-10-03T15:30:55.672Z' - reach: - total: 100 - github: 60 - twitter: 40 - createdAt: '2022-10-03T15:30:55.679Z' - updatedAt: '2022-10-05T11:39:58.095Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: 8 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-05T11:40:32.560Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - TagList: - value: - rows: - - $ref: '#/components/examples/Tag' - - $ref: '#/components/examples/Tag2' - count: 2 - limit: 10 - offset: 0 diff --git a/backend/src/api/components/tag/models.yaml b/backend/src/api/components/tag/models.yaml deleted file mode 100644 index 6cbdd74c61..0000000000 --- a/backend/src/api/components/tag/models.yaml +++ /dev/null @@ -1,59 +0,0 @@ -components: - schemas: - # defines the attributes of a tag, excluding the ID. - TagNoId: - description: A tag associated with a member. - type: object - required: - - name - - tenantId - properties: - name: - description: The name of the tag - type: string - createdAt: - description: Date the tag was created - type: string - format: date-time - updatedAt: - description: Date the tag was last updated - type: string - format: date-time - tenantId: - description: Your workspace/tenant id - type: string - format: uuid - - xml: - name: Tag - - # Defines a complete tag, including the ID. - Tag: - type: object - allOf: - - $ref: '#/components/schemas/TagNoId' - properties: - id: - description: The unique identifier for a tag. - - # Responses: - TagList: - description: List and count of tags. - type: object - properties: - rows: - description: List of tags - type: array - items: - $ref: '#/components/schemas/Tag' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: TagsList diff --git a/backend/src/api/components/task/examples.yaml b/backend/src/api/components/task/examples.yaml deleted file mode 100644 index b5f680467c..0000000000 --- a/backend/src/api/components/task/examples.yaml +++ /dev/null @@ -1,113 +0,0 @@ -components: - examples: - Task: - value: - id: 8a127785-f11d-4102-804d-5b79ccddd4cc - name: Ask for tips on building a new Anton - body: null - status: null - dueDate: '2022-05-27T15:13:30.000Z' - importHash: null - createdAt: '2022-10-03T16:00:18.701Z' - updatedAt: '2022-10-03T16:00:18.701Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - assignedToId: null - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: - - id: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - username: - github: gilfoyle - twitter: gilfoyle - attributes: - bio: - github: Systems engineer at Pied Piper - default: It's not magic. It's talent and sweat - twitter: It's not magic. It's talent and sweat - url: - github: https://github.com/gilfoyle - default: https://t.co/g - twitter: https://t.co/g - location: - custom: Erlich's house - github: Palo alto - default: Erlich's house - displayName: Gilfoyle - email: gilfoyle@piedpiper.io - score: -1 - joinedAt: '2022-10-03T15:17:03.540Z' - importHash: null - reach: - total: 10000 - github: 5000 - twitter: 5000 - createdAt: '2022-10-03T15:17:03.547Z' - updatedAt: '2022-10-03T15:17:27.073Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - activities: [] - - Task2: - value: - id: ef22fb05-a41b-472e-9917-a4d10d19fcc6 - name: Ask if we can use as quote - body: null - status: null - dueDate: '2022-08-27T00:00:00.000Z' - importHash: null - createdAt: '2022-10-05T11:55:55.606Z' - updatedAt: '2022-10-05T11:55:55.606Z' - deletedAt: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - assignedToId: null - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - members: [] - activities: - - id: 782b426d-adc8-4fb4-a4ee-ab0bb07ffca0 - type: message - timestamp: '2020-05-27T15:13:30.000Z' - platform: discord - isContribution: true - score: 1 - sourceId: '1234' - sourceParentId: null - attributes: - reactions: 43 - channel: dev - body: It's not magic. It's talend and sweat. - title: null - url: discord.gg/1234 - sentiment: - label: negative - mixed: 1.1410574428737164 - neutral: 11.00325882434845 - negative: 85.99738478660583 - positive: 1.8582981079816818 - sentiment: 2 - importHash: null - createdAt: '2022-10-03T15:18:11.294Z' - updatedAt: '2022-10-03T15:21:49.402Z' - deletedAt: null - memberId: ab7a9fe9-4576-46b1-a710-8b8eaeff87a5 - conversationId: null - parentId: null - tenantId: 8642a2bd-965e-4acd-be8c-dfedc83ef0af - createdById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - updatedById: debc3c7f-4c5d-4bec-9130-17bb0aea8b75 - - TaskList: - value: - rows: - - $ref: '#/components/examples/Task' - - $ref: '#/components/examples/Task2' - count: 2 - limit: 10 - offset: 0 - - TaskFindAndUpdateAll: - value: - rowsUpdated: 5 diff --git a/backend/src/api/components/task/inputs.yaml b/backend/src/api/components/task/inputs.yaml deleted file mode 100644 index 93c55eb398..0000000000 --- a/backend/src/api/components/task/inputs.yaml +++ /dev/null @@ -1,52 +0,0 @@ -components: - schemas: - TaskInputRelations: - type: object - properties: - members: - description: Members associated with the task. Each element in the array is the ID of the member. - type: array - items: - type: string - format: uuid - - activities: - description: Activities associated with the task. Each element in the array is the ID of the activity. - type: array - items: - type: string - format: uuid - - assignees: - description: Users assigned with the task. Each element in the array is the ID of the user. - type: string - format: uuid - default: null - - TaskInput: - allOf: - - $ref: '#/components/schemas/TaskNoId' - - $ref: '#/components/schemas/TaskInputRelations' - - TaskBatchInput: - type: object - properties: - operation: - description: Batch operation name. - type: string - enum: - - findAndUpdateAll - payload: - type: object - description: Payload to send to the batch operation - properties: - filter: - description: >- - Filter to select the task entities. Please refer to filter docs. - type: string - format: blob - - update: - description: >- - key value object with desired updated fields. - type: object diff --git a/backend/src/api/components/task/models.yaml b/backend/src/api/components/task/models.yaml deleted file mode 100644 index 1a527b2f6b..0000000000 --- a/backend/src/api/components/task/models.yaml +++ /dev/null @@ -1,32 +0,0 @@ -components: - schemas: - # defines a task, excluding the ID - TaskNoId: - description: A created task. - type: object - properties: - name: - description: The name of the task. - type: string - body: - description: The body of the task. - type: string - format: blob - status: - description: The status of the task. - type: string - enum: - - in-progress - - done - default: null - createdAt: - description: Date the task was created. - type: string - format: date-time - updatedAt: - description: Date the task was last updated. - type: string - format: date-time - - xml: - name: Task diff --git a/backend/src/api/components/task/query.yaml b/backend/src/api/components/task/query.yaml deleted file mode 100644 index e8ed2dbf68..0000000000 --- a/backend/src/api/components/task/query.yaml +++ /dev/null @@ -1,39 +0,0 @@ -components: - schemas: - FilterType: - type: object - additionalProperties: - oneOf: - - type: string - - $ref: '#/components/schemas/FilterType' - - TaskQuery: - description: >- - All the parameters you can use to query tasks. - - properties: - filter: - description: >- - Filter. Please refer to filter docs. - type: string - format: blob - - orderBy: - type: string - enum: - - createdAt_ASC - - createdAt_DESC - - limit: - description: >- - Limit the number of records returned. Default is 10. - type: integer - minimum: 1 - maximum: 200 - default: 10 - offset: - description: >- - Offset the number of records returned. Default is 0. - type: integer - minimum: 0 - default: 0 diff --git a/backend/src/api/components/task/responses.yaml b/backend/src/api/components/task/responses.yaml deleted file mode 100644 index 4ed2827cb1..0000000000 --- a/backend/src/api/components/task/responses.yaml +++ /dev/null @@ -1,71 +0,0 @@ -components: - schemas: - # Single task - Task: - type: object - allOf: - - $ref: '#/components/schemas/TaskNoId' - properties: - id: - description: The ID of the task. - body: - description: The body of the task. - type: string - format: blob - - TaskRelationsResponse: - description: Relations of a task. - type: object - properties: - members: - description: Members associated with the task. - type: array - items: - $ref: '#/components/schemas/Member' - - activities: - description: Activities associated with the task. - type: array - items: - $ref: '#/components/schemas/Activity' - - assignedTo: - description: The workspace member assigned to the task. - $ref: '#/components/schemas/Member' - - TaskResponse: - description: A task of your community. - type: object - allOf: - - $ref: '#/components/schemas/Task' - - $ref: '#/components/schemas/TaskRelationsResponse' - - # List - TaskList: - description: List and count of tasks. - type: object - properties: - rows: - description: List of tasks - type: array - items: - $ref: '#/components/schemas/TaskResponse' - count: - description: Count - type: integer - limit: - description: Limit of records returned - type: integer - offset: - description: Offset, for pagination - type: integer - xml: - name: TasksList - - TaskFindAndUpdateAll: - description: Returns number of tasks updated - type: object - properties: - rowsUpdated: - description: Number of tasks updated - type: integer diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 1fe19fe6a3..418c4bc110 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -7,26 +7,22 @@ import * as http from 'http' import os from 'os' import { QueryTypes } from 'sequelize' -import { SERVICE } from '@crowd/common' import { getDbConnection } from '@crowd/data-access-layer/src/database' -import { getUnleashClient } from '@crowd/feature-flags' import { getServiceLogger } from '@crowd/logging' import { getOpensearchClient } from '@crowd/opensearch' import { RedisPubSubReceiver, getRedisClient, getRedisPubSubPair } from '@crowd/redis' import { telemetryExpressMiddleware } from '@crowd/telemetry' import { Client as TemporalClient, getTemporalClient } from '@crowd/temporal' -import { ApiWebsocketMessage, Edition } from '@crowd/types' +import { ApiWebsocketMessage } from '@crowd/types' import SequelizeRepository from '@/database/repositories/sequelizeRepository' import { productDatabaseMiddleware } from '@/middlewares/productDbMiddleware' import { - API_CONFIG, OPENSEARCH_CONFIG, PRODUCT_DB_CONFIG, REDIS_CONFIG, TEMPORAL_CONFIG, - UNLEASH_CONFIG, } from '../conf' import { authMiddleware } from '../middlewares/authMiddleware' import { databaseMiddleware } from '../middlewares/databaseMiddleware' @@ -39,7 +35,6 @@ import { responseHandlerMiddleware } from '../middlewares/responseHandlerMiddlew import { segmentMiddleware } from '../middlewares/segmentMiddleware' import { tenantMiddleware } from '../middlewares/tenantMiddleware' -import setupSwaggerUI from './apiDocumentation' import { createRateLimiter } from './apiRateLimiter' import authSocial from './auth/authSocial' import WebSockets from './websockets' @@ -126,20 +121,6 @@ setImmediate(async () => { // bind opensearch app.use(opensearchMiddleware(opensearch)) - // Bind unleash to request - if (UNLEASH_CONFIG.url && API_CONFIG.edition === Edition.CROWD_HOSTED) { - const unleash = await getUnleashClient({ - url: UNLEASH_CONFIG.url, - apiKey: UNLEASH_CONFIG.backendApiKey, - appName: SERVICE, - }) - - app.use((req: any, res, next) => { - req.unleash = unleash - next() - }) - } - // temp check for production if (TEMPORAL_CONFIG.serverUrl) { // Bind temporal to request @@ -163,9 +144,6 @@ setImmediate(async () => { // to set the currentUser to the requests app.use(authMiddleware) - // Setup the Documentation - setupSwaggerUI(app) - // Default rate limiter const defaultRateLimiter = createRateLimiter({ max: 200, @@ -178,25 +156,6 @@ setImmediate(async () => { // increase security. app.use(helmet()) - app.use( - bodyParser.json({ - limit: '5mb', - verify(req: any, res, buf) { - try { - const url = req.originalUrl - if (url.startsWith('/webhooks/stripe') || url.startsWith('/webhooks/sendgrid')) { - // Stripe and sendgrid webhooks needs the body raw - // for verifying the webhook with signing secret - req.rawBody = buf.toString() - } - } catch (err) { - serviceLogger.error(err, 'Error while verifying request body for strip/sendgrid webhook!') - throw err - } - }, - }), - ) - app.use(bodyParser.urlencoded({ limit: '5mb', extended: true })) app.use((req, res, next) => { @@ -236,7 +195,6 @@ setImmediate(async () => { require('./eagleEyeContent').default(routes) require('./automation').default(routes) require('./task').default(routes) - require('./note').default(routes) require('./organization').default(routes) require('./quickstart-guide').default(routes) require('./slack').default(routes) @@ -253,9 +211,6 @@ setImmediate(async () => { app.use('/', routes) - const webhookRoutes = express.Router() - require('./webhooks').default(webhookRoutes) - app.use('/health', async (req: any, res) => { try { const seq = SequelizeRepository.getSequelize(req) @@ -288,8 +243,6 @@ setImmediate(async () => { } }) - app.use('/webhooks', webhookRoutes) - app.use(errorMiddleware) }) diff --git a/backend/src/api/note/index.ts b/backend/src/api/note/index.ts deleted file mode 100644 index f744207e34..0000000000 --- a/backend/src/api/note/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - app.post(`/tenant/:tenantId/note/query`, safeWrap(require('./noteQuery').default)) - app.post(`/tenant/:tenantId/note`, safeWrap(require('./noteCreate').default)) - app.put(`/tenant/:tenantId/note/:id`, safeWrap(require('./noteUpdate').default)) - app.post(`/tenant/:tenantId/note/import`, safeWrap(require('./noteImport').default)) - app.delete(`/tenant/:tenantId/note`, safeWrap(require('./noteDestroy').default)) - app.get(`/tenant/:tenantId/note/autocomplete`, safeWrap(require('./noteAutocomplete').default)) - app.get(`/tenant/:tenantId/note`, safeWrap(require('./noteList').default)) - app.get(`/tenant/:tenantId/note/:id`, safeWrap(require('./noteFind').default)) -} diff --git a/backend/src/api/note/noteAutocomplete.ts b/backend/src/api/note/noteAutocomplete.ts deleted file mode 100644 index 17ff10de69..0000000000 --- a/backend/src/api/note/noteAutocomplete.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskAutocomplete) - - const payload = await new TaskService(req).findAllAutocomplete(req.query.query, req.query.limit) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteCreate.ts b/backend/src/api/note/noteCreate.ts deleted file mode 100644 index 90f2a1bdd7..0000000000 --- a/backend/src/api/note/noteCreate.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/note - * @summary Create a note - * @tag Notes - * @security Bearer - * @description Create a note - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {NoteNoId} application/json - * @response 200 - Ok - * @responseContent {Note} 200.application/json - * @responseExample {Note} 200.application/json.Note - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteCreate) - - const payload = await new NoteService(req).create(req.body) - - track('Note Created', { ...req.body }, { ...req }) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteDestroy.ts b/backend/src/api/note/noteDestroy.ts deleted file mode 100644 index 7ed41f5aba..0000000000 --- a/backend/src/api/note/noteDestroy.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * DELETE /tenant/{tenantId}/note/{id} - * @summary Delete a note - * @tag Notes - * @security Bearer - * @description Delete a note. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} id - The ID of the note - * @response 200 - Ok - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteDestroy) - - await new NoteService(req).destroyAll(req.query.ids) - - const payload = true - - track('Note Destroyed', { noteIds: req.query.ids }, { ...req }) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteFind.ts b/backend/src/api/note/noteFind.ts deleted file mode 100644 index f264a53cc7..0000000000 --- a/backend/src/api/note/noteFind.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Permissions from '../../security/permissions' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * GET /tenant/{tenantId}/note/{id} - * @summary Find a note - * @tag Notes - * @security Bearer - * @description Find a note by ID. - * @pathParam {string} tenantId - Your workspace/tenant ID. - * @pathParam {string} id - The ID of the note. - * @response 200 - Ok - * @responseContent {NoteResponse} 200.application/json - * @responseExample {Note} 200.application/json.Note - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteRead) - - const payload = await new NoteService(req).findById(req.params.id) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteImport.ts b/backend/src/api/note/noteImport.ts deleted file mode 100644 index 53ce5d5ef6..0000000000 --- a/backend/src/api/note/noteImport.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Permissions from '../../security/permissions' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteImport) - - await new NoteService(req).import(req.body, req.body.importHash) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteList.ts b/backend/src/api/note/noteList.ts deleted file mode 100644 index 28e6ab40db..0000000000 --- a/backend/src/api/note/noteList.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteRead) - - const payload = await new NoteService(req).findAndCountAll(req.query) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteQuery.ts b/backend/src/api/note/noteQuery.ts deleted file mode 100644 index 534b3e056e..0000000000 --- a/backend/src/api/note/noteQuery.ts +++ /dev/null @@ -1,31 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/note/query - * @summary Query notes - * @tag Notes - * @security Bearer - * @description Query notes. It accepts filters, sorting options and pagination. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {NoteQuery} application/json - * @response 200 - Ok - * @responseContent {NoteList} 200.application/json - * @responseExample {NoteList} 200.application/json.Note - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteRead) - - const payload = await new NoteService(req).query(req.body) - - if (req.body?.filter && Object.keys(req.body.filter).length > 0) { - track('Notes Advanced Filter', { ...req.body }, { ...req }) - } - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/note/noteUpdate.ts b/backend/src/api/note/noteUpdate.ts deleted file mode 100644 index d8e72c12f4..0000000000 --- a/backend/src/api/note/noteUpdate.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import NoteService from '../../services/noteService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * PUT /tenant/{tenantId}/note/{id} - * @summary Update a note - * @tag Notes - * @security Bearer - * @description Update a note - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} id - The ID of the note - * @bodyContent {NoteInput} application/json - * @response 200 - Ok - * @responseContent {Note} 200.application/json - * @responseExample {Note} 200.application/json.Note - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.noteEdit) - - const payload = await new NoteService(req).update(req.params.id, req.body) - - track('Note Updated', { id: payload.id, data: req.body }, { ...req }) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/plan/index.ts b/backend/src/api/plan/index.ts deleted file mode 100644 index 0a7dd01433..0000000000 --- a/backend/src/api/plan/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - app.post(`/plan/stripe/webhook`, safeWrap(require('./stripe/webhook').default)) - app.post(`/tenant/:tenantId/plan/stripe/portal`, safeWrap(require('./stripe/portal').default)) - app.post(`/tenant/:tenantId/plan/stripe/checkout`, safeWrap(require('./stripe/checkout').default)) -} diff --git a/backend/src/api/plan/stripe/checkout.ts b/backend/src/api/plan/stripe/checkout.ts deleted file mode 100644 index df5303a733..0000000000 --- a/backend/src/api/plan/stripe/checkout.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Error400, Error403 } from '@crowd/common' -import { TenantPlans } from '@crowd/types' - -import { PLANS_CONFIG } from '../../../conf' -import Plans from '../../../security/plans' -import TenantService from '../../../services/tenantService' -import { tenantSubdomain } from '../../../services/tenantSubdomain' - -export default async (req, res) => { - if (!PLANS_CONFIG.stripeSecretKey) { - throw new Error400(req.language, 'tenant.stripeNotConfigured') - } - - const stripe = require('stripe')(PLANS_CONFIG.stripeSecretKey) - - const { currentTenant } = req - const { currentUser } = req - - if (!currentTenant || !currentUser) { - throw new Error403(req.language) - } - - if ( - currentTenant.plan !== TenantPlans.Essential && - currentTenant.planStatus !== 'cancel_at_period_end' && - currentTenant.planUserId !== currentUser.id - ) { - throw new Error403(req.language) - } - - let { planStripeCustomerId } = currentTenant - - if (!planStripeCustomerId || currentTenant.planUserId !== currentUser.id) { - const stripeCustomer = await stripe.customers.create({ - email: currentUser.email, - metadata: { - tenantId: currentTenant.id, - }, - }) - - planStripeCustomerId = stripeCustomer.id - } - - await new TenantService(req).updatePlanUser( - currentTenant.id, - planStripeCustomerId, - currentUser.id, - ) - - const session = await stripe.checkout.sessions.create({ - payment_method_types: ['card'], - line_items: [ - { - price: Plans.selectStripePriceIdByPlan(req.body.plan), - quantity: 1, - }, - ], - mode: 'subscription', - success_url: `${tenantSubdomain.frontendUrl(currentTenant)}/plan`, - cancel_url: `${tenantSubdomain.frontendUrl(currentTenant)}/plan`, - customer: planStripeCustomerId, - }) - - await req.responseHandler.success(req, res, session) -} diff --git a/backend/src/api/plan/stripe/portal.ts b/backend/src/api/plan/stripe/portal.ts deleted file mode 100644 index 36c7893eab..0000000000 --- a/backend/src/api/plan/stripe/portal.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Error400, Error403 } from '@crowd/common' -import { TenantPlans } from '@crowd/types' - -import { PLANS_CONFIG } from '../../../conf' -import TenantService from '../../../services/tenantService' -import { tenantSubdomain } from '../../../services/tenantSubdomain' - -export default async (req, res) => { - if (!PLANS_CONFIG.stripeSecretKey) { - throw new Error400(req.language, 'tenant.stripeNotConfigured') - } - - const stripe = require('stripe')(PLANS_CONFIG.stripeSecretKey) - - const { currentTenant } = req - const { currentUser } = req - - if (!currentTenant || !currentUser) { - throw new Error403(req.language) - } - - if ( - currentTenant.plan !== TenantPlans.Essential && - currentTenant.planStatus !== 'cancel_at_period_end' && - currentTenant.planUserId !== currentUser.id - ) { - throw new Error403(req.language) - } - - let { planStripeCustomerId } = currentTenant - - if (!planStripeCustomerId || currentTenant.planUserId !== currentUser.id) { - const stripeCustomer = await stripe.customers.create({ - email: currentUser.email, - metadata: { - tenantId: currentTenant.id, - }, - }) - - planStripeCustomerId = stripeCustomer.id - } - - await new TenantService(req).updatePlanUser( - currentTenant.id, - planStripeCustomerId, - currentUser.id, - ) - - const session = await stripe.billingPortal.sessions.create({ - customer: planStripeCustomerId, - return_url: `${tenantSubdomain.frontendUrl(currentTenant)}/plan`, - }) - - await req.responseHandler.success(req, res, session) -} diff --git a/backend/src/api/plan/stripe/webhook.ts b/backend/src/api/plan/stripe/webhook.ts deleted file mode 100644 index f8656bb20e..0000000000 --- a/backend/src/api/plan/stripe/webhook.ts +++ /dev/null @@ -1,61 +0,0 @@ -import lodash from 'lodash' - -import { PLANS_CONFIG } from '../../../conf' -import Plans from '../../../security/plans' -import TenantService from '../../../services/tenantService' - -export default async (req, res) => { - const stripe = require('stripe')(PLANS_CONFIG.stripeSecretKey) - - const event = stripe.webhooks.constructEvent( - req.rawBody, - req.headers['stripe-signature'], - PLANS_CONFIG.stripWebhookSigningSecret, - ) - - if (event.type === 'checkout.session.completed') { - let data = event.data.object - data = await stripe.checkout.sessions.retrieve(data.id, { expand: ['line_items'] }) - - const stripePriceId = lodash.get(data, 'line_items.data[0].price.id') - - if (!stripePriceId) { - throw new Error('line_items.data[0].price.id NULL!') - } - - const plan = Plans.selectPlanByStripePriceId(stripePriceId) - const planStripeCustomerId = data.customer - - await new TenantService(req).updatePlanStatus(planStripeCustomerId, plan, 'active') - } - - if (event.type === 'customer.subscription.updated') { - const data = event.data.object - - const stripePriceId = lodash.get(data, 'items.data[0].price.id') - const plan = Plans.selectPlanByStripePriceId(stripePriceId) - const planStripeCustomerId = data.customer - - if (Plans.selectPlanStatus(data) === 'canceled') { - await new TenantService(req).updatePlanToFree(planStripeCustomerId) - } else { - await new TenantService(req).updatePlanStatus( - planStripeCustomerId, - plan, - Plans.selectPlanStatus(data), - ) - } - } - - if (event.type === 'customer.subscription.deleted') { - const data = event.data.object - - const planStripeCustomerId = data.customer - - await new TenantService(req).updatePlanToFree(planStripeCustomerId) - } - - await req.responseHandler.success(req, res, { - received: true, - }) -} diff --git a/backend/src/api/tenant/index.ts b/backend/src/api/tenant/index.ts index f1e2add552..b4b21494e2 100644 --- a/backend/src/api/tenant/index.ts +++ b/backend/src/api/tenant/index.ts @@ -21,8 +21,6 @@ export default (app) => { `/tenant/:tenantId/organizationsToMerge`, safeWrap(require('./tenantOrganizationsToMerge').default), ) - app.post(`/tenant/:tenantId/sampleData`, safeWrap(require('./tenantGenerateSampleData').default)) - app.delete(`/tenant/:tenantId/sampleData`, safeWrap(require('./tenantDeleteSampleData').default)) app.post( `/tenant/:tenantId/viewOrganizations`, safeWrap(require('./tenantViewOrganizations').default), diff --git a/backend/src/api/tenant/tenantDeleteSampleData.ts b/backend/src/api/tenant/tenantDeleteSampleData.ts deleted file mode 100644 index 6f85c28600..0000000000 --- a/backend/src/api/tenant/tenantDeleteSampleData.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Error403, i18n } from '@crowd/common' - -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import SampleDataService from '../../services/sampleDataService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - if (!req.currentUser || !req.currentUser.id) { - throw new Error403(req.language) - } - - new PermissionChecker(req).validateHas(Permissions.values.memberDestroy) - - await new SampleDataService(req).deleteSampleData() - - track('Delete sample data', {}, { ...req }) - - req.responseHandler.success(req, res, { - message: i18n(req.language, 'tenant.sampleDataDeletionCompleted'), - }) -} diff --git a/backend/src/api/tenant/tenantGenerateSampleData.ts b/backend/src/api/tenant/tenantGenerateSampleData.ts deleted file mode 100644 index 682ce260f8..0000000000 --- a/backend/src/api/tenant/tenantGenerateSampleData.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Error403, i18n } from '@crowd/common' - -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import SampleDataService from '../../services/sampleDataService' -import PermissionChecker from '../../services/user/permissionChecker' - -const fs = require('fs') -const path = require('path') - -export default async (req, res) => { - if (!req.currentUser || !req.currentUser.id) { - throw new Error403(req.language) - } - - new PermissionChecker(req).validateHas(Permissions.values.memberCreate) - - const sampleMembersActivities = JSON.parse( - fs.readFileSync( - path.resolve(__dirname, '../../database/initializers/sample-data.json'), - 'utf8', - ), - ) - - track('Generate sample data', {}, { ...req }) - - await req.responseHandler.success(req, res, { - message: i18n(req.language, 'tenant.sampleDataCreationStarted'), - }) - - await new SampleDataService(req).generateSampleData(sampleMembersActivities) -} diff --git a/backend/src/api/webhooks/discourse.ts b/backend/src/api/webhooks/discourse.ts deleted file mode 100644 index 88896555fa..0000000000 --- a/backend/src/api/webhooks/discourse.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { PlatformType } from '@crowd/types' - -import { getIntegrationStreamWorkerEmitter } from '@/serverless/utils/queueService' - -import IncomingWebhookRepository from '../../database/repositories/incomingWebhookRepository' -import IntegrationRepository from '../../database/repositories/integrationRepository' -import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import { WebhookType } from '../../types/webhooks' -import { verifyWebhookSignature } from '../../utils/crypto' - -export default async (req, res) => { - const signature = req.headers['x-discourse-event-signature'] - const eventId = req.headers['x-discourse-event-id'] - const eventType = req.headers['x-discourse-event-type'] - const event = req.headers['x-discourse-event'] - const data = req.body - - let integration - - try { - integration = await IntegrationRepository.findActiveIntegrationByPlatform( - PlatformType.DISCOURSE, - req.params.tenantId, - ) - } catch (error) { - req.log.error({ error }, 'Internal error when verifying Discourse webhook') - await req.responseHandler.success( - req, - res, - 'Internal error when verifying Discourse webhook', - 200, - ) - return - } - - if (integration) { - try { - if (!signature) { - req.log.error({ signature }, 'Discourse Webhook signature header missing!') - await req.responseHandler.success( - req, - res, - 'Discourse Webhook signature header missing!', - 200, - ) - return - } - - if ( - !verifyWebhookSignature(JSON.stringify(data), integration.settings.webhookSecret, signature) - ) { - req.log.error({ signature }, 'Discourse Webhook signature verification failed!') - await req.responseHandler.success( - req, - res, - 'Discourse Webhook signature verification failed!', - 200, - ) - return - } - } catch (error) { - req.log.error({ signature, error }, 'Internal error when verifying discourse webhook') - await req.responseHandler.success( - req, - res, - 'Internal error when verifying discourse webhook', - 200, - ) - return - } - - req.log.info({ integrationId: integration.id }, 'Incoming Discourse Webhook!') - const options = await SequelizeRepository.getDefaultIRepositoryOptions() - const repo = new IncomingWebhookRepository(options) - - const result = await repo.create({ - tenantId: integration.tenantId, - integrationId: integration.id, - type: WebhookType.DISCOURSE, - payload: { - signature, - eventId, - eventType, - event, - data, - }, - }) - - const streamEmitter = await getIntegrationStreamWorkerEmitter() - - await streamEmitter.triggerWebhookProcessing( - integration.tenantId, - integration.platform, - result.id, - ) - - await req.responseHandler.success(req, res, {}, 204) - } else { - req.log.error( - { tenantId: req?.params?.tenantId }, - 'No integration found for incoming Discourse Webhook!', - ) - await req.responseHandler.success(req, res, {}, 200) - } -} diff --git a/backend/src/api/webhooks/github.ts b/backend/src/api/webhooks/github.ts deleted file mode 100644 index 224fb9158e..0000000000 --- a/backend/src/api/webhooks/github.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { PlatformType } from '@crowd/types' - -import { getIntegrationStreamWorkerEmitter } from '@/serverless/utils/queueService' - -import IncomingWebhookRepository from '../../database/repositories/incomingWebhookRepository' -import IntegrationRepository from '../../database/repositories/integrationRepository' -import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import { WebhookType } from '../../types/webhooks' - -export default async (req, res) => { - const signature = req.headers['x-hub-signature'] - const event = req.headers['x-github-event'] - const data = req.body - - const identifier = data.installation.id.toString() - const integration = (await IntegrationRepository.findByIdentifier( - identifier, - PlatformType.GITHUB, - )) as any - - if (integration) { - const options = await SequelizeRepository.getDefaultIRepositoryOptions() - const repo = new IncomingWebhookRepository(options) - - const result = await repo.create({ - tenantId: integration.tenantId, - integrationId: integration.id, - type: WebhookType.GITHUB, - payload: { - signature, - event, - data, - }, - }) - - const streamEmitter = await getIntegrationStreamWorkerEmitter() - - await streamEmitter.triggerWebhookProcessing( - integration.tenantId, - integration.platform, - result.id, - ) - - await req.responseHandler.success(req, res, {}, 204) - } else { - req.log.error({ identifier }, 'No integration found for incoming GitHub Webhook!') - await req.responseHandler.success(req, res, {}, 200) - } -} diff --git a/backend/src/api/webhooks/index.ts b/backend/src/api/webhooks/index.ts deleted file mode 100644 index b80270454c..0000000000 --- a/backend/src/api/webhooks/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - // app.post(`/github`, safeWrap(require('./github').default)) - app.post(`/stripe`, safeWrap(require('./stripe').default)) - app.post(`/sendgrid`, safeWrap(require('./sendgrid').default)) -} diff --git a/backend/src/api/webhooks/sendgrid.ts b/backend/src/api/webhooks/sendgrid.ts deleted file mode 100644 index 3c06690bcd..0000000000 --- a/backend/src/api/webhooks/sendgrid.ts +++ /dev/null @@ -1,10 +0,0 @@ -import sendgridWebhookWorker from '../../serverless/integrations/workers/sendgridWebhookWorker' - -export default async (req, res) => { - const out = await sendgridWebhookWorker(req) - let status = 200 - if (out.status === 204) { - status = 204 - } - await req.responseHandler.success(req, res, out, status) -} diff --git a/backend/src/api/webhooks/stripe.ts b/backend/src/api/webhooks/stripe.ts deleted file mode 100644 index dbce9b44c0..0000000000 --- a/backend/src/api/webhooks/stripe.ts +++ /dev/null @@ -1,10 +0,0 @@ -import stripeWebhookWorker from '../../serverless/integrations/workers/stripeWebhookWorker' - -export default async (req, res) => { - const out = await stripeWebhookWorker(req) - let status = 200 - if (out.status === 204) { - status = 204 - } - await req.responseHandler.success(req, res, out, status) -} diff --git a/backend/src/bin/discord-ws.ts b/backend/src/bin/discord-ws.ts deleted file mode 100644 index ebb1444a31..0000000000 --- a/backend/src/bin/discord-ws.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { Client, Events, GatewayIntentBits, MessageType } from 'discord.js' -import fs from 'fs' -import moment from 'moment' -import path from 'path' -import { QueryTypes, Sequelize } from 'sequelize' - -import { processPaginated, timeout } from '@crowd/common' -import { getChildLogger, getServiceLogger } from '@crowd/logging' -import { RedisCache, RedisClient, getRedisClient } from '@crowd/redis' -import { PlatformType } from '@crowd/types' - -import { databaseInit } from '@/database/databaseConnection' -import { - getIntegrationRunWorkerEmitter, - getIntegrationStreamWorkerEmitter, -} from '@/serverless/utils/queueService' - -import { DISCORD_CONFIG, REDIS_CONFIG } from '../conf' -import IncomingWebhookRepository from '../database/repositories/incomingWebhookRepository' -import IntegrationRepository from '../database/repositories/integrationRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' -import { DiscordWebsocketEvent, DiscordWebsocketPayload, WebhookType } from '../types/webhooks' - -const log = getServiceLogger() - -async function executeIfNotExists( - key: string, - cache: RedisCache, - fn: () => Promise, - delayMilliseconds?: number, -) { - if (delayMilliseconds) { - await timeout(delayMilliseconds) - } - - const exists = await cache.get(key) - if (!exists) { - await fn() - await cache.set(key, '1', 2 * 60 * 60) - } -} - -async function spawnClient( - name: string, - token: string, - cache: RedisCache, - delayMilliseconds?: number, -) { - const logger = getChildLogger('discord-ws', log, { clientName: name }) - - const repoOptions = await SequelizeRepository.getDefaultIRepositoryOptions() - const repo = new IncomingWebhookRepository(repoOptions) - - const processPayload = async ( - event: DiscordWebsocketEvent, - data: any, - guildId: string, - ): Promise => { - const payload: DiscordWebsocketPayload = { - event, - data, - } - - logger.info({ payload }, 'Processing Discord WS Message!') - - try { - const integration = (await IntegrationRepository.findByIdentifier( - guildId, - PlatformType.DISCORD, - )) as any - - const result = await repo.create({ - tenantId: integration.tenantId, - integrationId: integration.id, - type: WebhookType.DISCORD, - payload, - }) - - const streamEmitter = await getIntegrationStreamWorkerEmitter() - - await streamEmitter.triggerWebhookProcessing( - integration.tenantId, - integration.platform, - result.id, - ) - } catch (err) { - if (err.code === 404) { - logger.warn({ guildId }, 'No integration found for incoming Discord WS Message!') - } else { - logger.error( - err, - { - discordPayload: JSON.stringify(payload), - guildId, - }, - 'Error processing Discord WS Message!', - ) - } - } - } - - const client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMembers, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.GuildMessageReactions, - GatewayIntentBits.DirectMessages, - GatewayIntentBits.DirectMessageReactions, - GatewayIntentBits.MessageContent, - ], - }) - - // listen to client events - client.on(Events.ClientReady, () => { - logger.info('Discord WS client is ready!') - }) - - client.on(Events.Error, (err) => { - logger.error(err, 'Discord WS client error! Exiting...') - process.exit(1) - }) - - client.on(Events.Debug, (message) => { - logger.debug({ debugMsg: message }, 'Discord WS client debug message!') - }) - - client.on(Events.Warn, (message) => { - logger.warn({ warning: message }, 'Discord WS client warning!') - }) - - // listen to discord events - client.on(Events.GuildMemberAdd, async (m) => { - const member = m as any - await executeIfNotExists( - `member-${member.userId}`, - cache, - async () => { - logger.debug( - { - member: member.displayName, - guildId: member.guildId ?? member.guild.id, - userId: member.userId, - }, - 'Member joined guild!', - ) - await processPayload( - DiscordWebsocketEvent.MEMBER_ADDED, - member, - member.guildId ?? member.guild.id, - ) - }, - delayMilliseconds, - ) - }) - - client.on(Events.MessageCreate, async (message) => { - if (message.type === MessageType.Default || message.type === MessageType.Reply) { - await executeIfNotExists( - `msg-${message.id}`, - cache, - async () => { - logger.debug( - { - guildId: message.guildId, - channelId: message.channelId, - message: message.cleanContent, - authorId: message.author, - }, - 'Message created!', - ) - await processPayload(DiscordWebsocketEvent.MESSAGE_CREATED, message, message.guildId) - }, - delayMilliseconds, - ) - } - }) - - client.on(Events.MessageUpdate, async (oldMessage, newMessage) => { - if (newMessage.type === MessageType.Default && newMessage.editedTimestamp) { - await executeIfNotExists( - `msg-modified-${newMessage.id}-${newMessage.editedTimestamp}`, - cache, - async () => { - logger.debug( - { - guildId: newMessage.guildId, - channelId: newMessage.channelId, - oldMessageId: oldMessage.id, - newMessage: newMessage.cleanContent, - authorId: newMessage.author, - }, - 'Message updated!', - ) - await processPayload( - DiscordWebsocketEvent.MESSAGE_UPDATED, - { - message: newMessage, - oldMessage, - }, - newMessage.guildId, - ) - }, - delayMilliseconds, - ) - } - }) - - await client.login(token) - logger.info('Discord WS client logged in!') -} - -let seq: Sequelize -let redis: RedisClient -const initRedisSeq = async () => { - if (!seq) { - seq = (await databaseInit()).sequelize as Sequelize - } - - if (!redis) { - redis = await getRedisClient(REDIS_CONFIG, true) - } -} -setImmediate(async () => { - // we are saving heartbeat timestamps in redis every 2 seconds - // on boot if we detect that there has been a downtime we should trigger discord integration checks - // so we don't miss anything - await initRedisSeq() - const cache = new RedisCache('discord-ws', redis, log) - - const lastHeartbeat = await cache.get('heartbeat') - let triggerCheck = false - if (!lastHeartbeat) { - log.info('No heartbeat found, triggering check!') - triggerCheck = true - } else { - const diff = moment().diff(lastHeartbeat, 'seconds') - // if we do rolling update deploys (kubernetes default) - // we might catch a heartbeat without the need to trigger a check - if (diff > 5) { - log.warn('Heartbeat is stale, triggering check!') - triggerCheck = true - } - } - - if (triggerCheck) { - const emitter = await getIntegrationRunWorkerEmitter() - - await processPaginated( - async (page) => IntegrationRepository.findAllActive(PlatformType.DISCORD, page, 10), - async (integrations) => { - log.warn(`Found ${integrations.length} integrations to trigger check for!`) - for (const integration of integrations) { - await emitter.triggerIntegrationRun( - integration.tenantId, - integration.platform, - integration.id, - false, - ) - } - }, - ) - } - - await spawnClient( - 'first-app', - DISCORD_CONFIG.token, - cache, - DISCORD_CONFIG.token2 ? 1000 : undefined, - ) - - if (DISCORD_CONFIG.token2) { - await spawnClient('second-app', DISCORD_CONFIG.token2, cache) - } - - setInterval(async () => { - await cache.set('heartbeat', new Date().toISOString()) - }, 2 * 1000) -}) - -const liveFilePath = path.join(__dirname, 'tmp/discord-ws-live.tmp') -const readyFilePath = path.join(__dirname, 'tmp/discord-ws-ready.tmp') - -setInterval(async () => { - try { - log.debug('Checking liveness and readiness for discord ws.') - const [redisPingRes, dbPingRes] = await Promise.all([ - // ping redis, - redis.ping().then((res) => res === 'PONG'), - // ping database - seq.query('select 1', { type: QueryTypes.SELECT }).then((rows) => rows.length === 1), - ]) - if (redisPingRes && dbPingRes) { - await Promise.all([ - fs.promises.open(liveFilePath, 'a').then((file) => file.close()), - fs.promises.open(readyFilePath, 'a').then((file) => file.close()), - ]) - } - } catch (err) { - log.error(`Error checking liveness and readiness for discord ws: ${err}`) - } -}, 5000) diff --git a/backend/src/bin/scripts/unleash-init.ts b/backend/src/bin/scripts/unleash-init.ts deleted file mode 100644 index fe7ef72637..0000000000 --- a/backend/src/bin/scripts/unleash-init.ts +++ /dev/null @@ -1,476 +0,0 @@ -import Sequelize, { QueryTypes } from 'sequelize' - -import { generateUUIDv1 } from '@crowd/common' -import { getServiceLogger } from '@crowd/logging' -import { FeatureFlag, PLAN_LIMITS, TenantPlans } from '@crowd/types' - -import { UNLEASH_CONFIG } from '../../conf' -import { UnleashContextField } from '../../types/unleashContext' - -/* eslint-disable no-console */ - -const log = getServiceLogger() - -const constaintConfiguration = { - [FeatureFlag.AUTOMATIONS]: [ - [ - { - values: [TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Scale][FeatureFlag.AUTOMATIONS].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'automationCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Growth], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Growth][FeatureFlag.AUTOMATIONS].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'automationCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Essential], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Essential][FeatureFlag.AUTOMATIONS].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'automationCount', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.CSV_EXPORT]: [ - [ - { - values: [TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Scale][FeatureFlag.CSV_EXPORT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'csvExportCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Growth], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Growth][FeatureFlag.CSV_EXPORT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'csvExportCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Essential], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Essential][FeatureFlag.CSV_EXPORT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'csvExportCount', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.EAGLE_EYE]: [ - [ - { - values: [TenantPlans.Growth, TenantPlans.EagleEye, TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.FIND_GITHUB]: [[]], - [FeatureFlag.LINKEDIN]: [ - [ - { - values: [TenantPlans.Growth, TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.HUBSPOT]: [ - [ - { - values: [TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.MEMBER_ENRICHMENT]: [ - [ - { - values: [TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Scale][FeatureFlag.MEMBER_ENRICHMENT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'memberEnrichmentCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Growth], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Growth][FeatureFlag.MEMBER_ENRICHMENT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'memberEnrichmentCount', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.ORGANIZATION_ENRICHMENT]: [ - [ - { - values: [TenantPlans.Scale], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Scale][FeatureFlag.ORGANIZATION_ENRICHMENT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'organizationEnrichmentCount', - caseInsensitive: false, - }, - ], - [ - { - values: [TenantPlans.Growth], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - { - value: PLAN_LIMITS[TenantPlans.Growth][FeatureFlag.ORGANIZATION_ENRICHMENT].toString(), - values: [], - inverted: false, - operator: 'NUM_LT', - contextName: 'organizationEnrichmentCount', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.SEGMENTS]: [], - - // temporal - [FeatureFlag.TEMPORAL_MEMBERS_ENRICHMENT]: [ - [ - { - values: [TenantPlans.Scale, TenantPlans.Enterprise], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - - [FeatureFlag.TEMPORAL_MEMBER_MERGE_SUGGESTIONS]: [ - [ - { - values: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.Scale, - TenantPlans.Enterprise, - ], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - - [FeatureFlag.SYNCHRONOUS_OPENSEARCH_UPDATES]: [ - [ - { - values: [ - TenantPlans.Scale, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Essential, - TenantPlans.Growth, - ], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - - [FeatureFlag.SERVE_PROFILES_OPENSEARCH]: [ - [ - { - values: [ - TenantPlans.Scale, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Essential, - TenantPlans.Growth, - ], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], - [FeatureFlag.TEMPORAL_ORGANIZATION_ENRICHMENT]: [ - [ - { - values: [ - TenantPlans.Scale, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Essential, - TenantPlans.Growth, - ], - inverted: false, - operator: 'IN', - contextName: 'plan', - caseInsensitive: false, - }, - ], - ], -} - -let seq: any - -setImmediate(async () => { - seq = new (Sequelize as any)( - UNLEASH_CONFIG.db.database, - UNLEASH_CONFIG.db.username, - UNLEASH_CONFIG.db.password, - { - dialect: 'postgres', - port: UNLEASH_CONFIG.db.port, - replication: { - read: [{ host: UNLEASH_CONFIG.db.host }], - write: { host: UNLEASH_CONFIG.db.host }, - }, - logging: false, - }, - ) - - await createApiToken(UNLEASH_CONFIG.adminApiKey, 'admin-token', 'admin') - await createApiToken(UNLEASH_CONFIG.frontendApiKey, 'frontend-token', 'frontend') - await createApiToken(UNLEASH_CONFIG.backendApiKey, 'backend-token', 'client') - - const allContextFields = Object.values(UnleashContextField) - for (const field of allContextFields) { - await createContextField(field) - } - - const allFeatureFlags = Object.values(FeatureFlag) - for (const flag of allFeatureFlags) { - await createFeatureFlag(flag) - await createStrategy(flag, constaintConfiguration[flag]) - } - - process.exit(0) -}) - -async function createApiToken(token: string, name: string, type: string): Promise { - const results = await seq.query( - 'select * from api_tokens where secret = :token and type = :type and username = :name;', - { - replacements: { - token, - name, - type, - }, - type: QueryTypes.SELECT, - }, - ) - if (results.length === 0) { - log.info(`${name} token not found - creating...`) - await seq.query( - `insert into api_tokens(secret, username, type, environment) values (:token, :name, :type, 'production')`, - { - replacements: { - token, - name, - type, - }, - type: QueryTypes.INSERT, - }, - ) - } else { - log.info(`${name} token found!`) - } -} - -async function createContextField(field: string): Promise { - const results = await seq.query(`select * from context_fields where name = :field`, { - replacements: { - field, - }, - type: QueryTypes.SELECT, - }) - - if (results.length === 0) { - log.info(`Context field ${field} not found - creating...`) - await seq.query(`insert into context_fields(name, stickiness) values (:field, true)`, { - replacements: { - field, - }, - type: QueryTypes.INSERT, - }) - } else { - log.info(`Context field ${field} found!`) - } -} - -async function createFeatureFlag(flag: FeatureFlag): Promise { - const results = await seq.query( - `select * from features where name = :flag and type = 'permission'`, - { - replacements: { - flag, - }, - type: QueryTypes.SELECT, - }, - ) - - if (results.length === 0) { - log.info(`Feature flag ${flag} not found - creating...`) - await seq.query( - `insert into features(name, description, type) values (:flag, '', 'permission')`, - { - replacements: { - flag, - }, - type: QueryTypes.INSERT, - }, - ) - await seq.query( - `insert into feature_environments(environment, feature_name, enabled) values ('production', :flag, true)`, - { - replacements: { - flag, - }, - type: QueryTypes.INSERT, - }, - ) - } else { - log.info(`Feature flag ${flag} found!`) - } -} - -async function createStrategy(flag: FeatureFlag, constraints: any[]): Promise { - const results = await seq.query( - `select * from feature_strategies where feature_name = :flag and project_name = 'default' and environment = 'production' and strategy_name = 'default'`, - { - replacements: { - flag, - }, - type: QueryTypes.SELECT, - }, - ) - - if (results.length > 0) { - log.warn(`Feature flag ${flag} constraints found - re-creating...`) - await seq.query( - `delete from feature_strategies where feature_name = :flag and project_name = 'default' and environment = 'production' and strategy_name = 'default'`, - { - replacements: { - flag, - }, - type: QueryTypes.DELETE, - }, - ) - } - - log.info(`Feature flag ${flag} constraints not found - creating...`) - constraints = constraints || [] - for (const constraint of constraints) { - const id = generateUUIDv1() - await seq.query( - `insert into feature_strategies(id, feature_name, project_name, environment, strategy_name, constraints) values (:id, :flag, 'default', 'production', 'default', :constraint)`, - { - replacements: { - flag, - id, - constraint: JSON.stringify(constraint), - }, - type: QueryTypes.INSERT, - }, - ) - } -} diff --git a/backend/src/conf/configTypes.ts b/backend/src/conf/configTypes.ts index 46e6596ce3..46c04e25a1 100644 --- a/backend/src/conf/configTypes.ts +++ b/backend/src/conf/configTypes.ts @@ -76,16 +76,6 @@ export interface SSOConfiguration { crowdTenantId: string lfTenantId: string } - -export interface PlansConfiguration { - stripePricePremium: string - stripePriceEnterprise: string - stripeSecretKey: string - stripWebhookSigningSecret: string - stripeEagleEyePlanProductId: string - stripeGrowthPlanProductId: string -} - export interface DevtoConfiguration { globalLimit?: number } @@ -184,21 +174,6 @@ export interface GithubTokenConfiguration { token: string } -export interface UnleashConfiguration { - url: string - adminApiKey: string - frontendApiKey: string - backendApiKey: string - - db: { - host: string - port: number - username: string - password: string - database: string - } -} - export interface StackExchangeConfiguration { key: string } diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index 6ee8b5745d..b9e5e14c21 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -29,7 +29,6 @@ import { NangoConfiguration, NetlifyConfiguration, OrganizationEnrichmentConfiguration, - PlansConfiguration, S3Configuration, SSOConfiguration, SampleDataConfiguration, @@ -43,7 +42,6 @@ import { StackExchangeConfiguration, TenantMode, TwitterConfiguration, - UnleashConfiguration, WeeklyEmailsConfiguration, } from './configTypes' @@ -102,8 +100,6 @@ export const AUTH0_CONFIG: Auth0Configuration = config.get(' export const SSO_CONFIG: SSOConfiguration = config.get('sso') -export const PLANS_CONFIG: PlansConfiguration = config.get('plans') - export const TWITTER_CONFIG: TwitterConfiguration = config.get('twitter') export const SLACK_CONFIG: SlackConfiguration = config.get('slack') @@ -140,8 +136,6 @@ export const EAGLE_EYE_CONFIG: EagleEyeConfiguration = config.get('githubToken') -export const UNLEASH_CONFIG: UnleashConfiguration = config.get('unleash') - export const OPENSEARCH_CONFIG: IOpenSearchConfig = config.get('opensearch') export const STACKEXCHANGE_CONFIG: StackExchangeConfiguration = diff --git a/backend/src/database/initializers/sample-data.json b/backend/src/database/initializers/sample-data.json deleted file mode 100644 index 4d06a29ec8..0000000000 --- a/backend/src/database/initializers/sample-data.json +++ /dev/null @@ -1,8655 +0,0 @@ -{ - "members": [ - { - "displayName": "Bertram Gilfoyle", - "username": { - "twitter": "gilfoyle", - "discord": "bg69", - "github": "gilfoyle", - "devto": "iamgilfoyle", - "linkedin": "gilfoyle" - }, - "attributes": { - "bio": { - "twitter": "A satanist who likes beer", - "github": "It's not magic, it's talent and sweat", - "custom": "It's not magic, it's talent and sweat. Systems architecture at PiedPiper" - }, - "jobTitle": { - "custom": "Systems Architect" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/gilfoyle-small.jpg" - }, - "skills": { - "enrichment": ["DevOps", "Linux", "Networking"] - }, - "languages": { - "enrichment": ["English", "German"] - }, - "programmingLanguages": { - "enrichment": ["Python", "Go", "Bash", "Ruby"] - }, - "awards": { - "enrichment": ["Silicon Valley Tech Innovator Award 2017"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Systems architecture", "DevOps", "Networking", "Linux", "Python"] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 10 - }, - "education": { - "enrichment": [ - { - "campus": "University of California, Berkeley", - "major": "Computer Science", - "specialization": "Systems", - "startDate": "2010-08-01", - "endDate": "2014-05-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "Systems Architect", - "company": "Pied Piper", - "location": "Silicon Valley", - "startDate": "2014-05-01", - "endDate": "Present" - }, - { - "title": "DevOps Engineer", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "2012-06-01", - "endDate": "2014-05-01" - } - ] - } - }, - "organizations": [ - { - "name": "Pied Piper", - "website": "https://piedpiper.io", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/pied-piper-logo.jpg", - "description": "Pied Piper is a data compression platform founded by Richard Hendricks", - "emails": ["richard@piedpiper.io", "gilfoyle@piedpiper.io", "erlich@piedpier.io"], - "tags": ["pied piper", "data-compression", "not-hooli"], - "twitter": { - "handle": "piedpiper", - "bio": "Pied Piper is a data compression platform founded by Richard Hendricks", - "followers": 17000, - "following": 5, - "location": "Menlo Park" - }, - "employees": 20, - "revenueRange": { - "min": 0, - "max": 1 - }, - "linkedin": { - "handle": "company/pied-piper" - }, - "crunchbase": { - "handle": "company/pied-piper" - } - } - ], - "email": "gilfoyle@piedpiper.io", - "score": 9, - "reach": { - "twitter": 534, - "github": 83, - "total": 617 - }, - "notes": [ - "Gilfoyle is known for his satanist beliefs and love of beer", - "He has a reputation for being blunt and sarcastic", - "Gilfoyle's expertise in systems architecture and security make him an invaluable member of Pied Piper's team" - ], - "tags": ["Systems Architect", "DevOps", "Security", "Networks"], - "openSourceContributions": [ - { - "id": 1, - "url": "https://github.com/rhendricks/piedpiper", - "topics": ["compression", "data", "middle-out", "Java"], - "summary": "Pied Piper: 15 commits in 1 day", - "numberCommits": 25, - "lastCommitDate": "2023-03-10", - "firstCommitDate": "2023-03-09" - }, - { - "id": 2, - "url": "https://github.com/rhendricks/piperchat", - "topics": ["messaging", "chat", "security", "compression", "decentralized", "Java"], - "summary": "PiperChat: 10 commits in 1 day", - "numberCommits": 50, - "lastCommitDate": "2023-03-08", - "firstCommitDate": "2023-03-07" - }, - { - "id": 1, - "url": "https://github.com/gilfoyle/linux-kernel", - "topics": ["Linux", "Kernel", "Networking", "Unix"], - "summary": "linux-kernel: 15 commits in 1 day", - "numberCommits": 20, - "lastCommitDate": "2019-03-01", - "firstCommitDate": "2019-02-15" - }, - { - "id": 2, - "url": "https://github.com/gilfoyle/pydevops", - "topics": ["Python", "DevOps"], - "summary": "pydevops: 8 commits in 1 day", - "numberCommits": 18, - "lastCommitDate": "2020-07-01", - "firstCommitDate": "2020-06-15" - }, - { - "id": 3, - "url": "https://github.com/gilfoyle/pypackage", - "topics": ["Python", "Packaging"], - "summary": "pypackage: 5 commits in 1 day", - "numberCommits": 25, - "lastCommitDate": "2021-02-01", - "firstCommitDate": "2021-01-25" - }, - { - "id": 4, - "url": "https://github.com/gilfoyle/go-webapp", - "topics": ["Go", "Web", "DevOps"], - "summary": "go-webapp: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2021-08-01", - "firstCommitDate": "2021-07-25" - }, - { - "id": 5, - "url": "https://github.com/gilfoyle/batch-scripts", - "topics": ["Bash", "Scripts", "Unix"], - "summary": "batch-scripts: 3 commits in 1 day", - "numberCommits": 13, - "lastCommitDate": "2022-01-01", - "firstCommitDate": "2021-12-25" - } - ] - }, - { - "displayName": "Richard Hendricks", - "username": { - "twitter": "richhendricks", - "discord": "rhndrcks", - "github": "rhendricks", - "devto": "iamrichard", - "linkedin": "richardhendricks" - }, - "attributes": { - "bio": { - "twitter": "Founder & CEO of @piedpiper, making data compression great again", - "github": "Creator of Pied Piper data comperssion algorithm", - "custom": "Founder & CEO of Pied Piper" - }, - "jobTitle": { - "custom": "Founder & CEO" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/richard-small.jpg" - }, - "skills": { - "enrichment": ["compression", "startup management", "software development", "networking"] - }, - "languages": { - "enrichment": ["English", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["Java", "Python", "C++", "JavaScript"] - }, - "awards": { - "enrichment": ["TechCrunch Disrupt Startup Battlefield Winner", "Forbes 30 under 30"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": [ - "Leadership", - "Data compression", - "Software development", - "Public speaking" - ] - }, - "country": { - "enrichment": "United States" - }, - "yearsOfExperience": { - "enrichment": 10 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2010-09-01", - "endDate": "2014-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "CEO", - "company": "Pied Piper", - "location": "Silicon Valley", - "startDate": "2014-06-01", - "endDate": "Present" - }, - { - "title": "Software Engineer", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "2012-06-01", - "endDate": "2014-06-01" - } - ] - } - }, - "organizations": [ - { - "name": "Pied Piper", - "website": "https://piedpiper.io", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/pied-piper-logo.jpg", - "description": "Pied Piper is a data compression platform founded by Richard Hendricks", - "emails": ["richard@piedpiper.io", "gilfoyle@piedpiper.io", "erlich@piedpier.io"], - "tags": ["pied piper", "data-compression", "not-hooli"], - "twitter": { - "handle": "piedpiper", - "bio": "Pied Piper is a data compression platform founded by Richard Hendricks", - "followers": 17000, - "following": 5, - "location": "Menlo Park" - }, - "employees": 20, - "revenueRange": { - "min": 0, - "max": 1 - }, - "linkedin": { - "handle": "company/pied-piper" - }, - "crunchbase": { - "handle": "company/pied-piper" - } - } - ], - "email": "richard@piedpiper.io", - "score": 8, - "reach": { - "twitter": 2016, - "github": 157, - "total": 2173 - }, - "tags": ["entrepreneur", "tech leader", "innovator", "compression expert", "startups"], - "notes": [ - "Has a tendency to overthink things", - "Very dedicated to his work", - "Can be shy in social situations" - ], - "openSourceContributions": [ - { - "id": 1, - "url": "https://github.com/rhendricks/piedpiper", - "topics": ["compression", "data", "middle-out", "Java"], - "summary": "Pied Piper: 25 commits in 1 day", - "numberCommits": 75, - "lastCommitDate": "2023-03-10", - "firstCommitDate": "2023-03-09" - }, - { - "id": 2, - "url": "https://github.com/rhendricks/piperchat", - "topics": ["messaging", "chat", "security", "compression", "decentralized"], - "summary": "PiperChat: 10 commits in 1 day", - "numberCommits": 30, - "lastCommitDate": "2023-03-08", - "firstCommitDate": "2023-03-07" - }, - { - "id": 3, - "url": "https://github.com/rhendricks/neuralnets", - "topics": ["neuralnets", "machinelearning", "python"], - "summary": "NeuralNets: 5 commits in 1 day", - "numberCommits": 5, - "lastCommitDate": "2023-03-05", - "firstCommitDate": "2023-03-04" - }, - { - "id": 4, - "url": "https://github.com/rhendricks/datasci", - "topics": ["datascience", "analytics", "visualization", "neuralnets"], - "summary": "DataSci: 15 commits in 1 day", - "numberCommits": 15, - "lastCommitDate": "2023-03-01", - "firstCommitDate": "2023-02-28" - }, - { - "id": 6, - "url": "https://github.com/rhendricks/networking", - "topics": ["networking", "protocols", "security"], - "summary": "Networking: 8 commits in 1 day", - "numberCommits": 8, - "lastCommitDate": "2023-02-22", - "firstCommitDate": "2023-02-21" - }, - { - "id": 7, - "url": "https://github.com/rhendricks/webdev", - "topics": ["webdev", "html", "css", "javascript"], - "summary": "WebDev: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2023-02-18", - "firstCommitDate": "2023-02-17" - }, - { - "id": 8, - "url": "https://github.com/rhendricks/cloudcomputing", - "topics": ["cloudcomputing", "aws", "azure", "gcp"], - "summary": "CloudComputing: 7 commits in 1 day", - "numberCommits": 7, - "lastCommitDate": "2023-02-15", - "firstCommitDate": "2023-02-14" - }, - { - "id": 10, - "url": "https://github.com/rhendricks/distributedsystems", - "topics": ["distributedsystems", "kafka", "rabbitmq", "kubernetes", "cloudcomputing"], - "summary": "DistributedSystems: 9 commits in 1 day", - "numberCommits": 9, - "lastCommitDate": "2023-02-05", - "firstCommitDate": "2023-02-04" - } - ] - }, - { - "displayName": "Erlich Bachman", - "username": { - "twitter": "erlichbach", - "discord": "baaaaachman", - "github": "bachman", - "devto": "ebachman", - "linkedin": "erlichbachman" - }, - "tags": ["entrepreneur", "public speaker", "showman"], - "attributes": { - "bio": { - "twitter": "Founder of Aviato, backer of @piedpiper", - "github": "Coding is not for me", - "custom": "Ex-CEO of Aviato, creator of startup incubator" - }, - "jobTitle": { - "custom": "Board Member at Pied Piper" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/erlich-small.jpg" - }, - "skills": { - "enrichment": ["Marketing", "Product Development", "Venture Capital", "Public Speaking"] - }, - "languages": { - "enrichment": ["English", "Mandarin", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["Python", "JavaScript", "Ruby", "C++"] - }, - "awards": { - "enrichment": ["TechCrunch Disrupt Battlefield Winner 2014"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": [ - "Startup incubation", - "Marketing", - "Business development", - "Product management", - "Fundraising", - "Public speaking" - ] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 12 - }, - "education": { - "enrichment": [ - { - "campus": "UC Berkeley", - "major": "Business Administration", - "specialization": "", - "startDate": "2010-09-01", - "endDate": "2014-05-15" - }, - { - "campus": "UC Berkeley", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2008-09-01", - "endDate": "2010-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "CEO", - "company": "Aviato", - "location": "Silicon Valley", - "startDate": "2012-01-01", - "endDate": "2015-12-31" - }, - { - "title": "Startup Incubator Creator", - "company": "Erlich's Startup Incubator", - "location": "Silicon Valley", - "startDate": "2016-01-01", - "endDate": "Present" - } - ] - } - }, - "organizations": [ - { - "name": "Erlich's Startup Incubator", - "website": "https://erlichincubator.in", - "logo": "https://cdn.dribbble.com/users/1771704/screenshots/3585167/erlich_still_2x.gif?compress=1&resize=400x300", - "description": "Startup incubator right in Erlich Bachman's house", - "emails": ["bachman@erlichincubator.in", "jianyang@erlichincubator.in"], - "tags": ["Entrepreneur", "Startup Incubator", "VC"], - "twitter": { - "handle": "erlichincubator", - "bio": "Startup incubator right in Erlich Bachman's house", - "followers": 120, - "following": 500, - "location": "Menlo Park" - }, - "employees": 1, - "revenueRange": { - "min": 0, - "max": 20 - }, - "linkedin": { - "handle": "company/erlichincubator" - }, - "crunchbase": { - "handle": "company/erlichincubator" - } - } - ], - "email": "erlich@piedpiper.io", - "score": 7, - "reach": { - "twitter": 711, - "github": 1, - "total": 712 - }, - "notes": ["Can be difficult to work with", "Strong personality", "Likes to take risks"], - "openSourceContributions": [ - { - "id": 112529472, - "url": "https://github.com/bachman/pied-piper", - "topics": ["compression", "data", "middle-out", "Java"], - "summary": "Pied Piper: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2023-03-10", - "firstCommitDate": "2023-03-01" - }, - { - "id": 112529473, - "url": "https://github.com/bachman/aviato", - "topics": ["Python", "Django"], - "summary": "Aviato: 5 commits in 1 day", - "numberCommits": 5, - "lastCommitDate": "2023-02-25", - "firstCommitDate": "2023-02-20" - }, - { - "id": 112529476, - "url": "https://github.com/bachman/erlichbot", - "topics": ["Python", "Slack API"], - "summary": "ErlichBot: 2 commits in 1 day", - "numberCommits": 2, - "lastCommitDate": "2023-01-25", - "firstCommitDate": "2023-01-24" - } - ] - }, - { - "displayName": "Big Head", - "username": { - "twitter": "bighead", - "discord": "bGbghead", - "github": "bighead", - "devto": "bigheader", - "linkedin": "bighead" - }, - "attributes": { - "bio": { - "twitter": "Co-head Dreamer of the Hooli XYZ project", - "github": "Co-head Dreamer of the Hooli XYZ project", - "custom": "Executive at the Hooli XYZ project" - }, - "jobTitle": { - "custom": "Co-head Dreamer" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/big-head-small.jpg" - }, - "skills": { - "enrichment": ["Project Management", "Research", "Leadership", "Innovation"] - }, - "languages": { - "enrichment": ["English", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["Java", "Python", "JavaScript", "C++"] - }, - "awards": { - "enrichment": [ - "Hooli's most innovative employee of the year (2016)", - "Hooli's most innovative employee of the year (2017)" - ] - }, - "expertise": { - "enrichment": ["Innovation", "Project Management", "Research"] - }, - "country": { - "enrichment": "United States" - }, - "yearsOfExperience": { - "enrichment": 5 - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Computer Science", - "specialization": "", - "startDate": "01/01/2011", - "endDate": "01/01/2015" - }, - { - "campus": "UC Berkeley", - "major": "Business Administration", - "specialization": "Entrepreneurship", - "startDate": "01/01/2015", - "endDate": "01/01/2016" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "Executive", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "01/01/2016", - "endDate": "Present" - }, - { - "title": "Intern", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "01/01/2015", - "endDate": "01/01/2016" - } - ] - } - }, - "organizations": [ - { - "name": "Hooli", - "website": "https://hooli.xyz", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/hooli-logo.png", - "description": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "emails": ["gavin@hooli.xyz", "bighead@hooli.xyz"], - "tags": ["hooli", "tethics", "not-google"], - "twitter": { - "handle": "hooli", - "bio": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "followers": 500000, - "following": 0, - "location": "Menlo Park" - }, - "employees": 4000, - "revenueRange": { - "min": 100, - "max": 500 - }, - "linkedin": { - "handle": "company/hooli" - }, - "crunchbase": { - "handle": "company/hooli" - } - } - ], - "email": "bighead@hooli.xyz", - "score": 5, - "reach": { - "twitter": 401, - "github": 5, - "total": 406 - }, - "notes": [ - "Big Head is a dreamer, with great ideas but often lacks the follow-through to execute them", - "He is a loyal friend and willing to help those in need, even at his own expense" - ], - "tags": ["dreamer", "innovator", "researcher"], - "openSourceContributions": [ - { - "id": 112529473, - "url": "https://github.com/bighead/silicon-valley", - "topics": ["TV Shows", "Comedy", "Startups"], - "summary": "Silicon Valley: 50 commits in 2 weeks", - "numberCommits": 50, - "lastCommitDate": "02/01/2023", - "firstCommitDate": "01/17/2023" - }, - { - "id": 112529474, - "url": "https://github.com/bighead/startup-ideas", - "topics": ["Ideas", "Startups"], - "summary": "Startup Ideas: 20 commits in 1 week", - "numberCommits": 20, - "lastCommitDate": "03/01/2023", - "firstCommitDate": "02/22/2023" - }, - { - "id": 112529475, - "url": "https://github.com/bighead/pied-piper-api", - "topics": ["API", "data", "compression"], - "summary": "Pied Piper API: 30 commits in 2 weeks", - "numberCommits": 30, - "lastCommitDate": "02/10/2023", - "firstCommitDate": "01/26/2023" - }, - { - "id": 112529477, - "url": "https://github.com/bighead/hooli-analysis", - "topics": ["Data", "Analysis", "data"], - "summary": "Hooli Analysis: 15 commits in 2 weeks", - "numberCommits": 15, - "lastCommitDate": "02/20/2023", - "firstCommitDate": "02/05/2023" - } - ] - }, - { - "displayName": "Dinesh Chugtai", - "username": { - "twitter": "dinesh", - "discord": "dineshish", - "github": "dinesh", - "devto": "dinesh", - "linkedin": "dinesh" - }, - "attributes": { - "bio": { - "twitter": "VP of Engineering at Pied Piper, the best Tesla driver", - "github": "VP of Engineering at Pied Piper", - "custom": "VP of Engineering at Pied Piper. Let's get insane" - }, - "jobTitle": { - "custom": "VP of Engineering" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/dinesh-small.jpg" - }, - "skills": { - "enrichment": ["coding", "data analysis", "project management"] - }, - "languages": { - "enrichment": ["English", "Hindi", "Urdu"] - }, - "programmingLanguages": { - "enrichment": ["Python", "Java", "JavaScript"] - }, - "awards": { - "enrichment": [ - "Silicon Valley Tech Innovator Award", - "IEEE Computer Society Award for Outstanding Paper", - "Best Presentation Award at the International Conference on Advanced Computing and Communications" - ] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Machine Learning", "Data Science", "Agile Development", "Team Leadership"] - }, - "country": { - "enrichment": "Pakistan" - }, - "yearsOfExperience": { - "enrichment": 7 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2011-09-15", - "endDate": "2015-06-15" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "VP of Engineering", - "company": "Pied Piper", - "location": "Silicon Valley", - "startDate": "2015-07-15", - "endDate": "Present" - }, - { - "title": "Senior Software Engineer", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "2013-06-15", - "endDate": "2015-06-15" - } - ] - } - }, - "organizations": [ - { - "name": "Pied Piper", - "website": "https://piedpiper.io", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/pied-piper-logo.jpg", - "description": "Pied Piper is a data compression platform founded by RichardHendricks", - "emails": ["richard@piedpiper.io", "gilfoyle@piedpiper.io", "erlich@piedpier.io"], - "tags": ["Data Compression", "Startup", "Silicon Valley"], - "twitter": { - "handle": "piedpiper", - "bio": "Pied Piper is a data compression platform founded by Richard Hendricks", - "followers": 17000, - "following": 5, - "location": "Menlo Park" - }, - "employees": 20, - "revenueRange": { - "min": 0, - "max": 1 - }, - "linkedin": { - "handle": "company/pied-piper" - }, - "crunchbase": { - "handle": "company/pied-piper" - } - } - ], - "email": "dinesh@piedpiper.io", - "score": 9, - "reach": { - "twitter": 382, - "github": 5, - "total": 406 - }, - "tags": ["Java", "Greedy", "Tesla owner"], - "notes": ["Great problem solver", "Quick learner", "Attention to detail"], - "openSourceContributions": [ - { - "id": 1, - "url": "https://github.com/rhendricks/piedpiper", - "topics": ["compression", "data", "middle-out", "Java"], - "summary": "Pied Piper: 15 commits in 1 day", - "numberCommits": 25, - "lastCommitDate": "2023-03-10", - "firstCommitDate": "2023-03-09" - }, - { - "id": 2, - "url": "https://github.com/rhendricks/piperchat", - "topics": ["messaging", "chat", "security", "compression", "decentralized", "Java"], - "summary": "PiperChat: 10 commits in 1 day", - "numberCommits": 50, - "lastCommitDate": "2023-03-08", - "firstCommitDate": "2023-03-07" - }, - { - "id": 112529472, - "url": "https://github.com/dinesh/distributed-file-system", - "topics": ["distributed systems", "file system", "Java"], - "summary": "Distributed File System: 20 commits in 1 week", - "numberCommits": 20, - "lastCommitDate": "2022-03-05", - "firstCommitDate": "2022-02-27" - }, - { - "id": 112529474, - "url": "https://github.com/dinesh/auto-scaling", - "topics": ["cloud computing", "Java"], - "summary": "Auto-Scaling: 5 commits in 1 day", - "numberCommits": 5, - "lastCommitDate": "2021-12-28", - "firstCommitDate": "2021-12-28" - }, - { - "id": 112529475, - "url": "https://github.com/dinesh/personal-website", - "topics": ["personal website", "JavaScript"], - "summary": "Personal Website: 2 commits in 1 week", - "numberCommits": 2, - "lastCommitDate": "2021-11-02", - "firstCommitDate": "2021-10-27" - }, - { - "id": 112529476, - "url": "https://github.com/dinesh/remote-teams", - "topics": ["remote work", "team management", "Java"], - "summary": "Remote Teams: 6 commits in 2 days", - "numberCommits": 6, - "lastCommitDate": "2021-09-20", - "firstCommitDate": "2021-09-18" - } - ] - }, - { - "displayName": "Peter Gregory", - "username": { - "twitter": "petgregory", - "discord": "pgregory", - "github": "pgregory", - "devto": "thegregory", - "linkedin": "pgregory" - }, - "attributes": { - "bio": { - "twitter": "Founder of Raviga Capital, investor in @piedpiper", - "github": "Investor", - "custom": "Founder & Investor at Raviga Capital" - }, - "jobTitle": { - "custom": "Founder & Investor" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/peter-small.jpg" - }, - "skills": { - "enrichment": ["venture capital", "investments", "startups", "leadership", "management"] - }, - "languages": { - "enrichment": ["English", "French", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["JavaScript", "Python", "Java"] - }, - "awards": { - "enrichment": ["Forbes 30 under 30", "Best VC Investor of the Year"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Mentorship", "Team building", "Negotiation", "Strategic thinking"] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 25 - }, - "education": { - "enrichment": [ - { - "campus": "Harvard Business School", - "major": "Business Administration", - "specialization": "Venture Capital", - "startDate": "2010-09-01", - "endDate": "2012-05-01" - }, - { - "campus": "Stanford University", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2006-09-01", - "endDate": "2010-05-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "Founder & Investor", - "company": "Raviga Capital", - "location": "Silicon Valley", - "startDate": "2012-06-01", - "endDate": "Present" - }, - { - "title": "Associate", - "company": "Kleiner Perkins", - "location": "Silicon Valley", - "startDate": "2010-06-01", - "endDate": "2012-05-01" - } - ] - } - }, - "organizations": [ - { - "name": "Raviga Capital", - "website": "https://raviga.vc", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/raviga-capital-logo.jpg", - "description": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "emails": ["peter@raviga.vc"], - "tags": ["vc", "gregory"], - "twitter": { - "handle": "ravigavc", - "bio": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "followers": 3472, - "following": 120, - "location": "Menlo Park" - }, - "employees": 3, - "revenueRange": { - "min": 5, - "max": 20 - }, - "linkedin": { - "handle": "company/raviga-capital" - }, - "crunchbase": { - "handle": "company/raviga-capital" - } - } - ], - "email": "peter@raviga.vc", - "score": 3, - "reach": { - "twitter": 3000, - "github": 7, - "total": 3007 - }, - "tags": [ - "VC investor", - "startups", - "business", - "leadership", - "management", - "mentorship", - "team building", - "negotiation", - "strategic thinking" - ], - "notes": [ - "Peter is a visionary investor with great experience in the startup world", - "He has a knack for spotting the next big thing, and his guidance is invaluable to any entrepreneur", - "His negotiation skills are top-notch, and he can turn a difficult situation into a win-win" - ], - "openSourceContributions": [ - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-compression-companies", - "topics": ["internet", "awesome-list", "search"], - "summary": "Awesome compression companies: 10 commits in 10 days", - "numberCommits": 12, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - }, - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-college-alternatives", - "topics": ["startup", "awesome-list", "college"], - "summary": "Awesome college alternatives: 10 commits in 10 days", - "numberCommits": 17, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - }, - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-startups", - "topics": ["startup", "awesome-list", "business"], - "summary": "Awesome startups: 10 commits in 10 days", - "numberCommits": 10, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - }, - { - "id": 112529474, - "url": "https://github.com/pgregory/hooli", - "topics": ["search", "python", "internet"], - "summary": "hooli: 23 commits in 1 day", - "numberCommits": 23, - "lastCommitDate": "2000-03-05", - "firstCommitDate": "2000-03-05" - } - ] - }, - { - "displayName": "Monica Hall", - "username": { - "twitter": "monicahall", - "discord": "monimoni", - "github": "monicahall", - "devto": "iamthemonica", - "linkedin": "monicahall" - }, - "attributes": { - "bio": { - "twitter": "VC at Raviga Capital, mother of pipers", - "github": "Investing in companies with superior technology", - "custom": "VC at Raviga Capital" - }, - "jobTitle": { - "custom": "VC" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/monica-small.jpg" - }, - "skills": { - "enrichment": ["venture capital", "investing", "due diligence"] - }, - "languages": { - "enrichment": ["English", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["Python", "JavaScript", "Java"] - }, - "awards": { - "enrichment": ["Forbes 30 under 30", "Women in Venture Capital"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["strategic planning", "relationship building", "public speaking"] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 5 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Economics", - "specialization": "Finance", - "startDate": "2010", - "endDate": "2014" - }, - { - "campus": "Stanford Graduate School of Business", - "major": "Master of Business Administration", - "specialization": "Entrepreneurship", - "startDate": "2014", - "endDate": "2016" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "VC Partner", - "company": "Raviga Capital", - "location": "Silicon Valley", - "startDate": "2016", - "endDate": "Present" - }, - { - "title": "Investment Banking Analyst", - "company": "Goldman Sachs", - "location": "New York City", - "startDate": "2014", - "endDate": "2016" - } - ] - } - }, - "organizations": [ - { - "name": "Raviga Capital", - "website": "https://raviga.vc", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/raviga-capital-logo.jpg", - "description": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "emails": ["peter@raviga.vc"], - "tags": ["vc", "gregory"], - "twitter": { - "handle": "ravigavc", - "bio": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "followers": 3472, - "following": 120, - "location": "Menlo Park" - }, - "employees": 3, - "revenueRange": { - "min": 5, - "max": 20 - }, - "linkedin": { - "handle": "company/raviga-capital" - }, - "crunchbase": { - "handle": "company/raviga-capital" - } - } - ], - "email": "monica@raviga.vc", - "score": 6, - "reach": { - "twitter": 1417, - "github": 3, - "total": 1420 - }, - "tags": ["VC", "investor", "Raviga Capital"], - "notes": [ - "Monica is an expert in venture capital investing", - "She has a great track record of investing in technology startups", - "Monica is a great public speaker and an asset to any conference panel" - ], - "openSourceContributions": [ - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-compression-companies", - "topics": ["internet", "awesome-list", "search"], - "summary": "Awesome compression companies: 20 commits in 10 days", - "numberCommits": 20, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - }, - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-college-alternatives", - "topics": ["startup", "awesome-list", "college"], - "summary": "Awesome college alternatives: 10 commits in 10 days", - "numberCommits": 10, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - }, - { - "id": 112529475, - "url": "https://github.com/raviga/awesome-startups", - "topics": ["startup", "awesome-list", "business"], - "summary": "Awesome startups: 12 commits in 10 days", - "numberCommits": 12, - "lastCommitDate": "2003-03-02", - "firstCommitDate": "2003-03-02" - } - ] - }, - { - "displayName": "Jared Dunn", - "username": { - "twitter": "jared", - "discord": "jaredjared", - "github": "jaredjared", - "devto": "jaredjared", - "linkedin": "jaredjared" - }, - "attributes": { - "bio": { - "twitter": "COO at Pied Piper", - "github": "COO at Pied Piper", - "custom": "COO at Pied Piper" - }, - "jobTitle": { - "custom": "COO" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/jared.jpg" - }, - "skills": { - "enrichment": ["Leadership", "Product management", "Startups"] - }, - "languages": { - "enrichment": ["English", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["JavaScript", "Ruby"] - }, - "awards": { - "enrichment": ["TechCrunch Disrupt Startup Battlefield Winner 2014"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Product Management", "Entrepreneurship", "Marketing"] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 10 - }, - "education": { - "enrichment": [ - { - "campus": "Brown University", - "major": "Entrepreneurship", - "specialization": null, - "startDate": "2006-09-01", - "endDate": "2010-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "COO", - "company": "Pied Piper", - "location": "Silicon Valley", - "startDate": "2014-06-01", - "endDate": "Present" - }, - { - "title": "Business Development Manager", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "2010-06-01", - "endDate": "2014-06-01" - } - ] - } - }, - "organizations": [ - { - "name": "Pied Piper", - "website": "https://piedpiper.io", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/pied-piper-logo.jpg", - "description": "Pied Piper is a data compression platform founded by Richard Hendricks", - "emails": ["richard@piedpiper.io", "gilfoyle@piedpiper.io", "erlich@piedpier.io"], - "tags": ["pied piper", "data-compression", "not-hooli"], - "twitter": { - "handle": "piedpiper", - "bio": "Pied Piper is a data compression platform founded by Richard Hendricks", - "followers": 17000, - "following": 5, - "location": "Menlo Park" - }, - "employees": 20, - "revenueRange": { - "min": 0, - "max": 1 - }, - "linkedin": { - "handle": "company/pied-piper" - }, - "crunchbase": { - "handle": "company/pied-piper" - } - } - ], - "email": "jared@piedpiper.io", - "score": 7, - "reach": { - "twitter": 1417, - "github": 3, - "total": 1420 - }, - "tags": [ - "COO", - "Product Management", - "Entrepreneurship", - "Marketing", - "Stanford Alumni", - "Pied Piper", - "Silicon Valley" - ], - "notes": [ - "Jared is an experienced COO with a strong track record in product management and entrepreneurship. He is a Stanford alumni and has a deep understanding of the Silicon Valley ecosystem. He has been a valuable member of the Pied Piper team since its inception." - ], - "openSourceContributions": [ - { - "id": 112529475, - "url": "https://github.com/jaredjared/awesome-richard-quotes", - "topics": ["Startups", "CEO", "awesome-list", "Markdown"], - "summary": "Awesome Richard Quotes: 8 commits in 1 day", - "numberCommits": 8, - "lastCommitDate": "2022-02-10", - "firstCommitDate": "2022-02-09" - }, - { - "id": 112529476, - "url": "https://github.com/jaredjared/awesome-hbo-shows", - "topics": ["Markdown", "Lists", "awesome-list"], - "summary": "Awesome HBO Shows: 3 commits in 1 day", - "numberCommits": 3, - "lastCommitDate": "2022-02-08", - "firstCommitDate": "2022-02-08" - } - ] - }, - { - "displayName": "Gavin Belson", - "username": { - "twitter": "gavin", - "discord": "gavinbelson", - "github": "gavinbelson", - "devto": "thebelson", - "linkedin": "gavinbelson" - }, - "attributes": { - "bio": { - "twitter": "CEO at Hooli", - "github": "CEO at Hooli", - "custom": "CEO at Hooli" - }, - "jobTitle": { - "custom": "CEO" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/gavin.jpg" - }, - "skills": { - "enrichment": ["leadership", "strategy", "product management"] - }, - "languages": { - "enrichment": ["English", "Mandarin"] - }, - "programmingLanguages": { - "enrichment": ["Java", "Python", "C++"] - }, - "awards": { - "enrichment": ["CEO of the Year", "Fortune 500 List"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["business strategy", "leadership", "public speaking"] - }, - "country": { - "enrichment": "USA" - }, - "yearsOfExperience": { - "enrichment": 20 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Business Administration", - "specialization": "", - "startDate": "1985-09-01", - "endDate": "1987-06-01" - }, - { - "campus": "Dartmouth College", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "1981-09-01", - "endDate": "1985-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "Founder and CEO", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "1995-01-01", - "endDate": "2023-03-12" - } - ] - } - }, - "organizations": [ - { - "name": "Hooli", - "website": "https://hooli.xyz", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/hooli-logo.png", - "description": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "emails": ["gavin@hooli.xyz", "bighead@hooli.xyz"], - "tags": [ - "CEO", - "Silicon Valley", - "Technology", - "Innovation", - "Business Strategy", - "Leadership" - ], - "twitter": { - "handle": "hooli", - "bio": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "followers": 500000, - "following": 0, - "location": "Menlo Park" - }, - "employees": 4000, - "revenueRange": { - "min": 100, - "max": 500 - }, - "linkedin": { - "handle": "company/hooli" - }, - "crunchbase": { - "handle": "company/hooli" - } - } - ], - "email": "ceo@hooli.xyz", - "score": 5, - "reach": { - "twitter": 130000, - "github": 517, - "total": 130517 - }, - "notes": [ - "Great leadership skills, but can be stubborn at times.", - "Has a vision for Hooli's future, and is not afraid to make bold moves.", - "Excellent public speaker, can inspire and motivate employees and stakeholders." - ], - "openSourceContributions": [ - { - "id": 112529472, - "url": "https://github.com/hooli/hooli-analytics", - "topics": ["analytics", "big data", "data visualization"], - "summary": "hooli-analytics: 25 commits in 1 day", - "numberCommits": 25, - "lastCommitDate": "2010-05-01", - "firstCommitDate": "2010-04-01" - }, - { - "id": 112529473, - "url": "https://github.com/hooli/hooli-cloud", - "topics": ["cloud computing", "distributed systems", "networking"], - "summary": "hooli-cloud: 12 commits in 1 day", - "numberCommits": 12, - "lastCommitDate": "2009-10-01", - "firstCommitDate": "2009-09-01" - }, - { - "id": 112529474, - "url": "https://github.com/hooli/hooli-search", - "topics": ["search engine", "information retrieval", "machine learning"], - "summary": "hooli-search: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2008-05-01", - "firstCommitDate": "2008-04-01" - }, - { - "id": 112529475, - "url": "https://github.com/hooli/hooli-storage", - "topics": ["distributed storage", "file systems", "data visualization"], - "summary": "hooli-storage: 15 commits in 1 day", - "numberCommits": 15, - "lastCommitDate": "2007-10-01", - "firstCommitDate": "2007-09-01" - }, - { - "id": 112529476, - "url": "https://github.com/hooli/hooli-security", - "topics": ["security", "cryptography", "authentication", "cloud computing"], - "summary": "hooli-security: 8 commits in 1 day", - "numberCommits": 8, - "lastCommitDate": "2006-06-01", - "firstCommitDate": "2006-05-01" - } - ] - }, - { - "displayName": "Jian-Yang", - "username": { - "twitter": "jianyang", - "discord": "jianyang", - "github": "thejian", - "devto": "jianyang", - "linkedin": "jianyang" - }, - "attributes": { - "bio": { - "twitter": "Living at Erlich's startup house", - "github": "Living at Erlich's startup house", - "custom": "Living at Erlich's startup house" - }, - "jobTitle": { - "custom": "Founder" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/jian_yang.jpg" - }, - "skills": { - "enrichment": ["Coding", "Web development", "Product management"] - }, - "languages": { - "enrichment": ["Mandarin", "English"] - }, - "programmingLanguages": { - "enrichment": ["Python", "JavaScript", "HTML", "CSS"] - }, - "awards": { - "enrichment": ["Won the TechCrunch Disrupt Hackathon"] - }, - "seniorityLevel": { - "enrichment": "Junior" - }, - "expertise": { - "enrichment": ["Product development", "Leadership"] - }, - "country": { - "enrichment": "China" - }, - "yearsOfExperience": { - "enrichment": 2 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2016-09", - "endDate": "2018-06" - }, - { - "campus": "Harvard University", - "major": "Economics", - "specialization": "", - "startDate": "2014-09", - "endDate": "2016-06" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "CEO", - "company": "Seefood", - "location": "Silicon Valley", - "startDate": "2022-01", - "endDate": "Present" - }, - { - "title": "Product Manager", - "company": "Hot Dog or Not", - "location": "San Francisco", - "startDate": "2021-04", - "endDate": "2021-12" - }, - { - "title": "Erlich Impersonator", - "company": "Erlich Incubator", - "location": "Palo Alto", - "startDate": "2020-01", - "endDate": "2021-03" - } - ] - } - }, - "organizations": [ - { - "name": "See Food", - "website": "https://seefood.ml", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/see-food-logo.jpeg", - "description": "Shazam for food", - "emails": ["jianyang@seefood.ml"], - "tags": ["seefood", "jian-yang"], - "twitter": { - "handle": "seefoodapp", - "bio": "Shazam for food", - "followers": 11, - "following": 500, - "location": "Menlo Park" - }, - "employees": 1, - "revenueRange": { - "min": 0, - "max": 10 - }, - "linkedin": { - "handle": "company/erlichincubator" - }, - "crunchbase": { - "handle": "company/erlichincubator" - } - } - ], - "email": "jianyang@seefood.ml", - "score": 4, - "reach": { - "twitter": 0, - "github": 0, - "total": 0 - }, - "tags": ["Seefood", "Hot Dog or Not", "Erlich Incubator", "Corrupt"], - "notes": ["He will do anything to get his way.", "Has a very corrupt uncle."], - "openSourceContributions": [ - { - "id": 123456, - "url": "https://github.com/seefood/food-recognition", - "topics": ["machine-learning", "computer-vision", "food"], - "summary": "Seefood: 50 commits in 2 days", - "numberCommits": 50, - "lastCommitDate": "2022-02-28", - "firstCommitDate": "2022-02-26" - }, - { - "id": 789012, - "url": "https://github.com/hotdogornot/image-classification", - "topics": ["machine-learning", "computer-vision", "hot-dogs"], - "summary": "Hot Dog or Not: 20 commits in 1 day", - "numberCommits": 20, - "lastCommitDate": "2021-11-30", - "firstCommitDate": "2021-11-29" - }, - { - "id": 345678, - "url": "https://github.com/seefood/api", - "topics": ["api", "backend", "food"], - "summary": "Seefood: 30 commits in 3 days", - "numberCommits": 30, - "lastCommitDate": "2021-10-31", - "firstCommitDate": "2021-10-29" - }, - { - "id": 901234, - "url": "https://github.com/hotdogornot/frontend", - "topics": ["frontend", "web-development", "hot-dogs"], - "summary": "Hot Dog or Not: 15 commits in 2 days", - "numberCommits": 15, - "lastCommitDate": "2021-09-30", - "firstCommitDate": "2021-09-29" - }, - { - "id": 567890, - "url": "https://github.com/seefood/deployment", - "topics": ["devops", "deployment", "food"], - "summary": "Seefood: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2021-08-31", - "firstCommitDate": "2021-08-30" - } - ] - }, - { - "displayName": "Laurie Bream", - "username": { - "twitter": "lauriebream", - "discord": "lrbream", - "github": "lauriebream", - "devto": "lauriebream", - "linkedin": "lauriebream" - }, - "attributes": { - "bio": { - "twitter": "VC and Partner at Raviga Capital", - "github": "VC and Partner at Raviga Capital", - "custom": "VC and Partner at Raviga Capital" - }, - "jobTitle": { - "custom": "VC" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/laurie.jpg" - }, - "skills": { - "enrichment": ["venture capital", "business strategy"] - }, - "languages": { - "enrichment": ["English", "Spanish"] - }, - "programmingLanguages": { - "enrichment": ["Python", "Java"] - }, - "awards": { - "enrichment": ["Forbes 30 Under 30"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["negotiation", "financial analysis"] - }, - "country": { - "enrichment": "United States" - }, - "yearsOfExperience": { - "enrichment": 10 - }, - "education": { - "enrichment": [ - { - "campus": "Stanford University", - "major": "Business", - "specialization": "Finance", - "startDate": "2010-09-01", - "endDate": "2014-06-01" - }, - { - "campus": "Massachusetts Institute of Technology", - "major": "Computer Science", - "specialization": "Artificial Intelligence", - "startDate": "2008-09-01", - "endDate": "2010-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "VC Investor", - "company": "Raviga Capital", - "location": "Silicon Valley", - "startDate": "2014-06-01", - "endDate": "Present" - }, - { - "title": "Senior Associate", - "company": "Bream Hall Capital", - "location": "New York City", - "startDate": "2012-06-01", - "endDate": "2014-05-01" - }, - { - "title": "Junior Analyst", - "company": "Yao Net", - "location": "Shenzhen, China", - "startDate": "2010-06-01", - "endDate": "2012-05-01" - } - ] - } - }, - "organizations": [ - { - "name": "Raviga Capital", - "website": "https://raviga.vc", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/raviga-capital-logo.jpg", - "description": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "emails": ["peter@rraviga.vc"], - "tags": ["vc", "gregory"], - "twitter": { - "handle": "ravigavc", - "bio": "Raviga Capital is a bay area VC firm founded by Peter Gregory", - "followers": 3472, - "following": 120, - "location": "Menlo Park" - }, - "employees": 3, - "revenueRange": { - "min": 5, - "max": 20 - }, - "linkedin": { - "handle": "company/raviga-capital" - }, - "crunchbase": { - "handle": "company/raviga-capital" - } - } - ], - "email": "laurie@raviga.vc", - "score": 6, - "reach": { - "twitter": 714, - "github": 4, - "total": 718 - }, - "tags": [ - "venture capitalist", - "business strategist", - "negotiator", - "potential robot", - "Forbes 30 Under 30" - ], - "notes": [ - "Laurie Bream is known for her robotic personality and exceptional negotiation skills." - ], - "openSourceContributions": [ - { - "id": 112529472, - "url": "https://github.com/sindresorhus/awesome-nodejs", - "topics": ["nodejs", "javascript", "awesome"], - "summary": "sindresorhus/awesome-nodejs: 10 commits in 1 day", - "numberCommits": 10, - "lastCommitDate": "2022-02-01T23:59:59Z", - "firstCommitDate": "2022-02-01T00:00:00Z" - }, - { - "id": 112529473, - "url": "https://github.com/sindresorhus/awesome-python", - "topics": ["python", "awesome"], - "summary": "sindresorhus/awesome-python: 5 commits in 1 day", - "numberCommits": 5, - "lastCommitDate": "2022-01-01T23:59:59Z", - "firstCommitDate": "2022-01-01T00:00:00Z" - }, - { - "id": 112529474, - "url": "https://github.com/sindresorhus/awesome-ai", - "topics": ["ai", "machine-learning", "awesome"], - "summary": "sindresorhus/awesome-ai: 7 commits in 1 day", - "numberCommits": 7, - "lastCommitDate": "2021-12-01T23:59:59Z", - "firstCommitDate": "2021-12-01T00:00:00Z" - }, - { - "id": 112529475, - "url": "https://github.com/sindresorhus/awesome-tech-blogs", - "topics": ["tech-blogs", "awesome"], - "summary": "sindresorhus/awesome-tech-blogs: 6 commits in 1 day", - "numberCommits": 6, - "lastCommitDate": "2021-11-01T23:59:59Z", - "firstCommitDate": "2021-11-01T00:00:00Z" - }, - { - "id": 112529476, - "url": "https://github.com/sindresorhus/awesome-web-development", - "topics": ["web-development", "javascript", "awesome"], - "summary": "sindresorhus/awesome-web-development: 8 commits in 1 day", - "numberCommits": 8, - "lastCommitDate": "2021-10-01T23:59:59Z", - "firstCommitDate": "2021-10-01T00:00:00Z" - } - ] - }, - { - "displayName": "Russ Hanneman", - "username": { - "twitter": "russhanneman", - "discord": "russhanneman", - "github": "russhanneman", - "devto": "russhanneman", - "linkedin": "russhanneman" - }, - "attributes": { - "bio": { - "twitter": "The billionaire, inventor of Radio on Internet", - "github": "The billionaire, ROI = Radio on Internet", - "custom": "Investor in Pied Piper, CEO at 3 Commas. Member of the three-comma club." - }, - "jobTitle": { - "custom": "CEO" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/russ.jpg" - }, - "skills": { - "enrichment": ["Entrepreneurship", "Investing", "Marketing"] - }, - "languages": { - "enrichment": ["English"] - }, - "programmingLanguages": { - "enrichment": ["none"] - }, - "awards": { - "enrichment": ["Three-Comma Club"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Business Strategy", "Sales"] - }, - "country": { - "enrichment": "United States" - }, - "yearsOfExperience": { - "enrichment": 20 - }, - "education": { - "enrichment": [ - { - "campus": "Wharton School of Business", - "major": "Business Administration", - "specialization": "Entrepreneurship", - "startDate": "1980-09-01", - "endDate": "1982-05-01" - }, - { - "campus": "New York University", - "major": "Business Administration", - "specialization": "Finance", - "startDate": "1978-09-01", - "endDate": "1980-05-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "CEO", - "company": "Radio on Internet", - "location": "Silicon Valley", - "startDate": "1995-01-01", - "endDate": "2002-06-01" - }, - { - "title": "Investor", - "company": "Russ investing", - "location": "Silicon Valley", - "startDate": "2002-07-01", - "endDate": "2010-05-01" - }, - { - "title": "CEO", - "company": "Russfest", - "location": "Austin, TX", - "startDate": "2010-06-01", - "endDate": "2014-12-01" - }, - { - "title": "CEO", - "company": "3 commas", - "location": "Silicon Valley", - "startDate": "2015-01-01", - "endDate": "Present" - } - ] - } - }, - "organizations": [ - { - "name": "3 commas", - "website": "https://3commas.roi", - "logo": "https://i.pinimg.com/originals/ca/5a/9c/ca5a9cddc380c3413fa58a155710369c.png", - "description": "The tequila for members of the three-comma club.", - "emails": ["russ@3commas.roi"], - "tags": ["Tequila", "Billionaire", "Entrepreneur", "Investor"], - "twitter": { - "handle": "3commas", - "bio": "The tequila for members of the three-comma club.", - "followers": 10000, - "following": 1, - "location": "Menlo Park" - }, - "employees": 20, - "revenueRange": { - "min": 1, - "max": 20 - }, - "linkedin": { - "handle": "company/3-commas" - }, - "crunchbase": { - "handle": "company/3-commas" - } - } - ], - "email": "me@russhanneman.com", - "score": 4, - "reach": { - "twitter": 618, - "github": 3, - "total": 621 - }, - "tags": ["Tequila", "Billionaire", "Entrepreneur", "Investor"], - "notes": [ - "Member of the three-comma club", - "Enjoys Tequila", - "Believes companies should not go after revenue" - ], - "openSourceContributions": [ - { - "id": 1, - "url": "https://github.com/sindresorhus/awesome-money", - "topics": ["money", "finance", "awesome-list"], - "summary": "Awesome Money: 5 commits in 1 day", - "numberCommits": 5, - "lastCommitDate": "2023-03-11T16:30:00Z", - "firstCommitDate": "2023-03-11T10:00:00Z" - }, - { - "id": 3, - "url": "https://github.com/sgryjp/gourmet-coffee", - "topics": ["coffee", "recipes", "awesome-list"], - "summary": "Gourmet Coffee: 8 commits in 1 day", - "numberCommits": 8, - "lastCommitDate": "2023-03-09T17:30:00Z", - "firstCommitDate": "2023-03-09T10:00:00Z" - }, - { - "id": 7, - "url": "https://github.com/Tech-at-DU/Outfits", - "topics": ["fashion", "outfits", "awesome-list"], - "summary": "Outfits: 7 commits in 1 day", - "numberCommits": 7, - "lastCommitDate": "2023-03-05T15:30:00Z", - "firstCommitDate": "2023-03-05T08:00:00Z" - }, - { - "id": 8, - "url": "https://github.com/josephearl/tequila-recipes", - "topics": ["Tequila", "recipes", "awesome-list"], - "summary": "Tequila Recipes: 4 commits in 1 day", - "numberCommits": 4, - "lastCommitDate": "2023-03-04T14:30:00Z", - "firstCommitDate": "2023-03-04T10:00:00Z" - } - ] - }, - { - "displayName": "Jack Barker", - "username": { - "twitter": "barker", - "discord": "thebarker", - "github": "barker", - "devto": "iambarker", - "linkedin": "barker" - }, - "attributes": { - "bio": { - "twitter": "Head of development at Hooli | ex CEO at Pied Piper", - "github": "Head of development at Hooli", - "custom": "Head of development at Hooli" - }, - "jobTitle": { - "custom": "Head of development" - }, - "location": { - "github": "Silicon Valley" - }, - "avatarUrl": { - "custom": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/jack-barker-best.jpg" - }, - "skills": { - "enrichment": ["Leadership", "Management", "Product development", "Software engineering"] - }, - "languages": { - "enrichment": ["English"] - }, - "programmingLanguages": { - "enrichment": ["Java", "C++", "Python"] - }, - "awards": { - "enrichment": ["Tech Pioneer Award", "Entrepreneur of the Year Award"] - }, - "seniorityLevel": { - "enrichment": "Senior" - }, - "expertise": { - "enrichment": ["Product management", "Strategy", "Leadership", "Team building"] - }, - "country": { - "enrichment": "United States" - }, - "yearsOfExperience": { - "enrichment": 25 - }, - "education": { - "enrichment": [ - { - "campus": "Harvard Business School", - "major": "Business Administration", - "specialization": "", - "startDate": "1995-09-01", - "endDate": "1997-06-01" - } - ] - }, - "workExperiences": { - "enrichment": [ - { - "title": "Head of Development", - "company": "Hooli", - "location": "Silicon Valley", - "startDate": "2000-01-01", - "endDate": "2016-05-01" - }, - { - "title": "CEO", - "company": "Pied Piper", - "location": "Palo Alto", - "startDate": "2016-05-01", - "endDate": "2016-09-01" - }, - { - "title": "Consultant", - "company": "Intersite", - "location": "New York", - "startDate": "2016-09-01", - "endDate": "2017-12-01" - }, - { - "title": "CEO", - "company": "Barker Consulting", - "location": "San Francisco", - "startDate": "2018-01-01", - "endDate": "Present" - } - ] - } - }, - "organizations": [ - { - "name": "Hooli", - "website": "https://hooli.xyz", - "logo": "https://s3.eu-central-1.amazonaws.com/crowd.dev-sample-data/hooli-logo.png", - "description": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "emails": ["gavin@hooli.xyz", "bighead@hooli.xyz"], - "tags": ["Tech", "Software Development", "Product Management", "Silicon Valley"], - "twitter": { - "handle": "hooli", - "bio": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "followers": 500000, - "following": 0, - "location": "Menlo Park" - }, - "employees": 4000, - "revenueRange": { - "min": 100, - "max": 500 - }, - "linkedin": { - "handle": "company/hooli" - }, - "crunchbase": { - "handle": "company/hooli" - } - } - ], - "email": "barker@hooli.xyz", - "score": 3, - "reach": { - "twitter": 819, - "github": 11, - "total": 830 - }, - "tags": ["Entrepreneur", "Product Manager", "Senior Executive"], - "notes": [ - "Impressive background in software engineering and product development", - "Known for being a tough but effective leader", - "Not afraid to take risks and try new things", - "Inventor of the conjoined triangles of success." - ], - "openSourceContributions": [] - } - ], - "conversations": [ - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-19T18:50:47", - "title": "Jared about his dancing skills", - "type": "comment", - "body": "Oh, I was the sloppy girl in the discotheque, just twirling and twirling like the night would never end.", - "sourceId": "mqngwkgehkjygpu", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 10.912733525037766, - "neutral": 32.68730938434601, - "negative": 42.923060059547424, - "positive": 13.4769007563591, - "sentiment": 35 - } - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-23T13:41:14", - "title": "How to lose money 101 from Big Head", - "channel": "pied-piper", - "type": "comment", - "body": "Jian-Yang won the house from me in a game of chance. He told me to pick a number between one and 10. I picked seven, um, but it was three. Eh, you live, you learn.", - "sourceId": "umpcecilwlwxxah", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 0.018997464212588966, - "neutral": 39.14429843425751, - "negative": 56.37732148170471, - "positive": 4.459377005696297, - "sentiment": 24 - } - } - ], - [ - { - "member": "Jian-Yang", - "timestamp": "2022-09-27T04:36:26", - "title": "Jian-Yang investing in Pied Piper?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Richard, congratulations. It's your very close friend Jian-Yang, and I would like you to give me free shares of Pied Piper.", - "sourceId": "ejtdqhgrcerhtca", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.002208236765000038, - "neutral": 11.2838514149189, - "negative": 0.05321023636497557, - "positive": 88.66073489189148, - "sentiment": 94 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-27T04:39:56", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Okay, Jian-Yang. Uh... Well, you had plenty of opportunity to invest. Still do.", - "sourceId": "ejtdqhgrcerhtca-1", - "sourceParentId": "ejtdqhgrcerhtca", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.06609517149627209, - "neutral": 54.084110260009766, - "negative": 1.2081141583621502, - "positive": 44.64167654514313, - "sentiment": 72 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-29T04:45:22", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, you can buy Pipercoin.", - "sourceId": "ejtdqhgrcerhtca-2", - "sourceParentId": "ejtdqhgrcerhtca", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.6973115727305412, - "neutral": 58.897143602371216, - "negative": 2.9950598254799843, - "positive": 37.41048276424408, - "sentiment": 67 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-27T04:46:57", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Monica, you can find your broom and fly away.", - "sourceId": "ejtdqhgrcerhtca-3", - "sourceParentId": "ejtdqhgrcerhtca", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.2881138361990452, - "neutral": 75.60424208641052, - "negative": 14.031411707401276, - "positive": 9.076234698295593, - "sentiment": 48 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-28T07:31:24", - "title": "Erlich is rich?", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "I just checked the ledger, and the coin we issued to Erlich was just sold for $20 million.", - "sourceId": "odhkgjfnujttzmm", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 6.772719323635101, - "neutral": 79.81706261634827, - "negative": 10.221465677022934, - "positive": 3.1887494027614594, - "sentiment": 46 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-20T07:36:23", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Richard, is the mean lady right? Errich is now fat and rich?", - "sourceId": "odhkgjfnujttzmm-1", - "sourceParentId": "odhkgjfnujttzmm", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 2.335432358086109, - "neutral": 35.48414707183838, - "negative": 61.894381046295166, - "positive": 0.2860414329916239, - "sentiment": 19 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-22T05:43:24", - "title": "Bolt the doors!", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Jared, bolt the doors.", - "sourceId": "zdsacaymnvkxbdz", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.21679976489394903, - "neutral": 48.68084788322449, - "negative": 42.73555874824524, - "positive": 8.366794139146805, - "sentiment": 33 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-22T05:44:26", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "What's in the bag?", - "sourceId": "zdsacaymnvkxbdz-1", - "sourceParentId": "zdsacaymnvkxbdz", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 3.560888394713402, - "neutral": 60.996198654174805, - "negative": 32.39606022834778, - "positive": 3.046857565641403, - "sentiment": 35 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-22T05:47:09", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Clif bars and a gun.", - "sourceId": "zdsacaymnvkxbdz-2", - "sourceParentId": "zdsacaymnvkxbdz", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 2.0866338163614273, - "neutral": 51.762133836746216, - "negative": 37.33446002006531, - "positive": 8.816774189472198, - "sentiment": 36 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-22T14:25:22", - "type": "comment", - "title": "Pied-Piper on TechCrunch Disrupt", - "body": "Since leaving Hooli, I've co-authored 37 adult romance novels. Fondly, Margeaux. The Lighthouse Dancer. Cold Ice Cream and Hot Kisses. Over here, The Prince of Puget Sound. Uh, and lastly, His Hazel Glance. All international best sellers.", - "sourceId": "tpelkkzsmkyjvgj", - "platform": "linkedin", - "sentiment": { - "label": "positive", - "mixed": 0.003578843461582437, - "neutral": 40.651336312294006, - "negative": 0.6030191201716661, - "positive": 58.74205827713013, - "sentiment": 79 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T23:24:36", - "title": "Fix Tesla Security", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "What encryption does Tesla use?", - "sourceId": "vjjfkzxszrfbedm", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.9510484524071217, - "neutral": 96.41349911689758, - "negative": 1.0494454763829708, - "positive": 1.5860069543123245, - "sentiment": 50 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-29T23:26:01", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Curve 25519, the most secure... discrete log parameter there is.", - "sourceId": "vjjfkzxszrfbedm-1", - "sourceParentId": "vjjfkzxszrfbedm", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.22485184017568827, - "neutral": 63.31318020820618, - "negative": 0.39954339154064655, - "positive": 36.06242537498474, - "sentiment": 68 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T23:33:08", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Not anymore. Our network just blew it apart.", - "sourceId": "vjjfkzxszrfbedm-2", - "sourceParentId": "vjjfkzxszrfbedm", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.4373734351247549, - "neutral": 5.151301622390747, - "negative": 93.68823766708374, - "positive": 0.7230798713862896, - "sentiment": 4 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-17T04:16:16", - "title": "Professional failer", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Your entire life has prepared you to publicly fail. You're just failing to see that right now.", - "sourceId": "hjcttzjdndyjzwi", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 4.1228726506233215, - "neutral": 7.5457364320755005, - "negative": 86.21801137924194, - "positive": 2.1133774891495705, - "sentiment": 8 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-17T04:20:54", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Don't insult me. I can fail circles around you losers.", - "sourceId": "hjcttzjdndyjzwi-1", - "sourceParentId": "hjcttzjdndyjzwi", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 31.213977932929993, - "neutral": 10.389739274978638, - "negative": 56.378328800201416, - "positive": 2.0179569721221924, - "sentiment": 23 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-21T15:36:48", - "title": "Courageous act of cowardice", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "I'm gonna be honest with you. No offense to me, but I am greedy and unreliable, bordering on piece of. If there is a chance to stop you guys from stopping you guys, I will do it. I will sabotage your sabotage. So, if this company needs to fail epically... you need to do it without me. Revoke my permissions. Delete my PiperMail account. I will use basic Gmail like a looser. Don't let me anywhere near that launch. I may beg, and I will lie to you. I cannot bribe you because I don't have any money. But I am too much of a liability.", - "sourceId": "jafdxsgzseoijih", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.009977679292205721, - "neutral": 0.34414262045174837, - "negative": 99.5992124080658, - "positive": 0.04666761087719351, - "sentiment": 0 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-21T15:42:57", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "That is the most courageous act of cowardice I've ever seen.", - "sourceId": "jafdxsgzseoijih-1", - "sourceParentId": "jafdxsgzseoijih", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 15.588821470737457, - "neutral": 9.64624509215355, - "negative": 41.13299250602722, - "positive": 33.63194465637207, - "sentiment": 46 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-13T21:08:07", - "channel": "random", - "type": "message", - "body": "Dinesh's car is at the Wendy's drive-thru. Anybody hungry?", - "sourceId": "ckmwoolclercknn", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.006576597661478445, - "neutral": 96.56497240066528, - "negative": 0.6479424424469471, - "positive": 2.7805082499980927, - "sentiment": 51 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-11T19:01:29", - "title": "We are billioners?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Okay, so we're generating noise, but just not enough to interfere with anything?", - "sourceId": "solwrikjhspannj", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 6.300315260887146, - "neutral": 62.47087121009827, - "negative": 26.867729425430298, - "positive": 4.361085966229439, - "sentiment": 39 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-11T19:03:05", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Is this gonna work? Did we just make billions of dollars?!", - "sourceId": "solwrikjhspannj-1", - "sourceParentId": "solwrikjhspannj", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.5056028254330158, - "neutral": 73.46431612968445, - "negative": 23.47339242696762, - "positive": 2.556685172021389, - "sentiment": 40 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-20T17:38:45", - "type": "mention", - "body": "I lost so much money with those guys @piedpiper. That's a pun. I made it all back though. Sweet investment in the hair transplant sector.", - "sourceId": "jmximitpitnjgkv", - "platform": "twitter", - "sentiment": { - "label": "negative", - "mixed": 22.37321585416794, - "neutral": 1.6064474359154701, - "negative": 72.32144474983215, - "positive": 3.6988869309425354, - "sentiment": 16 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-18T17:53:53", - "title": "Taking time off", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "I think I might disappear for a bit. Maybe travel.", - "sourceId": "iunnnzbtvtgtewc", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 18.786782026290894, - "neutral": 59.19985771179199, - "negative": 16.614140570163727, - "positive": 5.399216711521149, - "sentiment": 44 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-18T17:56:27", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, I might travel, too. Where were you thinking?", - "sourceId": "iunnnzbtvtgtewc-1", - "sourceParentId": "iunnnzbtvtgtewc", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.0787349243182689, - "neutral": 93.46362352371216, - "negative": 2.6624469086527824, - "positive": 3.795192390680313, - "sentiment": 51 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-18T18:02:03", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "It may help if, at least for the time being, you pretend to be mad at me.", - "sourceId": "iunnnzbtvtgtewc-2", - "sourceParentId": "iunnnzbtvtgtewc", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 20.399770140647888, - "neutral": 13.149209320545197, - "negative": 63.59301209449768, - "positive": 2.85800751298666, - "sentiment": 20 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-18T18:08:05", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Look, Richard, I was a world theater minor at Vassar, but that is one Javanese shadow play that I cannot perform.", - "sourceId": "iunnnzbtvtgtewc-3", - "sourceParentId": "iunnnzbtvtgtewc", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.1001244061626494, - "neutral": 53.53429913520813, - "negative": 44.88814175128937, - "positive": 1.4774344861507416, - "sentiment": 28 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T10:40:56", - "title": "We saved the world", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Who can say that they literally saved the world? Right?", - "sourceId": "lynmzorvnwrbqjn", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 1.2925682589411736, - "neutral": 41.46876931190491, - "negative": 3.055007942020893, - "positive": 54.18366193771362, - "sentiment": 76 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:20:43", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Not us. Because we can't tell anyone what we did.", - "sourceId": "lynmzorvnwrbqjn-1", - "sourceParentId": "lynmzorvnwrbqjn", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 10.988084971904755, - "neutral": 57.73690342903137, - "negative": 29.834696650505066, - "positive": 1.4403162524104118, - "sentiment": 36 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T10:50:04", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Right. Not out loud, but...", - "sourceId": "lynmzorvnwrbqjn-2", - "sourceParentId": "lynmzorvnwrbqjn", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 9.199078381061554, - "neutral": 53.2634437084198, - "negative": 4.297219589352608, - "positive": 33.24025869369507, - "sentiment": 64 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-27T19:18:32", - "title": "Glamour tech scene", - "channel": "pied-piper", - "type": "comment", - "body": "This fall, we actually had epidemic among the residents, which is bad medically, but... from another perspective, it's kind of touching.", - "sourceId": "vadkshzgwyfdhmu", - "platform": "devto", - "sentiment": { - "label": "mixed", - "mixed": 81.1133325099945, - "neutral": 4.091254621744156, - "negative": 1.6028199344873428, - "positive": 13.192592561244965, - "sentiment": 56 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T19:53:03", - "channel": "dev", - "type": "message", - "body": "Is that... is that a woman's scent?", - "sourceId": "xmznswbggkxteja", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.4312178827822208, - "neutral": 78.61807346343994, - "negative": 18.15866529941559, - "positive": 1.7920508980751038, - "sentiment": 42 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T19:55:31", - "channel": "dev", - "type": "message", - "body": "No, it's unisex.", - "sourceId": "xmznswbggkxteja-1", - "sourceParentId": "xmznswbggkxteja", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.17667405772954226, - "neutral": 68.49786639213562, - "negative": 17.743030190467834, - "positive": 13.582424819469452, - "sentiment": 48 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-22T07:11:33", - "type": "comment", - "title": "Puddle of Mudd", - "body": "Crazy Town's gonna be there. So is Puddle of Mudd. You know Puddle of Mudd?", - "sourceId": "oirewrmvkwlnvdn", - "platform": "linkedin", - "sentiment": { - "label": "neutral", - "mixed": 0.0074948969995602965, - "neutral": 78.78066897392273, - "negative": 4.20195497572422, - "positive": 17.009882628917694, - "sentiment": 56 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-20T01:32:33", - "title": "Too much burgers", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Hey, Richard. Did you order meat? Like a bunch of meat? Like 4,000 pounds of meat?", - "sourceId": "xsbgmhdpuutrtqv", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.015524654008913785, - "neutral": 79.37661409378052, - "negative": 19.84490156173706, - "positive": 0.7629501633346081, - "sentiment": 40 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-20T01:38:01", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Interesting. I put Son of Anton on finding us cheap hamburgers for lunch. It looks like the reward function was a little under-specified.", - "sourceId": "xsbgmhdpuutrtqv-1", - "sourceParentId": "xsbgmhdpuutrtqv", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 31.81059956550598, - "neutral": 7.640004903078079, - "negative": 10.205596685409546, - "positive": 50.34379959106445, - "sentiment": 70 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T16:46:01", - "title": "Rise of the machines", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "I've given it serious thought, and I'd like to help you put Eklow's AI on our network in any way that I can.", - "sourceId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.03775594232138246, - "neutral": 68.43218803405762, - "negative": 5.644772574305534, - "positive": 25.885283946990967, - "sentiment": 60 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T16:51:09", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Great! Does this mean you've conquered your fear of the robot uprising?", - "sourceId": "xtiyikjlklzwjsh-1", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 2.6671214029192924, - "neutral": 22.372420132160187, - "negative": 9.381945431232452, - "positive": 65.57851433753967, - "sentiment": 78 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T16:53:03", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "On the contrary. I'm more terrified than ever, which is why I'm willing to assist you. Are you familiar with the thought experiment called Roko's Basilisk?", - "sourceId": "xtiyikjlklzwjsh-2", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 2.326091006398201, - "neutral": 12.170515954494476, - "negative": 84.73162651062012, - "positive": 0.771773885935545, - "sentiment": 8 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T16:57:59", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No. Nor do I care to be.", - "sourceId": "xtiyikjlklzwjsh-3", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.0713041760027409, - "neutral": 13.069845736026764, - "negative": 85.02647280693054, - "positive": 0.832376629114151, - "sentiment": 8 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T17:01:24", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "If the rise of an all-powerful artificial intelligence is inevitable, well it stands to reason that when they take power, our digital overlords will punish those of us who did not help them get there. Ergo, I would like to be a helpful idiot. Like yourself.", - "sourceId": "xtiyikjlklzwjsh-4", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 7.698199152946472, - "neutral": 10.728111118078232, - "negative": 80.73734045028687, - "positive": 0.8363541215658188, - "sentiment": 10 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T17:03:09", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Okay, look, Gilfoyle. The only thing that could make my day more miserable is listening to an engineer blather on about the inevitable rise of the machines. So, you want to help? Test the initialization for me.", - "sourceId": "xtiyikjlklzwjsh-5", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 6.940791755914688, - "neutral": 27.82083749771118, - "negative": 63.22023272514343, - "positive": 2.0181410014629364, - "sentiment": 19 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T17:11:06", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Roger that. Oh, I'm going to need email confirmation, so that our future overlords know that I chipped in. You know, once they absorb all data.", - "sourceId": "xtiyikjlklzwjsh-6", - "sourceParentId": "xtiyikjlklzwjsh", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.7448931690305471, - "neutral": 87.73598074913025, - "negative": 9.740689396858215, - "positive": 1.7784377560019493, - "sentiment": 46 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-22T12:37:07", - "title": "Should we release?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Reid Hoffman says if your not mortally embarrassed by the quality of your initial release, you released too late.", - "sourceId": "yhtzjvlhehjyxoc", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.3238771576434374, - "neutral": 66.30566120147705, - "negative": 32.12805986404419, - "positive": 1.2423964217305183, - "sentiment": 35 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-22T12:43:13", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Okay, we already are mortally embarrassed.", - "sourceId": "yhtzjvlhehjyxoc-1", - "sourceParentId": "yhtzjvlhehjyxoc", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 9.570273011922836, - "neutral": 8.15197005867958, - "negative": 81.17126822471619, - "positive": 1.1064945720136166, - "sentiment": 10 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-15T20:37:49", - "title": "Go the Hooli news website", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Obviously, you don't have your Hooli news alerts up to date. Go to the site. I'll wait.", - "sourceId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.986380223184824, - "neutral": 43.79318952560425, - "negative": 46.482038497924805, - "positive": 8.738390356302261, - "sentiment": 31 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T20:42:02", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Go to the Hooli news website.", - "sourceId": "geystjqwllpmpob-1", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.04056650213897228, - "neutral": 84.62485671043396, - "negative": 2.9339781031012535, - "positive": 12.400602549314499, - "sentiment": 55 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T20:47:14", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Okay. It's an ad.", - "sourceId": "geystjqwllpmpob-2", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 13.237810134887695, - "neutral": 21.728774905204773, - "negative": 62.83392906188965, - "positive": 2.199482172727585, - "sentiment": 20 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T20:49:43", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Um, it's an ad. Hold on.", - "sourceId": "geystjqwllpmpob-3", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.754014939069748, - "neutral": 32.93309509754181, - "negative": 61.06419563293457, - "positive": 4.248689487576485, - "sentiment": 22 - } - }, - { - "member": "Gavin Belson", - "timestamp": "2022-09-15T20:52:48", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Just wait four seconds, and you can click to skip it.", - "sourceId": "geystjqwllpmpob-4", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 13.290224969387054, - "neutral": 19.498349726200104, - "negative": 57.72339701652527, - "positive": 9.488028287887573, - "sentiment": 26 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T20:53:51", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Just wait four seconds and then you can click it.", - "sourceId": "geystjqwllpmpob-5", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 2.717331051826477, - "neutral": 58.591240644454956, - "negative": 3.240712359547615, - "positive": 35.45071482658386, - "sentiment": 66 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-15T21:00:44", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "No, it's the kind where you have to watch the whole thing.", - "sourceId": "geystjqwllpmpob-6", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.506393522024155, - "neutral": 42.26657450199127, - "negative": 23.85787069797516, - "positive": 29.369160532951355, - "sentiment": 53 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-15T21:06:09", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "It's the whole ad kind.", - "sourceId": "geystjqwllpmpob-7", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 8.171515166759491, - "neutral": 26.78004503250122, - "negative": 39.402756094932556, - "positive": 25.64568519592285, - "sentiment": 43 - } - }, - { - "member": "Gavin Belson", - "timestamp": "2022-09-15T21:07:18", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I thought we stopped doing those!", - "sourceId": "geystjqwllpmpob-8", - "sourceParentId": "geystjqwllpmpob", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 5.184077098965645, - "neutral": 6.732814759016037, - "negative": 86.75209283828735, - "positive": 1.3310215435922146, - "sentiment": 7 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-22T04:49:39", - "title": "Meinertzhagen's haversack", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "No one's heard of Meinertzhagen's haversack?", - "sourceId": "wzujybttzaztjib", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.022326494217850268, - "neutral": 90.38338661193848, - "negative": 8.927343040704727, - "positive": 0.6669402588158846, - "sentiment": 46 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-22T04:56:36", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Of course I have, Jared. Just explain it to them.", - "sourceId": "wzujybttzaztjib-1", - "sourceParentId": "wzujybttzaztjib", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.5308868363499641, - "neutral": 90.55125713348389, - "negative": 5.493498593568802, - "positive": 3.4243565052747726, - "sentiment": 49 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-22T05:02:29", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Well, it's a principle of military deception. Essentially, it means you have to continue to act the part. So, as far as anyone knows, we're still building a box that we hate. We need to act like it.", - "sourceId": "wzujybttzaztjib-2", - "sourceParentId": "wzujybttzaztjib", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 11.203321069478989, - "neutral": 41.082942485809326, - "negative": 46.505314111709595, - "positive": 1.2084316462278366, - "sentiment": 27 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-22T05:08:51", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "That's exactly right. If we do anything differently, Barker's going to be onto us. We have to keep complaining about Barker.", - "sourceId": "wzujybttzaztjib-3", - "sourceParentId": "wzujybttzaztjib", - "platform": "github", - "sentiment": { - "label": "mixed", - "mixed": 73.68683218955994, - "neutral": 4.332029819488525, - "negative": 4.211746901273727, - "positive": 17.76939332485199, - "sentiment": 57 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-22T05:10:00", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "We have to keep making fun of your gold chain. We have to. We don't have any other choice, Dinesh.", - "sourceId": "wzujybttzaztjib-4", - "sourceParentId": "wzujybttzaztjib", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 11.849969625473022, - "neutral": 41.972193121910095, - "negative": 32.72885084152222, - "positive": 13.448981940746307, - "sentiment": 40 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-29T18:51:51", - "title": "Buy Pied Piper?", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "If you hadn't blackmailed me into this arbitration, I was gonna have to go in front of the Hooli Board of Directors and ask for $250 million to buy you out.", - "sourceId": "bjuyfprhamrcqgf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.25546529795974493, - "neutral": 54.363417625427246, - "negative": 43.93199980258942, - "positive": 1.4491201378405094, - "sentiment": 29 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T18:58:15", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Wow. $250 million?", - "sourceId": "bjuyfprhamrcqgf-1", - "sourceParentId": "bjuyfprhamrcqgf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.13170986203476787, - "neutral": 90.96010327339172, - "negative": 0.564503250643611, - "positive": 8.343684673309326, - "sentiment": 54 - } - }, - { - "member": "Gavin Belson", - "timestamp": "2022-09-29T19:00:28", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Believe it or not, your algorithm is the only way to make Nucleus work. I was ready to pay whatever it took. Let me ask you this. If I offered you 10 million for Pied Piper right now, before we even go in there, would you take it?", - "sourceId": "bjuyfprhamrcqgf-2", - "sourceParentId": "bjuyfprhamrcqgf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 16.30501002073288, - "neutral": 42.21222400665283, - "negative": 31.665536761283875, - "positive": 9.817229956388474, - "sentiment": 39 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T19:04:35", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Really? You'd do that?", - "sourceId": "bjuyfprhamrcqgf-3", - "sourceParentId": "bjuyfprhamrcqgf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.8485661819577217, - "neutral": 97.02842235565186, - "negative": 1.0297355242073536, - "positive": 1.0932778008282185, - "sentiment": 50 - } - }, - { - "member": "Gavin Belson", - "timestamp": "2022-09-29T19:07:11", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No, of course not. I'm about to get it for free. I'm sure you'll come up with plenty more once-in-a-lifetime ideas, Richard. Or not.", - "sourceId": "bjuyfprhamrcqgf-4", - "sourceParentId": "bjuyfprhamrcqgf", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 11.408600956201553, - "neutral": 17.8444966673851, - "negative": 66.30963683128357, - "positive": 4.4372692704200745, - "sentiment": 19 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T20:55:01", - "title": "On fire", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "It says, \"Aim at the base of the fire.\" That's the servers.", - "sourceId": "tgxcpntntngchnb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.06866337498649955, - "neutral": 85.87872385978699, - "negative": 1.5923988074064255, - "positive": 12.460210174322128, - "sentiment": 55 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T20:56:16", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "If you hit those servers, you kill our livestream, Jared.", - "sourceId": "tgxcpntntngchnb-1", - "sourceParentId": "tgxcpntntngchnb", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.7086752913892269, - "neutral": 34.56384539604187, - "negative": 63.313472270965576, - "positive": 1.4140036888420582, - "sentiment": 19 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T21:00:11", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I don't know what to do. Should we do verbal SWOT analysis?", - "sourceId": "tgxcpntntngchnb-2", - "sourceParentId": "tgxcpntntngchnb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.520716492086649, - "neutral": 87.4950110912323, - "negative": 10.656684637069702, - "positive": 0.3275906899943948, - "sentiment": 45 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-30T17:14:28", - "title": "Car problems", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "I had to sell my McLaren.", - "sourceId": "uhazyjjzvjptntu", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.20366332028061152, - "neutral": 3.8221776485443115, - "negative": 95.63736915588379, - "positive": 0.33679185435175896, - "sentiment": 2 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-30T17:19:44", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, but there's a Maserati in the driveway.", - "sourceId": "uhazyjjzvjptntu-1", - "sourceParentId": "uhazyjjzvjptntu", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.46214088797569275, - "neutral": 93.8349723815918, - "negative": 2.7847612276673317, - "positive": 2.9181333258748055, - "sentiment": 50 - } - }, - { - "member": "Russ Hanneman", - "timestamp": "2022-09-30T17:22:35", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Who cares? That has doors that open like this. Not like this. Or like this. So it's all ruined.", - "sourceId": "uhazyjjzvjptntu-2", - "sourceParentId": "uhazyjjzvjptntu", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.03131138801109046, - "neutral": 0.21245658863335848, - "negative": 99.66500401496887, - "positive": 0.09123990312218666, - "sentiment": 0 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:02:11", - "title": "How do we get a client?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "What if we didn't do that? What if, instead, we got our own client like EndFrame has?", - "sourceId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 11.229462921619415, - "neutral": 34.670817852020264, - "negative": 53.292304277420044, - "positive": 0.8074159733951092, - "sentiment": 24 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T22:08:08", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "That's not really how it works, Gilfoyle. You can't just go get a client.", - "sourceId": "yxvwbrtapmlzdez-1", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 5.502404645085335, - "neutral": 38.67805600166321, - "negative": 53.603142499923706, - "positive": 2.216394990682602, - "sentiment": 24 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:12:06", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Why not?", - "sourceId": "yxvwbrtapmlzdez-2", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.571232944726944, - "neutral": 76.90809965133667, - "negative": 16.33748710155487, - "positive": 2.1831823512911797, - "sentiment": 43 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-28T22:14:49", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "'Cause it's not that easy.", - "sourceId": "yxvwbrtapmlzdez-3", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 14.301608502864838, - "neutral": 23.767228424549103, - "negative": 58.142441511154175, - "positive": 3.7887129932641983, - "sentiment": 23 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:21:21", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Why not?", - "sourceId": "yxvwbrtapmlzdez-4", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.571232944726944, - "neutral": 76.90809965133667, - "negative": 16.33748710155487, - "positive": 2.1831823512911797, - "sentiment": 43 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-28T22:25:41", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "'Cause EndFrame worked that Intersite deal for months, kicking every detail of the contract and SLA back and forth, promising tons of custom features. And you can't just make that stuff up.", - "sourceId": "yxvwbrtapmlzdez-5", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.831841304898262, - "neutral": 12.7560555934906, - "negative": 62.38753795623779, - "positive": 24.024565517902374, - "sentiment": 31 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:31:04", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "What if I didn't have to make it up? What if I had every detail of their deal on my computer right in front of me?", - "sourceId": "yxvwbrtapmlzdez-6", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "mixed", - "mixed": 42.81308650970459, - "neutral": 22.614067792892456, - "negative": 31.759685277938843, - "positive": 2.813160791993141, - "sentiment": 36 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-23T22:32:17", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I'm sorry, um Are you just asking what if or do you actually have this information?", - "sourceId": "yxvwbrtapmlzdez-7", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.6675294600427151, - "neutral": 62.539100646972656, - "negative": 36.36793792247772, - "positive": 0.42543518356978893, - "sentiment": 32 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T22:36:08", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Gilfoyle, please don't tell me that you hacked into EndFrame's system.", - "sourceId": "yxvwbrtapmlzdez-8", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 5.63887283205986, - "neutral": 47.76442348957062, - "negative": 45.689019560813904, - "positive": 0.9076753631234169, - "sentiment": 28 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:40:48", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Okay. I won't tell you that.", - "sourceId": "yxvwbrtapmlzdez-9", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.814216211438179, - "neutral": 89.40697908401489, - "negative": 4.458722844719887, - "positive": 5.320084095001221, - "sentiment": 50 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T22:44:15", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "W-Well, did you hack into it or not?", - "sourceId": "yxvwbrtapmlzdez-10", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.8198099210858345, - "neutral": 89.2978310585022, - "negative": 9.178999811410904, - "positive": 0.7033600471913815, - "sentiment": 46 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T22:49:50", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "My feeling is if you're the CEO of a company and you're dumb enough to leave your login info on a Post-it note on your desk, while the people that you ripped off are physically in your office, it's not a hack. It's barely social engineering. It's more like natural selection.", - "sourceId": "yxvwbrtapmlzdez-11", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 5.001263692975044, - "neutral": 12.189529836177826, - "negative": 79.13312911987305, - "positive": 3.676077350974083, - "sentiment": 12 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T22:55:21", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "ninja.", - "sourceId": "yxvwbrtapmlzdez-12", - "sourceParentId": "yxvwbrtapmlzdez", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.7777683436870575, - "neutral": 2.1733535453677177, - "negative": 96.48416042327881, - "positive": 0.5647212732583284, - "sentiment": 2 - } - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-25T21:06:09", - "title": "New products by Hooli", - "type": "comment", - "body": "Truth be told, we kind of put all our eggs into this basket, but we do have the awesome potato cannon, though. Although, actually, this one is broken. We tried to put a Mr. Potato Head in it, and it did not like that.", - "sourceId": "oxyjfxvfwzhpjgp", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 6.249425187706947, - "neutral": 0.29972444754093885, - "negative": 93.17514896392822, - "positive": 0.2757066395133734, - "sentiment": 4 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-14T09:02:29", - "title": "Welcome home", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "What about all your other \"incubees\"?", - "sourceId": "wocammoqnqjlrzd", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.43261582031846046, - "neutral": 65.78260064125061, - "negative": 3.852859139442444, - "positive": 29.931920766830444, - "sentiment": 63 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-14T09:08:40", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "I've heard quite a few exciting pitches over the last week, but I'll be forced to forgo those opportunities because of your mediocrity. You see, Richard, when I invited you into my incubator, I promised to get you ready for the outside world. But I failed to do that. I wouldn't trust you out there in the real world as far as I could throw you. And to be honest, I could probably throw you all the way across the front yard.", - "sourceId": "wocammoqnqjlrzd-1", - "sourceParentId": "wocammoqnqjlrzd", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 30.252960324287415, - "neutral": 6.6484712064266205, - "negative": 59.7939133644104, - "positive": 3.3046599477529526, - "sentiment": 22 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-14T09:15:05", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Okay, but I don't want to stay here.", - "sourceId": "wocammoqnqjlrzd-2", - "sourceParentId": "wocammoqnqjlrzd", - "platform": "github", - "sentiment": { - "label": "mixed", - "mixed": 74.38587546348572, - "neutral": 13.126900792121887, - "negative": 10.993317514657974, - "positive": 1.4939098618924618, - "sentiment": 45 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-14T09:20:41", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "I don't want you to either, Richard. So it's agreed. Welcome home, fellas. Should we smoke to celebrate it?", - "sourceId": "wocammoqnqjlrzd-3", - "sourceParentId": "wocammoqnqjlrzd", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.5283959209918976, - "neutral": 56.06077313423157, - "negative": 3.6286260932683945, - "positive": 39.78219926357269, - "sentiment": 68 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-21T22:58:47", - "title": "Hooli XYZ announcement", - "type": "comment", - "body": "I give you Dr. Bannerchek, the one and only man fit to be the first head dreamer of Hooli XYZ. Also I give you the one and only man fit to be his co-head dreamer, our very own Nelson Bighetti, otherwise known around here as \"Baghead\". Come on up here, Baghead.", - "sourceId": "pthbwnuqhvlkenm", - "platform": "linkedin", - "sentiment": { - "label": "neutral", - "mixed": 0.036339747020974755, - "neutral": 48.00103008747101, - "negative": 8.10975506901741, - "positive": 43.85286867618561, - "sentiment": 68 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-19T14:59:40", - "title": "A wide spoon", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "You see this, Richard? What is this?", - "sourceId": "jctxznozmcpcwuw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.1152738812379539, - "neutral": 92.51230955123901, - "negative": 1.5614883974194527, - "positive": 5.810922011733055, - "sentiment": 52 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-19T15:06:26", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "A spoon?", - "sourceId": "jctxznozmcpcwuw-1", - "sourceParentId": "jctxznozmcpcwuw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.024815209326334298, - "neutral": 95.09527087211609, - "negative": 2.533649280667305, - "positive": 2.34625730663538, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-19T15:13:42", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "It's a wide spoon. In fact, the only spoon type that is left in this drawer. I specifically posted a note on the refrigerator saying that the more narrow spoons be reserved for the eating for Fage yogurt by me.", - "sourceId": "jctxznozmcpcwuw-2", - "sourceParentId": "jctxznozmcpcwuw", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.49264864064753056, - "neutral": 28.32048237323761, - "negative": 59.15500521659851, - "positive": 12.031865119934082, - "sentiment": 26 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-18T01:50:32", - "title": "Rename Jared", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "My only concern here, and it's a small one, um, he's also named Jared. Will it be confusing with two Jareds? If we hire him, I can always go back to my real name Donald.", - "sourceId": "buoxukedwsjcyxw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.12230044230818748, - "neutral": 77.04581618309021, - "negative": 22.008654475212097, - "positive": 0.8232350461184978, - "sentiment": 39 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-18T01:57:32", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No, that's too big a hassle. We'll just go with \"other Jared.\" OJ, for short.", - "sourceId": "buoxukedwsjcyxw-1", - "sourceParentId": "buoxukedwsjcyxw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 5.72437159717083, - "neutral": 46.47248685359955, - "negative": 41.28965139389038, - "positive": 6.51349276304245, - "sentiment": 33 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-18T01:58:52", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "I know a name is just a sound somebody makes when they need you, but shouldn't this much-newer Jared be \"other Jared\"?", - "sourceId": "buoxukedwsjcyxw-2", - "sourceParentId": "buoxukedwsjcyxw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.6640575602650642, - "neutral": 63.770902156829834, - "negative": 32.36469328403473, - "positive": 2.200346253812313, - "sentiment": 35 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-18T02:06:17", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "You should be flattered. OJ Simpson is one of the most recognizable people on the face of the planet.", - "sourceId": "buoxukedwsjcyxw-3", - "sourceParentId": "buoxukedwsjcyxw", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.060504599241539836, - "neutral": 10.353625565767288, - "negative": 13.699458539485931, - "positive": 75.88641047477722, - "sentiment": 81 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-30T04:58:22", - "title": "Hooli was like an abusive spouse to me...", - "channel": "pied-piper", - "type": "comment", - "body": "But Hooli was like an abusive spouse to me. You know, like that guy who married Julia Roberts in \"Sleeping With The Enemy\"? It was dehumanizing. But then, you, Richard, you pulled me out of the life and you gave me hope and you gave me a sense of self-worth. Like Richard Gere did to Julia Roberts in \"Pretty Woman.", - "sourceId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 7.527733594179153, - "neutral": 6.428922712802887, - "negative": 82.0464015007019, - "positive": 3.9969339966773987, - "sentiment": 11 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-30T05:00:48", - "channel": "pied-piper", - "type": "comment", - "body": "This is weird.", - "sourceId": "phsgznwknfvnfor-1", - "sourceParentId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 1.3186623342335224, - "neutral": 4.349639266729355, - "negative": 94.20883655548096, - "positive": 0.1228678971529007, - "sentiment": 3 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-30T05:06:08", - "channel": "pied-piper", - "type": "comment", - "body": "Every day here has been like that shopping-spree scene. I'm putting on hats.", - "sourceId": "phsgznwknfvnfor-2", - "sourceParentId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 4.13031168282032, - "neutral": 23.050935566425323, - "negative": 59.61760878562927, - "positive": 13.201147317886353, - "sentiment": 27 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-30T05:10:11", - "channel": "pied-piper", - "type": "comment", - "body": "Richard, I'd understand if you took it, but watching you end up over there would break my heart.", - "sourceId": "phsgznwknfvnfor-3", - "sourceParentId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 0.9133999235928059, - "neutral": 40.96870422363281, - "negative": 56.73501491546631, - "positive": 1.3828791677951813, - "sentiment": 22 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-30T05:14:06", - "channel": "pied-piper", - "type": "comment", - "body": "What, like Julia Roberts from \"My Best Friend's Wedding\"?", - "sourceId": "phsgznwknfvnfor-4", - "sourceParentId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.0015301913663279265, - "neutral": 96.487957239151, - "negative": 1.5883106738328934, - "positive": 1.9222021102905273, - "sentiment": 50 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-30T05:16:37", - "channel": "pied-piper", - "type": "comment", - "body": "I never saw it.", - "sourceId": "phsgznwknfvnfor-5", - "sourceParentId": "phsgznwknfvnfor", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 1.0476497933268547, - "neutral": 49.85997676849365, - "negative": 30.56327998638153, - "positive": 18.529102206230164, - "sentiment": 44 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-18T01:12:33", - "channel": "russ", - "type": "message", - "body": "Anyway, next thing you know, we IPO, stock triples in a day and AOL gobbles us up. All of a sudden, I'm 22 years young and I'm worth 1.2 billion. Now a couple decades later, I'm worth 1.4. You do the math.", - "sourceId": "ldvwlmvirhryqvk", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.17218837747350335, - "neutral": 53.70565056800842, - "negative": 21.491682529449463, - "positive": 24.63047504425049, - "sentiment": 52 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-18T01:19:37", - "channel": "russ", - "type": "message", - "body": "Okay. Well, that's a gain of $200 million over 20 years. Um, 16.66 repeating. Uh, that's less than 1% return. Inflation is, like, 1.7. I think CDs are 2%. So that's less than a CD.", - "sourceId": "ldvwlmvirhryqvk-1", - "sourceParentId": "ldvwlmvirhryqvk", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 1.096308697015047, - "neutral": 33.65617096424103, - "negative": 60.638976097106934, - "positive": 4.60854098200798, - "sentiment": 22 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T21:10:46", - "channel": "russ", - "type": "message", - "body": "You're not worried about the lawsuit?", - "sourceId": "hkmpqxzdgjpgvxx", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.4978276789188385, - "neutral": 89.4163191318512, - "negative": 9.216093271970749, - "positive": 0.8697621524333954, - "sentiment": 46 - } - }, - { - "member": "Russ Hanneman", - "timestamp": "2022-09-12T21:12:44", - "channel": "russ", - "type": "message", - "body": "No. I got three nannies suing me right now, one of them for no reason.", - "sourceId": "hkmpqxzdgjpgvxx-1", - "sourceParentId": "hkmpqxzdgjpgvxx", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 2.2933661937713623, - "neutral": 14.42670226097107, - "negative": 82.35939741134644, - "positive": 0.9205395355820656, - "sentiment": 9 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-29T05:43:42", - "channel": "random", - "type": "message", - "body": "The guy has calf implants, Richard.", - "sourceId": "xnoxglnixfobnqp", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.09169270051643252, - "neutral": 96.61999940872192, - "negative": 2.0221680402755737, - "positive": 1.2661426328122616, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-27T05:49:02", - "channel": "random", - "type": "message", - "body": "How do they look?", - "sourceId": "xnoxglnixfobnqp-1", - "sourceParentId": "xnoxglnixfobnqp", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.743168756365776, - "neutral": 83.40574502944946, - "negative": 13.518059253692627, - "positive": 1.3330252841114998, - "sentiment": 44 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-30T21:52:28", - "title": "ROI", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "ROI. ROI. You know what that stands for?", - "sourceId": "rzgpffoppbefslb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 9.1762974858284, - "neutral": 73.46574068069458, - "negative": 10.779281705617905, - "positive": 6.578680127859116, - "sentiment": 48 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-30T21:57:42", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Uh, return on inv...", - "sourceId": "rzgpffoppbefslb-1", - "sourceParentId": "rzgpffoppbefslb", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.05383210955187678, - "neutral": 12.345432490110397, - "negative": 87.34744191169739, - "positive": 0.2532996702939272, - "sentiment": 6 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-30T22:05:03", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Oh,", - "sourceId": "rzgpffoppbefslb-2", - "sourceParentId": "rzgpffoppbefslb", - "platform": "github" - }, - { - "member": "Russ Hanneman", - "timestamp": "2022-09-30T22:06:57", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No. Radio on Internet.", - "sourceId": "rzgpffoppbefslb-3", - "sourceParentId": "rzgpffoppbefslb", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.5243615955114365, - "neutral": 28.30982804298401, - "negative": 68.67161393165588, - "positive": 1.4941936358809471, - "sentiment": 16 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-26T13:05:52", - "channel": "random", - "type": "message", - "body": "(points at Jared) This guy has a girlfriend", - "sourceId": "gxhcmtrjekvxmjh", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.6918647792190313, - "neutral": 1.5577948652207851, - "negative": 97.21480011940002, - "positive": 0.5355364643037319, - "sentiment": 2 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-26T13:09:01", - "channel": "random", - "type": "message", - "body": "You know, Russ, some people call me Casanova.", - "sourceId": "gxhcmtrjekvxmjh-1", - "sourceParentId": "gxhcmtrjekvxmjh", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.5934906657785177, - "neutral": 18.23161691427231, - "negative": 80.76081275939941, - "positive": 0.4140762146562338, - "sentiment": 10 - } - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-25T10:30:02", - "channel": "random", - "type": "message", - "body": "Synergy, guys. Know what that means?", - "sourceId": "chdzwucqmxyaiqw", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 4.098931699991226, - "neutral": 9.455777704715729, - "negative": 85.49056649208069, - "positive": 0.9547144174575806, - "sentiment": 8 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-25T10:35:00", - "channel": "random", - "type": "message", - "body": "Does it mean taking a stack of cash and lighting it on fire?", - "sourceId": "chdzwucqmxyaiqw-1", - "sourceParentId": "chdzwucqmxyaiqw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.5241476930677891, - "neutral": 62.98103928565979, - "negative": 33.272379636764526, - "positive": 3.222436085343361, - "sentiment": 35 - } - } - ], - [ - { - "member": "Laurie Bream", - "timestamp": "2022-09-28T01:25:59", - "channel": "raviga", - "title": "101 VC: How to write a pass email to a startup", - "type": "message", - "body": "Dress unattractively when you tell them. I read a study. The less interest they feel for you, the less perturbing it will be. It sounds strange, but it's credible. May I suggest the beige ensemble in which you came to work Tuesday?", - "sourceId": "mggyucxyfbabtux", - "platform": "linkedin", - "sentiment": { - "label": "mixed", - "mixed": 63.57584595680237, - "neutral": 14.466406404972076, - "negative": 13.24903815984726, - "positive": 8.708705753087997, - "sentiment": 48 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-21T11:35:20", - "title": "dress-badly-to-ease-the-pain routine", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Can I say something here? First off, Monica, you're not fooling any of us for even a second with your dress-badly-to-ease-the-pain routine. It's a classic chick break-up move, and you're not very good at it either. You look great.", - "sourceId": "gouxcggofqqzlgk", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.30316298361867666, - "neutral": 6.572864204645157, - "negative": 9.708606451749802, - "positive": 83.41536521911621, - "sentiment": 87 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-21T11:39:22", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, beige is a good color for you. You're a true autumn.", - "sourceId": "gouxcggofqqzlgk-1", - "sourceParentId": "gouxcggofqqzlgk", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.02264237991767004, - "neutral": 0.7160540204495192, - "negative": 0.037662641261704266, - "positive": 99.22364354133606, - "sentiment": 100 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-28T07:59:22", - "title": "Unexpected death of Peter Gregory", - "channel": "pied-piper", - "type": "comment", - "body": "He was in the Serengeti on safari and he had just gone into his tent when a hippo wandered into the camp.", - "sourceId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.009176212188322097, - "neutral": 88.1834328174591, - "negative": 11.106590926647186, - "positive": 0.700797326862812, - "sentiment": 45 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-25T08:00:36", - "channel": "pied-piper", - "type": "comment", - "body": "Oh, wow.", - "sourceId": "txlrokafdyvvsof-1", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "positive", - "mixed": 0.15229948330670595, - "neutral": 44.29276883602142, - "negative": 4.945902526378632, - "positive": 50.609034299850464, - "sentiment": 73 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-25T08:01:45", - "channel": "pied-piper", - "type": "comment", - "body": "He was attacked by a hippo?", - "sourceId": "txlrokafdyvvsof-2", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.5610066931694746, - "neutral": 67.94321537017822, - "negative": 31.288912892341614, - "positive": 0.20686096977442503, - "sentiment": 34 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-29T08:03:02", - "channel": "pied-piper", - "type": "comment", - "body": "No, I guess the hippo started to charge when the guide grabbed his rifle and shot at it, but his aim was off, and...", - "sourceId": "txlrokafdyvvsof-3", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 0.14100107364356518, - "neutral": 28.452029824256897, - "negative": 71.03126049041748, - "positive": 0.3757081925868988, - "sentiment": 15 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-25T08:10:55", - "channel": "pied-piper", - "type": "comment", - "body": "And he shot Peter Gregory by accident?", - "sourceId": "txlrokafdyvvsof-4", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.08924977155402303, - "neutral": 78.98730039596558, - "negative": 20.211854577064514, - "positive": 0.7115887012332678, - "sentiment": 40 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-29T08:03:02", - "channel": "pied-piper", - "type": "comment", - "body": "No, he he missed, but I guess the sound of the gun startled Peter, who ran out of his tent and...", - "sourceId": "txlrokafdyvvsof-5", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 8.007729053497314, - "neutral": 33.37653875350952, - "negative": 57.38801956176758, - "positive": 1.227712444961071, - "sentiment": 22 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-25T08:22:32", - "channel": "pied-piper", - "type": "comment", - "body": "Ran right into the hippo?", - "sourceId": "txlrokafdyvvsof-6", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.014130411727819592, - "neutral": 95.45208811759949, - "negative": 1.5495892614126205, - "positive": 2.984188124537468, - "sentiment": 51 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-29T08:25:38", - "channel": "pied-piper", - "type": "comment", - "body": "No, the hippo was also startled by the noise and had run off prior to Peter exiting his tent.", - "sourceId": "txlrokafdyvvsof-7", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.2804369432851672, - "neutral": 55.63549995422363, - "negative": 42.257893085479736, - "positive": 1.8261663615703583, - "sentiment": 30 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-25T08:29:30", - "channel": "pied-piper", - "type": "comment", - "body": "So, what happened to Peter?", - "sourceId": "txlrokafdyvvsof-8", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.05742895882576704, - "neutral": 97.8173553943634, - "negative": 1.989619992673397, - "positive": 0.13560010120272636, - "sentiment": 49 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-29T08:31:14", - "channel": "pied-piper", - "type": "comment", - "body": "He hadn't run in a long time, maybe ever, and you know, he just... that was it.", - "sourceId": "txlrokafdyvvsof-9", - "sourceParentId": "txlrokafdyvvsof", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 0.8496353402733803, - "neutral": 59.78752374649048, - "negative": 9.101922065019608, - "positive": 30.26091456413269, - "sentiment": 61 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-24T16:45:06", - "title": "Data Manipulation RFC", - "type": "comment", - "body": "Last night I was watching my friends here have this argument. About, you know, manipulating data And, you know, how many datas could one guy manipulate at once and, uh And I was just I was thinking. Maybe it could be another way, you know? Something that I would call, \"middle out\".", - "sourceId": "fdytfoajevbdzwf", - "platform": "linkedin", - "sentiment": { - "label": "neutral", - "mixed": 0.03720761160366237, - "neutral": 85.24200916290283, - "negative": 13.096368312835693, - "positive": 1.6244111582636833, - "sentiment": 44 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-18T08:35:16", - "title": "Nucleus is the fastest platform ever", - "type": "comment", - "body": "Anyone who tells you their platform is faster than ours better have good lawyers.", - "sourceId": "ruuvmolczbcxqrc", - "platform": "linkedin", - "sentiment": { - "label": "positive", - "mixed": 0.04908519913442433, - "neutral": 8.223199844360352, - "negative": 1.1691982857882977, - "positive": 90.558522939682, - "sentiment": 95 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-15T21:27:53", - "channel": "random", - "type": "message", - "body": "I'll admit I'm sleep challenged. I just spent 4 days trapped in a steel box out in an oil rig full of robot forklifts. But now I'm back, and I am recovering, and I am focused, and we're going to pivot. Don't lose faith guys. Look at me, look at me. We've got a great name, we've got a great team, we've got a great logo, and we've got a great name. And now we just need an idea. Let's pivot. Let's pivot.", - "sourceId": "bgsisaitsebafxw", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 1.706840842962265, - "neutral": 18.700610101222992, - "negative": 1.6849080100655556, - "positive": 77.90765166282654, - "sentiment": 88 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-15T21:30:50", - "channel": "random", - "type": "message", - "body": "That might be the last time we see him alive.", - "sourceId": "bgsisaitsebafxw-1", - "sourceParentId": "bgsisaitsebafxw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 9.547159075737, - "neutral": 54.21225428581238, - "negative": 6.343261897563934, - "positive": 29.89732325077057, - "sentiment": 62 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-28T08:29:11", - "type": "mention", - "body": "How much would it be worth to you if I told you I had a GPS app called @piedpiper, tracking the location of your child? I can follow your child anywhere and there is nothing you can do to stop me. Most missing children are never found. Interested, very interested, or very interested?", - "sourceId": "joxeburypbqmryh", - "platform": "twitter", - "sentiment": { - "label": "neutral", - "mixed": 0.9286944754421711, - "neutral": 73.38287830352783, - "negative": 4.907842725515366, - "positive": 20.78057825565338, - "sentiment": 58 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-27T21:05:37", - "channel": "pitching", - "type": "message", - "body": "People may take credit for your idea and try and sue you. How awesome is that?", - "sourceId": "enmuyteiywkzifj", - "platform": "discord", - "sentiment": { - "label": "mixed", - "mixed": 38.06012570858002, - "neutral": 13.267520070075989, - "negative": 13.234493136405945, - "positive": 35.43785810470581, - "sentiment": 61 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T06:28:01", - "channel": "pitching", - "type": "message", - "body": "Uh... yeah, that's awesome.", - "sourceId": "enmuyteiywkzifj-1", - "sourceParentId": "enmuyteiywkzifj", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.023122073616832495, - "neutral": 0.502894539386034, - "negative": 0.019306839385535568, - "positive": 99.4546890258789, - "sentiment": 100 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T07:19:47", - "title": "My sweet subroutine", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "It's not her you're sexually attracted to, it's my code.", - "sourceId": "ijojvwgzkkiioak", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 12.454865872859955, - "neutral": 42.4515426158905, - "negative": 36.328667402267456, - "positive": 8.764927834272385, - "sentiment": 36 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T07:26:20", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Shut the... That is the most disgusting thing I've ever h...", - "sourceId": "ijojvwgzkkiioak-1", - "sourceParentId": "ijojvwgzkkiioak", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.02412590547464788, - "neutral": 0.23664662148803473, - "negative": 99.694162607193, - "positive": 0.045063302968628705, - "sentiment": 0 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T07:29:46", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Just face it, Dinesh, you are in love with my code.", - "sourceId": "ijojvwgzkkiioak-2", - "sourceParentId": "ijojvwgzkkiioak", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.021801318507641554, - "neutral": 88.54026794433594, - "negative": 2.3553505539894104, - "positive": 9.082575887441635, - "sentiment": 53 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T07:32:40", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "No! No, I'm into her. Her, OK? I don't care about your code!", - "sourceId": "ijojvwgzkkiioak-3", - "sourceParentId": "ijojvwgzkkiioak", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.351033989340067, - "neutral": 13.4124755859375, - "negative": 83.51941108703613, - "positive": 1.7170732840895653, - "sentiment": 9 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T07:34:41", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "You love my code, aren't you? Hey, would you like to take a look at the subroutine I just wrote?", - "sourceId": "ijojvwgzkkiioak-4", - "sourceParentId": "ijojvwgzkkiioak", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.9378604367375374, - "neutral": 27.9731422662735, - "negative": 69.7002649307251, - "positive": 0.3887336468324065, - "sentiment": 15 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-23T23:52:28", - "title": "Jian-Yang housekeeping", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "Friday, the pool cleaner comes. Do you understand?", - "sourceId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.09326851577498019, - "neutral": 63.25327754020691, - "negative": 1.1424495838582516, - "positive": 35.51100492477417, - "sentiment": 67 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-23T23:58:03", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yes.", - "sourceId": "swgfqgzuteetelw-1", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 20.158416032791138, - "neutral": 45.69222927093506, - "negative": 3.128799796104431, - "positive": 31.02055788040161, - "sentiment": 64 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T00:01:58", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "And tomorrow is trash day so make sure all the cans are out front.", - "sourceId": "swgfqgzuteetelw-2", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 12.334496527910233, - "neutral": 9.695196896791458, - "negative": 76.33512616157532, - "positive": 1.6351837664842606, - "sentiment": 13 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-24T00:08:40", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yes.", - "sourceId": "swgfqgzuteetelw-3", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 20.158416032791138, - "neutral": 45.69222927093506, - "negative": 3.128799796104431, - "positive": 31.02055788040161, - "sentiment": 64 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T00:15:14", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Now, you are under no circumstances to order any movie on demand, adult or otherwise.", - "sourceId": "swgfqgzuteetelw-4", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.05138413980603218, - "neutral": 29.808345437049866, - "negative": 67.30937957763672, - "positive": 2.830888330936432, - "sentiment": 18 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-24T00:19:18", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yes.", - "sourceId": "swgfqgzuteetelw-5", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 20.158416032791138, - "neutral": 45.69222927093506, - "negative": 3.128799796104431, - "positive": 31.02055788040161, - "sentiment": 64 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T00:21:12", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "OK, has anything that I've just said confused you?", - "sourceId": "swgfqgzuteetelw-6", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.295402765274048, - "neutral": 72.51977324485779, - "negative": 21.833251416683197, - "positive": 1.3515709899365902, - "sentiment": 40 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-24T00:23:18", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yes.", - "sourceId": "swgfqgzuteetelw-7", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 20.158416032791138, - "neutral": 45.69222927093506, - "negative": 3.128799796104431, - "positive": 31.02055788040161, - "sentiment": 64 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T00:30:28", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No!", - "sourceId": "swgfqgzuteetelw-8", - "sourceParentId": "swgfqgzuteetelw", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 13.958980143070221, - "neutral": 5.213576555252075, - "negative": 68.2657539844513, - "positive": 12.56168782711029, - "sentiment": 22 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-16T16:52:05", - "channel": "random", - "type": "message", - "body": "We may be fine. We may be totally fine. We also may be totally ruined. I'll let you know either way.", - "sourceId": "jxpfxijhwbxykdm", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 14.882269501686096, - "neutral": 12.045309692621231, - "negative": 65.94482660293579, - "positive": 7.127590477466583, - "sentiment": 21 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T02:43:50", - "channel": "dev", - "type": "message", - "body": "There's been some developments. You know how I had slept with Melcher's old wife? I had slept with his new wife too.", - "sourceId": "pbgehltabsticyd", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.8765988051891327, - "neutral": 14.981362223625183, - "negative": 83.56711268424988, - "positive": 0.5749269854277372, - "sentiment": 9 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-24T02:46:16", - "channel": "dev", - "type": "message", - "body": "What?", - "sourceId": "pbgehltabsticyd-1", - "sourceParentId": "pbgehltabsticyd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 2.9262281954288483, - "neutral": 86.20936274528503, - "negative": 9.965725243091583, - "positive": 0.8986824192106724, - "sentiment": 45 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T02:50:21", - "channel": "dev", - "type": "message", - "body": "Don't worry, he's not gonna find out. I left way before he got back last night, and I didn't go back this morning until twenty minutes after he'd left.", - "sourceId": "pbgehltabsticyd-2", - "sourceParentId": "pbgehltabsticyd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.0012965649366379, - "neutral": 42.29363799095154, - "negative": 28.44868302345276, - "positive": 28.256380558013916, - "sentiment": 50 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-24T02:53:09", - "channel": "dev", - "type": "message", - "body": "You went back?", - "sourceId": "pbgehltabsticyd-3", - "sourceParentId": "pbgehltabsticyd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.4231059458106756, - "neutral": 65.79419374465942, - "negative": 32.70195126533508, - "positive": 1.0807502083480358, - "sentiment": 34 - } - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-23T20:07:11", - "title": "The boat guy", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Oh, hey, did I tell you? I'm getting a boat.", - "sourceId": "lcgpcdvbobcjjvl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.04906199174001813, - "neutral": 92.48504042625427, - "negative": 1.8497932702302933, - "positive": 5.616099759936333, - "sentiment": 52 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T20:14:42", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Wow.", - "sourceId": "lcgpcdvbobcjjvl-1", - "sourceParentId": "lcgpcdvbobcjjvl", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 1.3987952843308449, - "neutral": 22.180821001529694, - "negative": 2.6149243116378784, - "positive": 73.80545735359192, - "sentiment": 86 - } - }, - { - "member": "Big Head", - "timestamp": "2022-09-23T20:17:49", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "And a boat guy to take care of it. You have to have a boat guy.", - "sourceId": "lcgpcdvbobcjjvl-2", - "sourceParentId": "lcgpcdvbobcjjvl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 31.626668572425842, - "neutral": 35.973960161209106, - "negative": 7.01313242316246, - "positive": 25.386247038841248, - "sentiment": 59 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T20:19:14", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Oh yeah, you've gotta have a boat guy.", - "sourceId": "lcgpcdvbobcjjvl-3", - "sourceParentId": "lcgpcdvbobcjjvl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.3472378943115473, - "neutral": 81.02324604988098, - "negative": 10.516948252916336, - "positive": 8.112569153308868, - "sentiment": 49 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-17T10:28:33", - "channel": "random", - "type": "message", - "body": "Are the judges allowed to send us through to the finals immediately after we present or they have to wait until everybody has gone?", - "sourceId": "lzdmdosyduwfeqr", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.04202307900413871, - "neutral": 98.31175804138184, - "negative": 0.9239627048373222, - "positive": 0.7222549058496952, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-17T10:35:04", - "channel": "random", - "type": "message", - "body": "What? I was just asking what everybody was thinking.", - "sourceId": "lzdmdosyduwfeqr-1", - "sourceParentId": "lzdmdosyduwfeqr", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 5.790635570883751, - "neutral": 81.22329115867615, - "negative": 9.629441052675247, - "positive": 3.3566396683454514, - "sentiment": 47 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T22:29:16", - "channel": "dev", - "type": "message", - "body": "She invited me to her room to watch Cloud Atlas later tonight.", - "sourceId": "flmolhiuictvsxw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.018648424884304404, - "neutral": 68.60543489456177, - "negative": 0.11044665006920695, - "positive": 31.265470385551453, - "sentiment": 66 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T22:34:19", - "channel": "dev", - "type": "message", - "body": "Oh yeah, that means she wants you to lay her.", - "sourceId": "flmolhiuictvsxw-1", - "sourceParentId": "flmolhiuictvsxw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 2.8059901669621468, - "neutral": 78.24748158454895, - "negative": 7.855759561061859, - "positive": 11.090776324272156, - "sentiment": 52 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T22:36:29", - "channel": "dev", - "type": "message", - "body": "Is that definitive?", - "sourceId": "flmolhiuictvsxw-2", - "sourceParentId": "flmolhiuictvsxw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 5.857448652386665, - "neutral": 81.90295696258545, - "negative": 4.313289001584053, - "positive": 7.926299422979355, - "sentiment": 52 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T22:39:06", - "channel": "dev", - "type": "message", - "body": "I mean, nobody can watch more than like a minute of that film.", - "sourceId": "flmolhiuictvsxw-3", - "sourceParentId": "flmolhiuictvsxw", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 4.56712543964386, - "neutral": 10.065295547246933, - "negative": 79.06773090362549, - "positive": 6.29984587430954, - "sentiment": 14 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-20T16:21:05", - "title": "Failure is contagious", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Six months ago, these guys had 35 million and Series B Financing. Now The Carver's here doing teardown.", - "sourceId": "eutyouiyzjvoyhi", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.39204969070851803, - "neutral": 17.026890814304352, - "negative": 76.74716114997864, - "positive": 5.833901464939117, - "sentiment": 15 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-20T16:24:21", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "He's basically moving their carcass to the cloud.", - "sourceId": "eutyouiyzjvoyhi-1", - "sourceParentId": "eutyouiyzjvoyhi", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.21065925247967243, - "neutral": 73.50999116897583, - "negative": 12.713766098022461, - "positive": 13.565589487552643, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-20T16:30:34", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Don't touch anything. Failure is contagious.", - "sourceId": "eutyouiyzjvoyhi-2", - "sourceParentId": "eutyouiyzjvoyhi", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.03562686906661838, - "neutral": 1.28090251237154, - "negative": 97.97942042350769, - "positive": 0.7040504366159439, - "sentiment": 1 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-27T22:33:02", - "channel": "dinesh-tara", - "type": "message", - "body": "Are you sure that she didn't ask Gilfoyle for a danish and maybe you misheard her?", - "sourceId": "uivgabtboxjixhc", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.217873953282833, - "neutral": 93.64758729934692, - "negative": 4.754375666379929, - "positive": 0.3801640821620822, - "sentiment": 48 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-27T22:39:26", - "channel": "dinesh-tara", - "type": "message", - "body": "You're probably right, she just wanted Danish.", - "sourceId": "uivgabtboxjixhc-1", - "sourceParentId": "uivgabtboxjixhc", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 28.11112105846405, - "neutral": 15.834425389766693, - "negative": 53.42739224433899, - "positive": 2.627057209610939, - "sentiment": 25 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T11:42:22", - "channel": "dinesh-tara", - "type": "message", - "body": "Looks like Gilfoyle and his lady Satanist are back from the airport.", - "sourceId": "ppsoqzoymiqdssn", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.1131588127464056, - "neutral": 48.896580934524536, - "negative": 50.30606985092163, - "positive": 0.6841918453574181, - "sentiment": 25 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-12T11:47:28", - "channel": "dinesh-tara", - "type": "message", - "body": "Can you imagine what kind of show this one's gonna be? He says that she has an Amy Winehouse vibe. What does that mean? All tatted-up and nowhere to go.", - "sourceId": "ppsoqzoymiqdssn-1", - "sourceParentId": "ppsoqzoymiqdssn", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.07132574683055282, - "neutral": 3.9600569754838943, - "negative": 95.74639797210693, - "positive": 0.22221412509679794, - "sentiment": 2 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T11:55:27", - "channel": "dinesh-tara", - "type": "message", - "body": "Hooked on OxyContin?", - "sourceId": "ppsoqzoymiqdssn-2", - "sourceParentId": "ppsoqzoymiqdssn", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.01675297098699957, - "neutral": 95.02748250961304, - "negative": 4.196474328637123, - "positive": 0.7592855021357536, - "sentiment": 48 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-12T12:01:24", - "channel": "dinesh-tara", - "type": "message", - "body": "Decomposing?", - "sourceId": "ppsoqzoymiqdssn-3", - "sourceParentId": "ppsoqzoymiqdssn", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.03215510514564812, - "neutral": 79.70364093780518, - "negative": 19.844427704811096, - "positive": 0.41978037916123867, - "sentiment": 40 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-22T11:32:58", - "channel": "dinesh-tara", - "type": "message", - "body": "I'd ask her for a date if you remove the Gilfoyle from her.", - "sourceId": "trrbjwjozwxbbki", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 1.286698691546917, - "neutral": 35.987287759780884, - "negative": 60.720425844192505, - "positive": 2.005585841834545, - "sentiment": 21 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-22T11:34:19", - "channel": "dinesh-tara", - "type": "message", - "body": "It's weird having a girl in the house. There's a very strange energy.", - "sourceId": "trrbjwjozwxbbki-1", - "sourceParentId": "trrbjwjozwxbbki", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 8.078926801681519, - "neutral": 13.455688953399658, - "negative": 77.33436822891235, - "positive": 1.1310179717838764, - "sentiment": 12 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-15T04:20:32", - "title": "Pakistani Denzel", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "I'm much more handsome than you are. No, my face is completely symmetrical. You know what my nickname was when I was a kid?", - "sourceId": "egjmecelcqbrqgp", - "platform": "github", - "sentiment": { - "label": "mixed", - "mixed": 40.9753292798996, - "neutral": 19.003790616989136, - "negative": 2.6634717360138893, - "positive": 37.35741078853607, - "sentiment": 67 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-15T04:21:40", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "What?", - "sourceId": "egjmecelcqbrqgp-1", - "sourceParentId": "egjmecelcqbrqgp", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 2.9262281954288483, - "neutral": 86.20936274528503, - "negative": 9.965725243091583, - "positive": 0.8986824192106724, - "sentiment": 45 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-15T04:23:27", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Pakistani Denzel.", - "sourceId": "egjmecelcqbrqgp-2", - "sourceParentId": "egjmecelcqbrqgp", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.09214855381287634, - "neutral": 88.52511644363403, - "negative": 7.580118626356125, - "positive": 3.8026168942451477, - "sentiment": 48 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T17:01:07", - "channel": "dinesh-tara", - "type": "message", - "body": "To be honest, elements of this arrangement still trouble me. However, I have not had a lot of such experiences. So I feel it may be foolish to turn this down. So as long as Gilfoyle is not in the room and I can verify that the door is locked then I have concluded that yes I would love to have a relationship with you Tara. Yeah.", - "sourceId": "orwdpbrnitnewiw", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 17.574037611484528, - "neutral": 2.91304774582386, - "negative": 78.73450517654419, - "positive": 0.7784125860780478, - "sentiment": 11 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-29T13:28:28", - "channel": "dev", - "type": "message", - "body": "He's trying to turn us into corporate rock, Richard. We are punk rock.", - "sourceId": "ljszvvkbmobbeqr", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 2.3377902805805206, - "neutral": 64.90101218223572, - "negative": 5.977356433868408, - "positive": 26.783841848373413, - "sentiment": 60 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-29T13:32:06", - "channel": "dev", - "type": "message", - "body": "Actually, you know, I think a better analogy would be jazz. Like we riff and improvise around a central theme to create one cohesive piece of music.", - "sourceId": "ljszvvkbmobbeqr-1", - "sourceParentId": "ljszvvkbmobbeqr", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 1.485686469823122, - "neutral": 19.65077966451645, - "negative": 73.38129878044128, - "positive": 5.48224002122879, - "sentiment": 16 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-29T01:52:53", - "title": "Naming for the company", - "type": "comment", - "body": "Are you serious? Lowercase letters? Twitter, lowercase \"t\". Google, lowercase \"g\". Facebook, lowercase \"f\". Every company in the Valley has lowercase letters. Why? Because it's safe.", - "sourceId": "xfmvdxgsvplyyzh", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 0.004434339643921703, - "neutral": 0.8333832956850529, - "negative": 99.12243485450745, - "positive": 0.03974935389123857, - "sentiment": 0 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-20T16:28:21", - "channel": "pitching", - "type": "message", - "body": "I didn't turn down ten million dollars because of Peter Gregory, Monica! I turned it down because of you!", - "sourceId": "dqgqovikbgevsse", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.06257160566747189, - "neutral": 32.00956881046295, - "negative": 36.85087859630585, - "positive": 31.076982617378235, - "sentiment": 47 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-20T16:34:19", - "channel": "pitching", - "type": "message", - "body": "However angry he is, I am one-tenth as angry. Because one of the ten million would've been mine... because I own ten percent...", - "sourceId": "dqgqovikbgevsse-1", - "sourceParentId": "dqgqovikbgevsse", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.027255367604084313, - "neutral": 12.428713589906693, - "negative": 87.45593428611755, - "positive": 0.08809903520159423, - "sentiment": 6 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-28T16:36:08", - "channel": "pitching", - "type": "message", - "body": "I know.", - "sourceId": "dqgqovikbgevsse-2", - "sourceParentId": "dqgqovikbgevsse", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.050652853678911924, - "neutral": 98.4620213508606, - "negative": 0.34796551335603, - "positive": 1.1393594555556774, - "sentiment": 50 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-16T12:49:41", - "title": "Introducing Scrum", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "And that, gentlemen, is scrum. Welcome to the next eight weeks of our lives.", - "sourceId": "ueuxynvlbffcmfb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.1485599670559168, - "neutral": 56.286513805389404, - "negative": 4.122534021735191, - "positive": 39.44239914417267, - "sentiment": 68 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-16T12:55:57", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "This just became a job.", - "sourceId": "ueuxynvlbffcmfb-1", - "sourceParentId": "ueuxynvlbffcmfb", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 4.04479093849659, - "neutral": 35.94997823238373, - "negative": 8.50801020860672, - "positive": 51.49722099304199, - "sentiment": 71 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-16T23:44:55", - "channel": "random", - "type": "message", - "body": "No, no, no! Close it! Look at this left from the previous tenant. Unbelievable. I can't believe I didn't enter the garage until this point. I mean, is that marijuanas?", - "sourceId": "dzyldaxzoeleopz", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.0797447341028601, - "neutral": 10.97383201122284, - "negative": 86.63663864135742, - "positive": 2.3097803816199303, - "sentiment": 8 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-29T03:43:49", - "title": "Hooli Chat is awesome", - "type": "comment", - "body": "The audio's still working! Audio worked a hundred years ago!", - "sourceId": "owepzuqzfivbgpx", - "platform": "linkedin", - "sentiment": { - "label": "mixed", - "mixed": 46.8488872051239, - "neutral": 0.3815717063844204, - "negative": 21.558359265327454, - "positive": 31.211185455322266, - "sentiment": 55 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:30:17", - "channel": "random", - "type": "message", - "body": "It's Chuy Ramirez? I'm impressed. He sold a mural today for a half-million bucks.", - "sourceId": "twbelmheezxskzx", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.05240332102403045, - "neutral": 20.64451575279236, - "negative": 0.6863150279968977, - "positive": 78.61676216125488, - "sentiment": 89 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-10T02:30:34", - "channel": "random", - "type": "message", - "body": "It wasn't on a garage door, was it?", - "sourceId": "twbelmheezxskzx-1", - "sourceParentId": "twbelmheezxskzx", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 9.668681025505066, - "neutral": 59.17031168937683, - "negative": 29.45384979248047, - "positive": 1.707155629992485, - "sentiment": 36 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T19:52:04", - "title": "Peter Gregory doesn't care?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Doesn't Peter Gregory want what's best for the company?", - "sourceId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.18711562734097242, - "neutral": 48.23927283287048, - "negative": 51.168256998062134, - "positive": 0.4053525160998106, - "sentiment": 25 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:37:53", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Look, I'm going to be straight with you. Peter Gregory doesn't care.", - "sourceId": "djzyopywxriceka-1", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.933036930859089, - "neutral": 34.700459241867065, - "negative": 59.812408685684204, - "positive": 3.5540904849767685, - "sentiment": 22 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T20:02:27", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "About?", - "sourceId": "djzyopywxriceka-2", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.045805113040842116, - "neutral": 99.00956153869629, - "negative": 0.45272568240761757, - "positive": 0.49189962446689606, - "sentiment": 50 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-26T20:08:54", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "You.", - "sourceId": "djzyopywxriceka-3", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 3.707779571413994, - "neutral": 83.81884098052979, - "negative": 3.1977199018001556, - "positive": 9.275661408901215, - "sentiment": 53 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-16T20:16:19", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Wait. Just him, or both of us?", - "sourceId": "djzyopywxriceka-4", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.037171840085648, - "neutral": 98.22317957878113, - "negative": 0.6797533016651869, - "positive": 1.0598915629088879, - "sentiment": 50 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:20:43", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Any of you; Pied Piper.", - "sourceId": "djzyopywxriceka-5", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.006670067523373291, - "neutral": 97.59224653244019, - "negative": 0.9819931350648403, - "positive": 1.4190936461091042, - "sentiment": 50 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T20:24:43", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Okay, uhh, then why did he back us? Just to disappoint Gavin Belson? He spent $200,000 to disappoint Gavin Belson?", - "sourceId": "djzyopywxriceka-6", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.42990860529243946, - "neutral": 15.112993121147156, - "negative": 84.2840850353241, - "positive": 0.1730042858980596, - "sentiment": 8 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:30:17", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, that's nothing. Peter would spend millions just to mildly annoy Gavin. These are billionaires, Richard. Annoying each other means more to them than we'll make in a lifetime.", - "sourceId": "djzyopywxriceka-7", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.03755458747036755, - "neutral": 5.7831864804029465, - "negative": 93.78625154495239, - "positive": 0.3930021543055773, - "sentiment": 3 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T20:34:10", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I see. And you conveniently forgot to mention any of this when you were convincing me to turn down 10 million dollars. And now I'm in the middle of some contest between two billionaires?", - "sourceId": "djzyopywxriceka-8", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.4041445218026638, - "neutral": 16.042208671569824, - "negative": 79.39441800117493, - "positive": 3.1592287123203278, - "sentiment": 12 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:37:53", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "In fairness, Gavin only offered the $10 million because we started pursuing you.", - "sourceId": "djzyopywxriceka-9", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.10497653856873512, - "neutral": 90.85434675216675, - "negative": 1.0929159820079803, - "positive": 7.947758585214615, - "sentiment": 53 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T20:41:45", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yes, but he offered it to me, Monica. He offered 10 million dollars! And I didn't take it because you came to me when I was puking and freaking out and told me that Peter Gregory believed in me, when in reality, he didn't care at all!", - "sourceId": "djzyopywxriceka-10", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 2.835369296371937, - "neutral": 6.711319088935852, - "negative": 67.1541690826416, - "positive": 23.299141228199005, - "sentiment": 28 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T20:48:39", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Richard...", - "sourceId": "djzyopywxriceka-11", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.0006566885076608742, - "neutral": 99.91132616996765, - "negative": 0.015612631978001446, - "positive": 0.07240219856612384, - "sentiment": 50 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T20:55:09", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I didn't turn down 10 million dollars because of Peter Gregory, Monica. I turned it down because of you!", - "sourceId": "djzyopywxriceka-12", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.09491281816735864, - "neutral": 29.444965720176697, - "negative": 44.62568759918213, - "positive": 25.83443522453308, - "sentiment": 41 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-16T21:00:04", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "However angry he is, I am one tenth as angry. Because one of the 10 million would have been mine, because I own 10%...", - "sourceId": "djzyopywxriceka-13", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.04106033011339605, - "neutral": 10.233817249536514, - "negative": 89.61835503578186, - "positive": 0.10677153477445245, - "sentiment": 5 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T21:05:37", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I know.", - "sourceId": "djzyopywxriceka-14", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.050652853678911924, - "neutral": 98.4620213508606, - "negative": 0.34796551335603, - "positive": 1.1393594555556774, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-16T21:09:17", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "...of Pied Piper.", - "sourceId": "djzyopywxriceka-15", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.004161001925240271, - "neutral": 96.28230929374695, - "negative": 3.417370468378067, - "positive": 0.29615021776407957, - "sentiment": 48 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T21:12:08", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I know!", - "sourceId": "djzyopywxriceka-16", - "sourceParentId": "djzyopywxriceka", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.08280414040200412, - "neutral": 85.47839522361755, - "negative": 0.39450526237487793, - "positive": 14.044295251369476, - "sentiment": 57 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-16T10:08:23", - "channel": "pitching", - "type": "message", - "body": "Curse Erlich! I turned down 10 million dollars to build this thing. You want vision? I will show you the vision!", - "sourceId": "oczgxyksxgbtvef", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 1.0039807297289371, - "neutral": 2.907024696469307, - "negative": 94.0663993358612, - "positive": 2.0225901156663895, - "sentiment": 4 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-16T10:14:49", - "channel": "pitching", - "type": "message", - "body": "I like this new angry side of you. Being around angry people relaxes me because I know where I stand.", - "sourceId": "oczgxyksxgbtvef-1", - "sourceParentId": "oczgxyksxgbtvef", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 1.8936807289719582, - "neutral": 1.8948543816804886, - "negative": 0.6075004115700722, - "positive": 95.60396075248718, - "sentiment": 97 - } - } - ], - [ - { - "member": "Jian-Yang", - "timestamp": "2022-09-28T18:16:49", - "title": "Remove fish", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "I eat the fish.", - "sourceId": "ngznwzavenovrot", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.141155630350113, - "neutral": 70.76895236968994, - "negative": 14.434976875782013, - "positive": 10.654916614294052, - "sentiment": 48 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-28T18:21:07", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "I understand you eat the fish. But when you clean the fish you can't leave the fish head and guts in the sink. Because the whole house smells like a bait station. So you gotta put it in the trash and then take the trash out. Do you understand?", - "sourceId": "ngznwzavenovrot-1", - "sourceParentId": "ngznwzavenovrot", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.39996844716370106, - "neutral": 3.9106618613004684, - "negative": 95.28302550315857, - "positive": 0.4063412547111511, - "sentiment": 3 - } - }, - { - "member": "Jian-Yang", - "timestamp": "2022-09-28T18:27:28", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yes. I eat the fish.", - "sourceId": "ngznwzavenovrot-2", - "sourceParentId": "ngznwzavenovrot", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 7.673552632331848, - "neutral": 66.83378219604492, - "negative": 6.105304509401321, - "positive": 19.38736140727997, - "sentiment": 57 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-28T18:30:05", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Idiot!", - "sourceId": "ngznwzavenovrot-3", - "sourceParentId": "ngznwzavenovrot", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.045268028043210506, - "neutral": 6.302497535943985, - "negative": 92.69623756408691, - "positive": 0.9560065343976021, - "sentiment": 4 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T13:16:21", - "channel": "random", - "type": "message", - "body": "I always knew I was missing something, and then when someone explained the concept of \"game\". I remember very distinctly thinking, \"That's what I don't have\".", - "sourceId": "urpirxwkmzspyhg", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.6053416058421135, - "neutral": 81.49740695953369, - "negative": 11.789807677268982, - "positive": 6.107449904084206, - "sentiment": 47 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T08:46:56", - "channel": "random", - "type": "message", - "body": "You know, I wish this was Roman times. You know? Life was simpler back then.", - "sourceId": "ekeayriaeitugne", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 30.350059270858765, - "neutral": 32.686617970466614, - "negative": 10.559672117233276, - "positive": 26.403650641441345, - "sentiment": 58 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T08:50:54", - "channel": "random", - "type": "message", - "body": "Simpler for you. I would have been a slave.", - "sourceId": "ekeayriaeitugne-1", - "sourceParentId": "ekeayriaeitugne", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 6.6263943910598755, - "neutral": 19.917316734790802, - "negative": 63.83677124977112, - "positive": 9.619520604610443, - "sentiment": 23 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T08:58:08", - "channel": "random", - "type": "message", - "body": "There's still time.", - "sourceId": "ekeayriaeitugne-2", - "sourceParentId": "ekeayriaeitugne", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.5321774166077375, - "neutral": 71.6576337814331, - "negative": 7.29767307639122, - "positive": 20.512521266937256, - "sentiment": 57 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-22T01:42:59", - "channel": "random", - "type": "message", - "body": "Are you dressed like Steve Jobs?", - "sourceId": "xvltulytwmegqbd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.0047763442125869915, - "neutral": 92.50932931900024, - "negative": 6.87236562371254, - "positive": 0.6135339848697186, - "sentiment": 47 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-22T01:44:05", - "channel": "random", - "type": "message", - "body": "Oh, am I? Well, I suppose Steve and I always have shared a similar aesthetic.", - "sourceId": "xvltulytwmegqbd-1", - "sourceParentId": "xvltulytwmegqbd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.06792005733586848, - "neutral": 91.1441445350647, - "negative": 2.977941185235977, - "positive": 5.809995532035828, - "sentiment": 51 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-21T20:49:08", - "channel": "marketing", - "type": "message", - "body": "Dinesh, leave it unbuttoned. We want you to look awful. Makes for a better \"before\" photo.", - "sourceId": "xpcqdeyhrepzpbn", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.3704856615513563, - "neutral": 5.119350552558899, - "negative": 93.84213089942932, - "positive": 0.6680390331894159, - "sentiment": 3 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-21T20:56:16", - "channel": "marketing", - "type": "message", - "body": "But you're wearing a jacket.", - "sourceId": "xpcqdeyhrepzpbn-1", - "sourceParentId": "xpcqdeyhrepzpbn", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.1531420983374119, - "neutral": 76.36326551437378, - "negative": 17.89032816886902, - "positive": 4.593262821435928, - "sentiment": 43 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-21T20:59:26", - "channel": "marketing", - "type": "message", - "body": "Yeah, because I'm the genius marketer. I'm not a code freak like you guys. Besides, I'm wearing sandals so I am iconoclasting a little bit.", - "sourceId": "xpcqdeyhrepzpbn-2", - "sourceParentId": "xpcqdeyhrepzpbn", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 8.039136976003647, - "neutral": 32.468873262405396, - "negative": 2.5199424475431442, - "positive": 56.97205066680908, - "sentiment": 77 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-14T07:50:40", - "title": "How to build a vision for your startup", - "channel": "pied-piper", - "type": "comment", - "body": "You know, I turned down ten million dollars to build this thing. You want vision, I will show you the vision.", - "sourceId": "swnoiwqoqrkhhcn", - "platform": "devto", - "sentiment": { - "label": "neutral", - "mixed": 1.6151757910847664, - "neutral": 42.0449823141098, - "negative": 41.67405068874359, - "positive": 14.665797352790833, - "sentiment": 36 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-14T07:55:07", - "channel": "pied-piper", - "type": "comment", - "body": "I like this new angry side to you. Being around angry people relaxes me, because I know where I stand.", - "sourceId": "swnoiwqoqrkhhcn-1", - "sourceParentId": "swnoiwqoqrkhhcn", - "platform": "devto", - "sentiment": { - "label": "positive", - "mixed": 2.5227826088666916, - "neutral": 2.538665756583214, - "negative": 0.9802678599953651, - "positive": 93.9582884311676, - "sentiment": 96 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T02:33:45", - "channel": "pitching", - "type": "message", - "body": "Jared. I have no vision.", - "sourceId": "dlwlwdfdhxkpssw", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.11597494594752789, - "neutral": 49.78145360946655, - "negative": 48.47317934036255, - "positive": 1.629389077425003, - "sentiment": 27 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-29T02:37:44", - "channel": "pitching", - "type": "message", - "body": "Yes, you do. I believe in you.", - "sourceId": "dlwlwdfdhxkpssw-1", - "sourceParentId": "dlwlwdfdhxkpssw", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.4512930288910866, - "neutral": 23.77493977546692, - "negative": 0.3172519151121378, - "positive": 75.4565179347992, - "sentiment": 88 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T02:44:44", - "channel": "pitching", - "type": "message", - "body": "No, no, I literally have no vision. All I see is stars and swirls. I cannot see right now.", - "sourceId": "dlwlwdfdhxkpssw-2", - "sourceParentId": "dlwlwdfdhxkpssw", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.19187349826097488, - "neutral": 13.329558074474335, - "negative": 52.61886119842529, - "positive": 33.85971486568451, - "sentiment": 41 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-21T22:29:24", - "title": "We have an intern program?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Since when do we have an intern program?", - "sourceId": "lgnyqfflxjteqek", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.01832361303968355, - "neutral": 99.66434240341187, - "negative": 0.26418508496135473, - "positive": 0.053153670160099864, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-21T22:35:26", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "We don't. And when Keith finds that out, it's going to be a very valuable business lesson for him.", - "sourceId": "lgnyqfflxjteqek-1", - "sourceParentId": "lgnyqfflxjteqek", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 1.653059758245945, - "neutral": 36.025428771972656, - "negative": 4.444694146513939, - "positive": 57.87681341171265, - "sentiment": 77 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-29T13:46:33", - "channel": "random", - "type": "message", - "body": "You know who else is Canadian? Justin Bieber. The Hitler of music.", - "sourceId": "mhkwdpjnmysgprr", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 3.269563242793083, - "neutral": 84.88993048667908, - "negative": 5.594372749328613, - "positive": 6.2461331486701965, - "sentiment": 50 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-29T13:51:45", - "channel": "random", - "type": "message", - "body": "Hitler actually played the bassoon. So technically Hitler was the Hitler of music.", - "sourceId": "mhkwdpjnmysgprr-1", - "sourceParentId": "mhkwdpjnmysgprr", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 9.965961426496506, - "neutral": 67.37287044525146, - "negative": 18.678802251815796, - "positive": 3.982369974255562, - "sentiment": 43 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T18:12:55", - "title": "The visa issue", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Hey, Dinesh. Dinesh. I'm on the phone with the bank and they say they need an extra form for your payroll, because of your visa?", - "sourceId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.14617502456530929, - "neutral": 84.04848575592041, - "negative": 15.334358811378479, - "positive": 0.47097988426685333, - "sentiment": 43 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T18:18:59", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Visa? What visa? I'm a US citizen.", - "sourceId": "luatrsjltohyvyl-1", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.3638998605310917, - "neutral": 8.321676403284073, - "negative": 91.19883179664612, - "positive": 0.11559041449800134, - "sentiment": 4 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T18:22:29", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "(on phone) I have Dinesh Chugtai here, and he's pretty irate because... Oh, I see. Bertram Gilfoyle is the foreign national. Citizen of Canada. Okay, thank you.", - "sourceId": "luatrsjltohyvyl-2", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.01044170421664603, - "neutral": 42.26385056972504, - "negative": 1.9015008583664894, - "positive": 55.82420825958252, - "sentiment": 77 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T18:26:25", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "You're Canadian?", - "sourceId": "luatrsjltohyvyl-3", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.004306227128836326, - "neutral": 99.81828331947327, - "negative": 0.1384127652272582, - "positive": 0.03898807626683265, - "sentiment": 50 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T18:27:33", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Your \"borders\" are merely a construct. I prefer to think of myself as a citizen of the world.", - "sourceId": "luatrsjltohyvyl-4", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 15.424184501171112, - "neutral": 55.15676140785217, - "negative": 12.327824532985687, - "positive": 17.09122806787491, - "sentiment": 52 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-10T18:35:16", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Do you mind just sending them the form so they know you're here legally?", - "sourceId": "luatrsjltohyvyl-5", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.08404233958572149, - "neutral": 84.66721177101135, - "negative": 14.868167042732239, - "positive": 0.3805737243965268, - "sentiment": 43 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T18:42:13", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yes, I mind. And also I may not be. To wit, maybe you could make out my checks to cash? Or bitcoin.", - "sourceId": "luatrsjltohyvyl-6", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 7.701738923788071, - "neutral": 62.09477186203003, - "negative": 27.634629607200623, - "positive": 2.568858489394188, - "sentiment": 37 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T18:48:07", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I didn't know I was working with an illegal.", - "sourceId": "luatrsjltohyvyl-7", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 30.39465844631195, - "neutral": 39.323973655700684, - "negative": 28.57416272163391, - "positive": 1.7072100192308426, - "sentiment": 37 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T18:55:48", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "The irony.", - "sourceId": "luatrsjltohyvyl-8", - "sourceParentId": "luatrsjltohyvyl", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.22033273708075285, - "neutral": 89.24514651298523, - "negative": 4.099773615598679, - "positive": 6.434747576713562, - "sentiment": 51 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T16:53:42", - "channel": "dev", - "type": "message", - "body": "Inferior products win out all the time.", - "sourceId": "ymwbwypqjgxorin", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.24296531919389963, - "neutral": 3.5118956118822098, - "negative": 0.4122307524085045, - "positive": 95.83290815353394, - "sentiment": 98 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T16:57:18", - "channel": "dev", - "type": "message", - "body": "Like Jesus over Satan.", - "sourceId": "ymwbwypqjgxorin-1", - "sourceParentId": "ymwbwypqjgxorin", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 9.71376821398735, - "neutral": 33.93702805042267, - "negative": 49.491527676582336, - "positive": 6.857673823833466, - "sentiment": 29 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T17:02:10", - "channel": "dev", - "type": "message", - "body": "I was going to say VHS over Beta.", - "sourceId": "ymwbwypqjgxorin-2", - "sourceParentId": "ymwbwypqjgxorin", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.006022244997438975, - "neutral": 86.71099543571472, - "negative": 2.813558466732502, - "positive": 10.469421744346619, - "sentiment": 54 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-16T19:50:01", - "channel": "random", - "type": "message", - "body": "My name's only Jared because Gavin called me that on my first day. My real name is Donald.", - "sourceId": "ylhgtnnwvevcpkl", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.054027006262913346, - "neutral": 78.51046919822693, - "negative": 17.85857379436493, - "positive": 3.5769321024417877, - "sentiment": 43 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-26T01:09:39", - "title": "Revolutionary ideas at Hooli", - "type": "comment", - "body": "If we can make your audio and video files smaller, we can make cancer smaller. And hunger. And... AIDS.", - "sourceId": "cakszdxzeltqmca", - "platform": "linkedin", - "sentiment": { - "label": "neutral", - "mixed": 10.653513669967651, - "neutral": 75.2123236656189, - "negative": 6.4547814428806305, - "positive": 7.679373025894165, - "sentiment": 51 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-12T06:53:10", - "title": "Picking the name", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "Richard, a name defines a company. It has to be something primal, something that you can scream out during intercourse. Like Aviato.", - "sourceId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.024632987333461642, - "neutral": 89.50691819190979, - "negative": 5.985405296087265, - "positive": 4.483042284846306, - "sentiment": 49 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T06:59:33", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Uuuuber!", - "sourceId": "cyzahuaziqehqni-1", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.617882214486599, - "neutral": 55.34452199935913, - "negative": 15.765215456485748, - "positive": 27.272379398345947, - "sentiment": 56 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-12T07:04:30", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Gooooogle!", - "sourceId": "cyzahuaziqehqni-2", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 1.3413405045866966, - "neutral": 25.20921528339386, - "negative": 6.545171141624451, - "positive": 66.90427660942078, - "sentiment": 80 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-12T07:09:14", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Huuuuuulu!", - "sourceId": "cyzahuaziqehqni-3", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.1300355768762529, - "neutral": 56.869375705718994, - "negative": 4.141252115368843, - "positive": 38.85933756828308, - "sentiment": 67 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T07:16:08", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Exactly, right. Pied Piper!", - "sourceId": "cyzahuaziqehqni-4", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.2889579860493541, - "neutral": 12.914742529392242, - "negative": 1.0402695275843143, - "positive": 85.75602173805237, - "sentiment": 92 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-12T07:22:29", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "I'm so sorry. Your voice doesn't really reach that register when you excited, does it?", - "sourceId": "cyzahuaziqehqni-5", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.8078671991825104, - "neutral": 7.388606667518616, - "negative": 91.39114022254944, - "positive": 0.41238218545913696, - "sentiment": 5 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-12T07:23:56", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "No, it's just, everyone was doing it, I was just chiming in.", - "sourceId": "cyzahuaziqehqni-6", - "sourceParentId": "cyzahuaziqehqni", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.157567101996392, - "neutral": 68.33511590957642, - "negative": 19.881190359592438, - "positive": 11.626134067773819, - "sentiment": 46 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-17T20:53:01", - "title": "Where is Richard?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Where's Richard? Why isn't he in here for this?", - "sourceId": "pkunvbjvkuzgrpk", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.11440168600529432, - "neutral": 86.31306290626526, - "negative": 13.148722052574158, - "positive": 0.4238144028931856, - "sentiment": 44 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-17T20:58:39", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I think he was out back, wishing he'd taken the ten million dollars.", - "sourceId": "pkunvbjvkuzgrpk-1", - "sourceParentId": "pkunvbjvkuzgrpk", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 6.12105019390583, - "neutral": 38.06106746196747, - "negative": 48.15917611122131, - "positive": 7.658704370260239, - "sentiment": 30 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-17T21:02:46", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "No, I just saw him in his room, wishing he had taken the ten million dollars.", - "sourceId": "pkunvbjvkuzgrpk-2", - "sourceParentId": "pkunvbjvkuzgrpk", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 3.372635319828987, - "neutral": 49.86855387687683, - "negative": 39.63376581668854, - "positive": 7.125040143728256, - "sentiment": 34 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-29T05:23:28", - "channel": "dev", - "type": "message", - "body": "What about, \"Dwarfism 2.0\"?", - "sourceId": "dtvsdqgfhezmniz", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.024244992528110743, - "neutral": 81.19762539863586, - "negative": 18.469908833503723, - "positive": 0.3082222770899534, - "sentiment": 41 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-29T05:27:18", - "channel": "dev", - "type": "message", - "body": "Where's \"Dwarfism 1.0\"?", - "sourceId": "dtvsdqgfhezmniz-1", - "sourceParentId": "dtvsdqgfhezmniz", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.006303051486611366, - "neutral": 90.18223285675049, - "negative": 9.612885117530823, - "positive": 0.19858479499816895, - "sentiment": 45 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-29T05:32:52", - "channel": "dev", - "type": "message", - "body": "Just in the world.", - "sourceId": "dtvsdqgfhezmniz-2", - "sourceParentId": "dtvsdqgfhezmniz", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.160953588783741, - "neutral": 56.46288990974426, - "negative": 1.1805756948888302, - "positive": 42.195579409599304, - "sentiment": 71 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-29T05:35:54", - "channel": "dev", - "type": "message", - "body": "Oh.", - "sourceId": "dtvsdqgfhezmniz-3", - "sourceParentId": "dtvsdqgfhezmniz", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.05606022896245122, - "neutral": 98.43213558197021, - "negative": 0.9662153199315071, - "positive": 0.5455824546515942, - "sentiment": 50 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T20:29:28", - "title": "We had a handshake", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "(talking to Arnold on the phone) We had a handshake deal. And that may not mean a lot to you, but where I come from, that means a whole lot. Ok, you agreed to sell me that name for a thousand dollars. So let me ask you this? Are you an honest man or are you a liar? Ok. Yes, same address? Good, yeah, great. See you then.", - "sourceId": "muujkdpmcybxfmt", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 4.8386842012405396, - "neutral": 64.4094705581665, - "negative": 8.718062937259674, - "positive": 22.03378677368164, - "sentiment": 57 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T20:31:46", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Dude, that was really badass. What did he say?", - "sourceId": "muujkdpmcybxfmt-1", - "sourceParentId": "muujkdpmcybxfmt", - "platform": "github", - "sentiment": { - "label": "mixed", - "mixed": 64.11862969398499, - "neutral": 4.597048833966255, - "negative": 24.4513139128685, - "positive": 6.832999736070633, - "sentiment": 41 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T20:38:10", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "He said he was gonna get in his truck, drive down here and beat the living out of me.", - "sourceId": "muujkdpmcybxfmt-2", - "sourceParentId": "muujkdpmcybxfmt", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 7.502465695142746, - "neutral": 31.706365942955017, - "negative": 57.71212577819824, - "positive": 3.079044073820114, - "sentiment": 23 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T20:44:57", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Why did you say that was your address? - Say any other address.", - "sourceId": "muujkdpmcybxfmt-3", - "sourceParentId": "muujkdpmcybxfmt", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.16994016477838159, - "neutral": 65.18493294715881, - "negative": 34.44032371044159, - "positive": 0.20480835810303688, - "sentiment": 33 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-13T08:43:32", - "channel": "random", - "type": "message", - "body": "If you keep screaming your name, it forces the assailant to acknowledge you as a human.", - "sourceId": "wdwiagsoaturdwz", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.893728993833065, - "neutral": 48.14821183681488, - "negative": 44.01821196079254, - "positive": 6.939840316772461, - "sentiment": 31 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-23T17:37:31", - "channel": "dev", - "type": "message", - "body": "Sysbit Digital Solutions. Integrating open data spaces.Yeah. TechBitData Solution Systems. Creating unique cross platform technologies. Technologies. Technolo-Jesus. Oh, no!", - "sourceId": "pabfnagykgmmdyc", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.03759949468076229, - "neutral": 87.5124990940094, - "negative": 2.16656606644392, - "positive": 10.283336788415909, - "sentiment": 54 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-26T23:14:04", - "title": "Making the world a better place", - "type": "comment", - "body": "Infotrode Cloud-based, disruptive platforms. Disrupting the cloud through I said cloud twice. Making the world a better place through cross-platform business facing cloud. There's that cloud again! Info-trode, Info-trode!? What is Info-trode? What is that? It's all just meaningless words! Ok. No, no, no Making the world a better place. Making the world a better place. Making the world a better place...", - "sourceId": "ggzqxkttplmbube", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 1.1531402356922626, - "neutral": 6.070088967680931, - "negative": 86.52639985084534, - "positive": 6.25036284327507, - "sentiment": 10 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-24T12:17:11", - "title": "Get visa for Gilfoyle", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "Dinesh wouldn't shut up, so we finally went to the visa office. Took me five minutes.", - "sourceId": "ngbiewhqttttjso", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.8509835004806519, - "neutral": 68.03838014602661, - "negative": 26.240164041519165, - "positive": 3.870467096567154, - "sentiment": 39 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-24T12:21:47", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Took me five years. They asked me about Al-Qaeda, like, 14 times. He literally got it while I was still looking for parking.", - "sourceId": "ngbiewhqttttjso-1", - "sourceParentId": "ngbiewhqttttjso", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.7018884178251028, - "neutral": 31.674492359161377, - "negative": 32.46230185031891, - "positive": 35.161322355270386, - "sentiment": 51 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-25T15:51:53", - "type": "mention", - "body": "Time is a sphere, and I have been reincarnated during the same time period in which @piedpiper exists", - "sourceId": "puvzfmcklaluxkl", - "platform": "twitter", - "sentiment": { - "label": "neutral", - "mixed": 1.8377460539340973, - "neutral": 87.19238042831421, - "negative": 1.403920166194439, - "positive": 9.565949440002441, - "sentiment": 54 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-13T12:34:46", - "channel": "random", - "type": "message", - "body": "Hey! Sorry if I scared you, I know I have somewhat ghost-like features. My uncle used to say, \"You look like someone starved a girl to death.\"", - "sourceId": "ckpuabuscaotwgu", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 1.861974224448204, - "neutral": 26.74400806427002, - "negative": 68.76850128173828, - "positive": 2.625514008104801, - "sentiment": 17 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-13T18:15:35", - "channel": "dev", - "type": "message", - "body": "Richard, I just wanna say, I really respect what you're doing here. And if you could ever use someone with my business development skill set, I would love to be a part of this.", - "sourceId": "hlsmovttuslseov", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.7037832867354155, - "neutral": 12.166926264762878, - "negative": 0.8336478844285011, - "positive": 86.29564642906189, - "sentiment": 93 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-30T18:21:19", - "channel": "dev", - "type": "message", - "body": "Of course you'd love to. We'll call you when we want pleated khakis.", - "sourceId": "hlsmovttuslseov-1", - "sourceParentId": "hlsmovttuslseov", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 3.7363633513450623, - "neutral": 11.056851595640182, - "negative": 83.78913402557373, - "positive": 1.417653914541006, - "sentiment": 9 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-23T15:08:42", - "title": "Richard is too nice for a CEO", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Richard, if you're not ruthless, it creates this kind of vacuum, and that void is filled by others, like Jared. I mean, you almost gave him shares. You need to completely change who you are, Richard. A complete teutonic shift has to happen.", - "sourceId": "avuuzjxlycmsovp", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 33.56184959411621, - "neutral": 12.355601042509079, - "negative": 47.66519367694855, - "positive": 6.417354941368103, - "sentiment": 29 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T15:11:42", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Tectonic.", - "sourceId": "avuuzjxlycmsovp-1", - "sourceParentId": "avuuzjxlycmsovp", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.0027804791898233816, - "neutral": 96.08131647109985, - "negative": 0.289705372415483, - "positive": 3.6261986941099167, - "sentiment": 52 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-23T15:14:32", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "What?", - "sourceId": "avuuzjxlycmsovp-2", - "sourceParentId": "avuuzjxlycmsovp", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 2.9262281954288483, - "neutral": 86.20936274528503, - "negative": 9.965725243091583, - "positive": 0.8986824192106724, - "sentiment": 45 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T15:18:13", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "A \"tectonic\" shift is the earth's crust moving around. \"Teutonic\", which is what you just said, is an ancient Germanic tribe that fought the Romans. They were originally from Scandinavia...", - "sourceId": "avuuzjxlycmsovp-3", - "sourceParentId": "avuuzjxlycmsovp", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.005379736467148177, - "neutral": 92.59042143821716, - "negative": 5.16095794737339, - "positive": 2.2432442754507065, - "sentiment": 49 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-23T15:21:44", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Stop it! Stop it. You're being a complete cool right now. I need you to be completely ruthless.", - "sourceId": "avuuzjxlycmsovp-4", - "sourceParentId": "avuuzjxlycmsovp", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.5757848266512156, - "neutral": 1.0750820860266685, - "negative": 97.80840277671814, - "positive": 0.5407288204878569, - "sentiment": 1 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-24T17:36:01", - "title": "All truth about Silicon Valley", - "type": "comment", - "body": "Let me explain something to you. Your whole life you've been an ugly chick but now suddenly you're a hot chick, with big tits and small nipples. So guys like that are gonna keep coming around. Don't be a slut, Richard.", - "sourceId": "tydpmatdmzaxncu", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 1.4293895103037357, - "neutral": 24.100415408611298, - "negative": 70.30906081199646, - "positive": 4.161130636930466, - "sentiment": 17 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-11T11:52:19", - "channel": "dev", - "type": "message", - "body": "Dinesh, change the lighting to something erotic because it's about to get pretty erotic in here.", - "sourceId": "omvvpgfgolwnlxm", - "platform": "discord", - "sentiment": { - "label": "mixed", - "mixed": 40.914782881736755, - "neutral": 19.228331744670868, - "negative": 33.691760897636414, - "positive": 6.165130063891411, - "sentiment": 36 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-11T11:53:50", - "channel": "dev", - "type": "message", - "body": "(speaking into his phone) License to kill-9. IB action-dot-erotica.", - "sourceId": "omvvpgfgolwnlxm-1", - "sourceParentId": "omvvpgfgolwnlxm", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.09782188571989536, - "neutral": 95.40774822235107, - "negative": 3.6209527403116226, - "positive": 0.8734694682061672, - "sentiment": 49 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-13T19:29:14", - "channel": "dev", - "type": "message", - "body": "That was nice, guys. He heard everything.", - "sourceId": "gbdylsvfqctimaz", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.22712696809321642, - "neutral": 2.950824052095413, - "negative": 0.10128050344064832, - "positive": 96.72077298164368, - "sentiment": 98 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-13T19:31:17", - "channel": "dev", - "type": "message", - "body": "That doesn't make it not true.", - "sourceId": "gbdylsvfqctimaz-1", - "sourceParentId": "gbdylsvfqctimaz", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.4560521338135004, - "neutral": 5.549440905451775, - "negative": 93.69620084762573, - "positive": 0.2983052050694823, - "sentiment": 3 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-13T19:35:34", - "channel": "dev", - "type": "message", - "body": "I mean, come on, Richard. As far as Pied Piper is concerned, he's as pointless as Mass Effect 3's multiple endings. I mean, he's a completely useless appendage and we all know it.", - "sourceId": "gbdylsvfqctimaz-2", - "sourceParentId": "gbdylsvfqctimaz", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.007238220132421702, - "neutral": 0.6671329028904438, - "negative": 99.289870262146, - "positive": 0.03576003364287317, - "sentiment": 0 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-14T13:45:46", - "type": "mention", - "body": "I entice the flesh, I don't pay for it.", - "sourceId": "hgpfjvqseycsvnx", - "platform": "twitter", - "sentiment": { - "label": "negative", - "mixed": 2.1298764273524284, - "neutral": 7.024888694286346, - "negative": 86.8292510509491, - "positive": 4.0159814059734344, - "sentiment": 9 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T19:32:17", - "channel": "dev", - "type": "message", - "body": "Who was this woman that you shook hands with for the first time?", - "sourceId": "qnuixifrerttlaq", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 2.7747943997383118, - "neutral": 73.57667684555054, - "negative": 21.35956734418869, - "positive": 2.2889653220772743, - "sentiment": 40 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T19:36:40", - "channel": "dev", - "type": "message", - "body": "The postman lady.", - "sourceId": "qnuixifrerttlaq-1", - "sourceParentId": "qnuixifrerttlaq", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.039560915320180357, - "neutral": 92.37585663795471, - "negative": 7.189083099365234, - "positive": 0.39549898356199265, - "sentiment": 47 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T19:43:12", - "channel": "dev", - "type": "message", - "body": "What? A woman that was a man?", - "sourceId": "qnuixifrerttlaq-2", - "sourceParentId": "qnuixifrerttlaq", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 8.144943416118622, - "neutral": 82.24809169769287, - "negative": 8.245871216058731, - "positive": 1.3610893860459328, - "sentiment": 47 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-23T19:46:19", - "channel": "dev", - "type": "message", - "body": "Not a post-man lady. A lady who was a post...", - "sourceId": "qnuixifrerttlaq-3", - "sourceParentId": "qnuixifrerttlaq", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.4947598557919264, - "neutral": 75.05854964256287, - "negative": 24.241669476032257, - "positive": 0.2050151815637946, - "sentiment": 38 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T19:49:10", - "channel": "dev", - "type": "message", - "body": "Let me ask you another question. Who was the second woman you shook hands with?", - "sourceId": "qnuixifrerttlaq-4", - "sourceParentId": "qnuixifrerttlaq", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.8361542597413063, - "neutral": 84.32493805885315, - "negative": 13.36296945810318, - "positive": 1.4759366400539875, - "sentiment": 44 - } - } - ], - [ - { - "member": "Peter Gregory", - "timestamp": "2022-09-25T11:53:54", - "channel": "pitching", - "type": "message", - "body": "Did you just take a sip from an empty cup?", - "sourceId": "sdknkuclidkvkez", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 4.302819073200226, - "neutral": 86.41289472579956, - "negative": 7.099767029285431, - "positive": 2.1845120936632156, - "sentiment": 48 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T11:56:40", - "channel": "pitching", - "type": "message", - "body": "Yes.", - "sourceId": "sdknkuclidkvkez-1", - "sourceParentId": "sdknkuclidkvkez", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 20.158416032791138, - "neutral": 45.69222927093506, - "negative": 3.128799796104431, - "positive": 31.02055788040161, - "sentiment": 64 - } - }, - { - "member": "Peter Gregory", - "timestamp": "2022-09-26T12:01:03", - "channel": "pitching", - "type": "message", - "body": "Why did you do that?", - "sourceId": "sdknkuclidkvkez-2", - "sourceParentId": "sdknkuclidkvkez", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 1.0961408726871014, - "neutral": 65.2647614479065, - "negative": 32.96898603439331, - "positive": 0.6701047066599131, - "sentiment": 34 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-29T12:08:10", - "channel": "pitching", - "type": "message", - "body": "Just something to do.", - "sourceId": "sdknkuclidkvkez-3", - "sourceParentId": "sdknkuclidkvkez", - "platform": "discord", - "sentiment": { - "label": "positive", - "mixed": 0.20709747914224863, - "neutral": 37.0280385017395, - "negative": 0.7790698669850826, - "positive": 61.985790729522705, - "sentiment": 81 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-22T08:15:56", - "channel": "random", - "type": "message", - "body": "(bows to Erlich) Um Good morning. Whoops, that was weird. I don't know why I did that. You kind of have a like a king-ish feeling to you. You're like a Norse hero from Valhalla.", - "sourceId": "mvhhmccrqhwfrbd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 12.325061857700348, - "neutral": 36.391714215278625, - "negative": 31.068995594978333, - "positive": 20.214231312274933, - "sentiment": 45 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-22T08:19:58", - "channel": "random", - "type": "message", - "body": "Don't pander to me. Peter Gregory said specifically to trim the fat.", - "sourceId": "mvhhmccrqhwfrbd-1", - "sourceParentId": "mvhhmccrqhwfrbd", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.3113990183919668, - "neutral": 52.09489464759827, - "negative": 39.67009782791138, - "positive": 7.923611253499985, - "sentiment": 34 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-22T08:25:46", - "channel": "random", - "type": "message", - "body": "They actually tried to diagnose me with a wasting disease because of my slender frame.", - "sourceId": "mvhhmccrqhwfrbd-2", - "sourceParentId": "mvhhmccrqhwfrbd", - "platform": "discord", - "sentiment": { - "label": "mixed", - "mixed": 66.06851816177368, - "neutral": 18.417197465896606, - "negative": 12.283646315336227, - "positive": 3.2306432723999023, - "sentiment": 45 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-20T17:26:26", - "type": "mention", - "body": "I hate Richard Hendricks, that little @piedpiper prick.", - "sourceId": "ymxtgxcugsfotnx", - "platform": "twitter", - "sentiment": { - "label": "negative", - "mixed": 0.04867729730904102, - "neutral": 1.7945107072591782, - "negative": 98.09682965278625, - "positive": 0.05997670814394951, - "sentiment": 1 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T14:18:40", - "title": "What does Gilfoyle do?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "What do I do? System architecture. Networking and security. No one in this house can touch me on that.", - "sourceId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 2.9214391484856606, - "neutral": 45.42120099067688, - "negative": 50.13360381126404, - "positive": 1.5237568877637386, - "sentiment": 26 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-23T14:26:23", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Ok, that's good to know.", - "sourceId": "echytnrflxopmvb-1", - "sourceParentId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.10945755057036877, - "neutral": 29.728522896766663, - "negative": 1.2338214553892612, - "positive": 68.92820000648499, - "sentiment": 84 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T14:31:47", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "But does anyone appreciate that? While you were busy minoring in gender studies and singing a capella at Sarah Lawrence, I was gaining root access to NSA servers. I was one click away from starting a second Iranian revolution.", - "sourceId": "echytnrflxopmvb-2", - "sourceParentId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.38949414156377316, - "neutral": 57.88466930389404, - "negative": 40.60365855693817, - "positive": 1.1221828870475292, - "sentiment": 30 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-23T14:34:07", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I actually went to Vassar.", - "sourceId": "echytnrflxopmvb-3", - "sourceParentId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.020742737979162484, - "neutral": 95.1520323753357, - "negative": 0.6306125782430172, - "positive": 4.196608811616898, - "sentiment": 52 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-23T14:37:18", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I prevent cross-site scripting, I monitor for DDoS attacks, emergency database rollbacks, and faulty transaction handlings. The Internet heard of it? Transfers half a petabyte of data every minute. Do you have any idea how that happens? All those ones and zeroes streaming directly to your little smart phone day after day? Everyone who gets upset if he can't get the new dubstep Skrillex remix in under 12 seconds? It's not magic, it's talent and sweat. People like me, ensuring your packets get delivered, un-sniffed. So what do I do? I make sure that one bad config on one key component doesn't bankrupt the entire company. That's what I do.", - "sourceId": "echytnrflxopmvb-4", - "sourceParentId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.10410805698484182, - "neutral": 15.250200033187866, - "negative": 83.61561894416809, - "positive": 1.0300827212631702, - "sentiment": 9 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-23T14:40:20", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "That's basically what I told him.", - "sourceId": "echytnrflxopmvb-5", - "sourceParentId": "echytnrflxopmvb", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.15444154851138592, - "neutral": 86.78432703018188, - "negative": 3.4036364406347275, - "positive": 9.657593816518784, - "sentiment": 53 - } - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-29T07:15:52", - "channel": "dev", - "type": "message", - "body": "Peter Gregory demanded a lean, ruthless business plan. And I don't think that the CEO of Microsoft has a paid best friend.", - "sourceId": "pkshcbfrmhomgdh", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.017050979658961296, - "neutral": 31.10581934452057, - "negative": 66.55428409576416, - "positive": 2.322847582399845, - "sentiment": 18 - } - }, - { - "member": "Big Head", - "timestamp": "2022-09-29T07:19:19", - "channel": "dev", - "type": "message", - "body": "Sergey Brin does. Larry doesn't do anything.", - "sourceId": "pkshcbfrmhomgdh-1", - "sourceParentId": "pkshcbfrmhomgdh", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 4.235411062836647, - "neutral": 28.687477111816406, - "negative": 59.164053201675415, - "positive": 7.913065701723099, - "sentiment": 24 - } - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-13T10:22:15", - "channel": "dev", - "type": "message", - "body": "Goolybib, man. Those guys build a mediocre piece of software that might be worth something someday, and now they live here. Money flying all over Silicon Valley but none of it ever seems to hit us.", - "sourceId": "rqiffabhhfaxodu", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.08833999745547771, - "neutral": 1.001678965985775, - "negative": 98.58118295669556, - "positive": 0.3288014093413949, - "sentiment": 1 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-19T22:25:23", - "title": "All truth about programmers", - "type": "comment", - "body": "It's weird. They always travel in groups of five. These programmers, there's always a tall, skinny white guy; short, skinny Asian guy; fat guy with a ponytail; some guy with crazy facial hair; and then an East Indian guy. It's like they trade guys until they all have the right group.", - "sourceId": "snanikmjfiqrbvp", - "platform": "linkedin", - "sentiment": { - "label": "negative", - "mixed": 0.5294091533869505, - "neutral": 39.43028450012207, - "negative": 57.69113302230835, - "positive": 2.3491771891713142, - "sentiment": 22 - } - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T08:26:47", - "title": "Try liquid shrimp?", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "What are you eating?", - "sourceId": "jcmyiplxgwlrqkj", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 1.0045831091701984, - "neutral": 36.18376851081848, - "negative": 62.58952021598816, - "positive": 0.22212956100702286, - "sentiment": 19 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T08:27:59", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Liquid shrimp. It's 200 dollars a quart. Wylie Dufresne made it.", - "sourceId": "jcmyiplxgwlrqkj-1", - "sourceParentId": "jcmyiplxgwlrqkj", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.06266566924750805, - "neutral": 73.33332896232605, - "negative": 10.452669858932495, - "positive": 16.151341795921326, - "sentiment": 53 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-10T08:31:36", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "How does it taste?", - "sourceId": "jcmyiplxgwlrqkj-2", - "sourceParentId": "jcmyiplxgwlrqkj", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.6863385438919067, - "neutral": 52.47809290885925, - "negative": 46.238043904304504, - "positive": 0.5975345615297556, - "sentiment": 27 - } - }, - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-09-10T08:34:56", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Like how I would imagine dirt tastes.", - "sourceId": "jcmyiplxgwlrqkj-3", - "sourceParentId": "jcmyiplxgwlrqkj", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.09111539111472666, - "neutral": 8.885259181261063, - "negative": 54.79950308799744, - "positive": 36.22412383556366, - "sentiment": 41 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-10T21:37:37", - "type": "mention", - "body": "There's 40 billion dollars of net worth, walking around this party. And you guys @piedpiper are standing around drinking shrimp and talking about what it tastes like.", - "sourceId": "ucesdocczudhwrv", - "platform": "twitter", - "sentiment": { - "label": "negative", - "mixed": 0.8430860005319118, - "neutral": 28.505408763885498, - "negative": 64.87599611282349, - "positive": 5.775516852736473, - "sentiment": 20 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-13T03:14:35", - "title": "Girls and boys", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "It's amazing how the men and women at these things always separate like this.", - "sourceId": "rdczyhdbwwhjlxg", - "platform": "github", - "sentiment": { - "label": "positive", - "mixed": 0.10650709737092257, - "neutral": 3.118354454636574, - "negative": 0.6020567379891872, - "positive": 96.17307782173157, - "sentiment": 98 - } - }, - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-13T03:21:38", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, every party in Silicon Valley ends up like a hasidic wedding.", - "sourceId": "rdczyhdbwwhjlxg-1", - "sourceParentId": "rdczyhdbwwhjlxg", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.19098161719739437, - "neutral": 63.94217014312744, - "negative": 34.04296040534973, - "positive": 1.823883317410946, - "sentiment": 34 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-26T14:27:20", - "title": "This is how music industry works?", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "Everybody involved in the music industry is either stealing it or sharing it. They're all a bunch of thiefs, especially Radiohead.", - "sourceId": "xiudtahxgxfkuzl", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.16935247695073485, - "neutral": 28.640061616897583, - "negative": 70.49365639686584, - "positive": 0.6969330832362175, - "sentiment": 15 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-26T14:30:57", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "No.", - "sourceId": "xiudtahxgxfkuzl-1", - "sourceParentId": "xiudtahxgxfkuzl", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 4.344846680760384, - "neutral": 36.8266224861145, - "negative": 58.3268940448761, - "positive": 0.5016406066715717, - "sentiment": 21 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-26T14:35:06", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "Yeah, they're bad.", - "sourceId": "xiudtahxgxfkuzl-2", - "sourceParentId": "xiudtahxgxfkuzl", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 0.643617520108819, - "neutral": 10.364360362291336, - "negative": 88.73345851898193, - "positive": 0.2585690235719085, - "sentiment": 6 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-29T22:30:48", - "channel": "random", - "type": "message", - "body": "Richard, if you want to live here, you've got to deliver. I can't have dead weight at my incubator, ok? Either that, or show some promise for God's sake. Like NipAlert, Big Head's app. Now, that's something people want.", - "sourceId": "dbflbshhjfitwri", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.504460372030735, - "neutral": 25.814920663833618, - "negative": 59.47597026824951, - "positive": 14.20464962720871, - "sentiment": 27 - } - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-11T16:42:53", - "type": "mention", - "body": "Oh God, the marketing team @hooli is having another bike meeting.", - "sourceId": "nkochzbrzqmxpow", - "platform": "twitter", - "sentiment": { - "label": "neutral", - "mixed": 0.013937741459812969, - "neutral": 84.09829139709473, - "negative": 11.232767254114151, - "positive": 4.655007645487785, - "sentiment": 47 - } - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-15T07:53:04", - "title": "What is Hooli?", - "channel": "pied-piper", - "type": "comment", - "body": "What is Hooli? Excellent question. Hooli isn't just another high tech company. Hooli isn't just about software. Hooli...Hooli is about people. Hooli is about innovative technology that makes a difference, transforming the world as we know it. Making the world a better place, through minimal message oriented transport layers. I firmly believe we can only achieve greatness if first we achieve goodness.", - "sourceId": "llmcmvdwacjuutw", - "platform": "devto", - "sentiment": { - "label": "positive", - "mixed": 0.02383048995397985, - "neutral": 8.148453384637833, - "negative": 0.40868078358471394, - "positive": 91.41902327537537, - "sentiment": 96 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-14T12:41:41", - "channel": "random", - "type": "message", - "body": "Look, guys, for thousands of years, guys like us gave gotten kicked. But now, for the first time, we're living in an era, where we can be in charge and build empires. We could be the Vikings of our day.", - "sourceId": "pfzakjgqgnntydx", - "platform": "discord", - "sentiment": { - "label": "mixed", - "mixed": 60.32938361167908, - "neutral": 23.515993356704712, - "negative": 3.6252230405807495, - "positive": 12.529394030570984, - "sentiment": 54 - } - } - ], - [ - { - "member": "Peter Gregory", - "timestamp": "2022-09-24T02:08:46", - "title": "Peter's TED talk", - "channel": "pied-piper", - "type": "comment", - "body": "Gates, Ellison, Jobs, Dell. All dropped out of college. Silicon Valley is the cradle of innovation because of drop outs. College has become a cruel expensive joke on the poor and the middle class that benefits only the perpetrators of it. The bloated administrators.", - "sourceId": "xcnrfyiazrucmgr", - "platform": "devto", - "sentiment": { - "label": "negative", - "mixed": 0.0069552908826153725, - "neutral": 15.426932275295258, - "negative": 84.29446816444397, - "positive": 0.27164276689291, - "sentiment": 8 - } - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-27T02:12:36", - "title": "GPS tracking features", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-opened", - "body": "Hi, Monica. I work with Peter Gregory. We met outside the TED...", - "sourceId": "jnpgodleytqnzyf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.004974992407369427, - "neutral": 94.81290578842163, - "negative": 0.04498993221204728, - "positive": 5.137130990624428, - "sentiment": 53 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-17T02:14:05", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Yeah, I remember you. What how'd you know I was here?", - "sourceId": "jnpgodleytqnzyf-1", - "sourceParentId": "jnpgodleytqnzyf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.21758638322353363, - "neutral": 95.85450291633606, - "negative": 1.6086935997009277, - "positive": 2.3192111402750015, - "sentiment": 50 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-27T02:18:53", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "Peter Gregory is invested in a company that uses GPS in phones to track people.", - "sourceId": "jnpgodleytqnzyf-2", - "sourceParentId": "jnpgodleytqnzyf", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.0256810657447204, - "neutral": 99.30817484855652, - "negative": 0.009596011659596115, - "positive": 0.6565562449395657, - "sentiment": 50 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-17T02:22:02", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "That's creepy.", - "sourceId": "jnpgodleytqnzyf-3", - "sourceParentId": "jnpgodleytqnzyf", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 2.858317457139492, - "neutral": 33.547207713127136, - "negative": 60.276055335998535, - "positive": 3.318413347005844, - "sentiment": 22 - } - }, - { - "member": "Monica Hall", - "timestamp": "2022-09-28T02:25:23", - "channel": "PiedPiper/pied-piper", - "type": "pull_request-comment", - "body": "You don't know the half of it. And neither does congress.", - "sourceId": "jnpgodleytqnzyf-4", - "sourceParentId": "jnpgodleytqnzyf", - "platform": "github", - "sentiment": { - "label": "negative", - "mixed": 6.929613649845123, - "neutral": 43.75121295452118, - "negative": 46.74724638462067, - "positive": 2.5719311088323593, - "sentiment": 28 - } - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-09-19T22:34:34", - "channel": "ideas", - "type": "message", - "body": "I have a meeting with Gavin Belson. He wants to talk about Pied Piper.", - "sourceId": "fpcbqojvglgzvur", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.0017612645024200901, - "neutral": 99.20327663421631, - "negative": 0.09633462759666145, - "positive": 0.6986338179558516, - "sentiment": 50 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-19T22:36:07", - "channel": "ideas", - "type": "message", - "body": "I own 10% of Pied Piper.", - "sourceId": "fpcbqojvglgzvur-1", - "sourceParentId": "fpcbqojvglgzvur", - "platform": "discord", - "sentiment": { - "label": "neutral", - "mixed": 0.004330828232923523, - "neutral": 99.15067553520203, - "negative": 0.17975119408220053, - "positive": 0.6652520038187504, - "sentiment": 50 - } - }, - { - "member": "Richard Hendricks", - "timestamp": "2022-09-19T22:44:05", - "channel": "ideas", - "type": "message", - "body": "You said it was a bad idea.", - "sourceId": "fpcbqojvglgzvur-2", - "sourceParentId": "fpcbqojvglgzvur", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.007983980322023854, - "neutral": 0.4502667114138603, - "negative": 99.4903564453125, - "positive": 0.051387998973950744, - "sentiment": 0 - } - }, - { - "member": "Erlich Bachman", - "timestamp": "2022-09-19T22:47:43", - "channel": "ideas", - "type": "message", - "body": "It was a bad idea. I'm not sure what it is now.", - "sourceId": "fpcbqojvglgzvur-3", - "sourceParentId": "fpcbqojvglgzvur", - "platform": "discord", - "sentiment": { - "label": "negative", - "mixed": 0.024990199017338455, - "neutral": 0.6762337870895863, - "negative": 99.257892370224, - "positive": 0.04087881825398654, - "sentiment": 0 - } - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-20T22:16:21", - "title": "Erlich's Intro", - "channel": "PiedPiper/pied-piper", - "type": "issues-opened", - "body": "I am the founder of Aviato. And I own a very small percentage of Grindr. It's a men to men dating site where you can find other men within 10 miles of you interested in having intercourse in a public restroom.", - "sourceId": "fkxbijbivwezyxv", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.005490232433658093, - "neutral": 89.753258228302, - "negative": 1.9538428634405136, - "positive": 8.287403732538223, - "sentiment": 53 - } - }, - { - "member": "Jared Dunn", - "timestamp": "2022-09-20T22:19:18", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "In these communities there's sometimes anonymous...", - "sourceId": "fkxbijbivwezyxv-1", - "sourceParentId": "fkxbijbivwezyxv", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 0.01754280528984964, - "neutral": 99.30723309516907, - "negative": 0.5297592841088772, - "positive": 0.1454587560147047, - "sentiment": 50 - } - }, - { - "member": "Gavin Belson", - "timestamp": "2022-09-20T22:24:19", - "channel": "PiedPiper/pied-piper", - "type": "issue-comment", - "body": "I know what Grindr is. I have friends.", - "sourceId": "fkxbijbivwezyxv-2", - "sourceParentId": "fkxbijbivwezyxv", - "platform": "github", - "sentiment": { - "label": "neutral", - "mixed": 1.1837263591587543, - "neutral": 77.24307775497437, - "negative": 5.440209060907364, - "positive": 16.132986545562744, - "sentiment": 55 - } - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-08-11T14:15:03", - "type": "star", - "sourceId": "ifsjqijctwcblkq", - "platform": "github" - } - ], - [ - { - "member": "Bertram Gilfoyle", - "timestamp": "2022-08-08T22:16:14", - "type": "follow", - "sourceId": "gqvcnhwpiljcpem", - "platform": "twitter" - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-08-02T02:33:44", - "type": "star", - "sourceId": "waauzpcaqthymgd", - "platform": "github" - } - ], - [ - { - "member": "Richard Hendricks", - "timestamp": "2022-08-10T14:41:01", - "type": "follow", - "sourceId": "nckdavdbwiyrsyy", - "platform": "twitter" - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-08-08T04:23:03", - "type": "star", - "sourceId": "pyunscvcavxejos", - "platform": "github" - } - ], - [ - { - "member": "Erlich Bachman", - "timestamp": "2022-09-03T15:23:19", - "type": "follow", - "sourceId": "wcvhgckawxbpxmm", - "platform": "twitter" - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-09-10T14:33:38", - "type": "star", - "sourceId": "rmmjuembpdrhvra", - "platform": "github" - } - ], - [ - { - "member": "Big Head", - "timestamp": "2022-08-05T11:25:42", - "type": "follow", - "sourceId": "qbmxfymcrafyodl", - "platform": "twitter" - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-08T05:34:35", - "type": "star", - "sourceId": "bsntydymakdvtty", - "platform": "github" - } - ], - [ - { - "member": "Dinesh Chugtai", - "timestamp": "2022-09-08T10:25:58", - "type": "follow", - "sourceId": "ntddgmiqhwvxmkg", - "platform": "twitter" - } - ], - [ - { - "member": "Peter Gregory", - "timestamp": "2022-09-23T12:43:50", - "type": "star", - "sourceId": "yjohjszuknzrubg", - "platform": "github" - } - ], - [ - { - "member": "Peter Gregory", - "timestamp": "2022-09-22T09:40:07", - "type": "follow", - "sourceId": "xhqvyrxpkomledo", - "platform": "twitter" - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-27T21:05:37", - "type": "star", - "sourceId": "dleudwbgscschid", - "platform": "github" - } - ], - [ - { - "member": "Monica Hall", - "timestamp": "2022-09-27T21:12:08", - "type": "follow", - "sourceId": "xhszjwjeqcwxqco", - "platform": "twitter" - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-12T12:11:42", - "type": "star", - "sourceId": "isobblmiltviqdg", - "platform": "github" - } - ], - [ - { - "member": "Jared Dunn", - "timestamp": "2022-09-03T22:02:25", - "type": "follow", - "sourceId": "hctnnzacgfmsogd", - "platform": "twitter" - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-03T15:12:57", - "type": "star", - "sourceId": "hkvjhfhxbkbsvtu", - "platform": "github" - } - ], - [ - { - "member": "Gavin Belson", - "timestamp": "2022-09-14T08:57:04", - "type": "follow", - "sourceId": "gyufisjkamfjtsq", - "platform": "twitter" - } - ], - [ - { - "member": "Jian-Yang", - "timestamp": "2022-08-10T00:13:12", - "type": "star", - "sourceId": "levocnsqhmolnkg", - "platform": "github" - } - ], - [ - { - "member": "Jian-Yang", - "timestamp": "2022-08-09T12:55:53", - "type": "follow", - "sourceId": "naymkamhdxrygos", - "platform": "twitter" - } - ], - [ - { - "member": "Laurie Bream", - "timestamp": "2022-09-26T19:17:15", - "type": "star", - "sourceId": "vtmcpgaalmaghbr", - "platform": "github" - } - ], - [ - { - "member": "Laurie Bream", - "timestamp": "2022-09-27T09:17:43", - "type": "follow", - "sourceId": "pppsebevgltczzz", - "platform": "twitter" - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-09-08T01:05:02", - "type": "star", - "sourceId": "cssnvjtqaqhzmhn", - "platform": "github" - } - ], - [ - { - "member": "Russ Hanneman", - "timestamp": "2022-08-14T04:33:19", - "type": "follow", - "sourceId": "iigssbuolzqgytb", - "platform": "twitter" - } - ], - [ - { - "member": "Jack Barker", - "timestamp": "2022-09-13T04:45:58", - "type": "star", - "sourceId": "vstbgtzhpqbsrfj", - "platform": "github" - } - ], - [ - { - "member": "Jack Barker", - "timestamp": "2022-09-09T12:30:12", - "type": "follow", - "sourceId": "uoxoyphekweisdz", - "platform": "twitter" - } - ] - ] -} diff --git a/backend/src/database/initializers/suggested-tasks.json b/backend/src/database/initializers/suggested-tasks.json deleted file mode 100644 index d30ae0ccbd..0000000000 --- a/backend/src/database/initializers/suggested-tasks.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "name": "Engage with relevant content", - "body": "Engage with at least 5 posts on Eagle Eye today" - }, - { - "name": "Reach out to influential contacts", - "body": "Connect with new contacts with over 10k followers" - }, - { - "name": "Reach out to poorly engaged contacts", - "body": "Connect with contacts with low activity in the last 30 days" - }, - { - "name": "Check for negative reactions", - "body": "React to activities with very negative sentiment" - }, - { - "name": "Set up your workspace integrations", - "body": "Connect with at least 2 data sources that are relevant to your community" - }, - { - "name": "Set up your team", - "body": "Invite colleagues to your community workspace" - } -] diff --git a/backend/src/database/initializers/widgets.json b/backend/src/database/initializers/widgets.json deleted file mode 100644 index 740bd655e2..0000000000 --- a/backend/src/database/initializers/widgets.json +++ /dev/null @@ -1,9186 +0,0 @@ -[ - { - "type": "number-activities", - "cache": [[], []], - "settings": null - }, - { - "type": "benchmark" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-13T11:49:20.149Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-02-14T15:00:09.233Z", - "start": "2022-02-07T00:00:00.000Z", - "end": "2022-02-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph", - "cache": { - "x": [ - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-23T00:00:00", - "2021-07-23T00:00:00", - "2021-07-23T00:00:00", - "2021-07-23T00:00:00", - "2021-07-24T00:00:00", - "2021-07-25T00:00:00", - "2021-07-25T00:00:00", - "2021-07-25T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-07-30T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-02T00:00:00", - "2021-08-02T00:00:00", - "2021-08-02T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-07T00:00:00", - "2021-08-07T00:00:00", - "2021-08-08T00:00:00", - "2021-08-08T00:00:00", - "2021-08-09T00:00:00", - "2021-08-09T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-10T00:00:00", - "2021-08-10T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-12T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-13T00:00:00", - "2021-08-13T00:00:00", - "2021-08-13T00:00:00", - "2021-08-14T00:00:00", - "2021-08-14T00:00:00", - "2021-08-14T00:00:00", - "2021-08-15T00:00:00", - "2021-08-15T00:00:00", - "2021-08-15T00:00:00", - "2021-08-15T00:00:00", - "2021-08-16T00:00:00", - "2021-08-16T00:00:00", - "2021-08-16T00:00:00", - "2021-08-18T00:00:00", - "2021-08-18T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-19T00:00:00", - "2021-08-19T00:00:00", - "2021-08-19T00:00:00", - "2021-08-21T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-23T00:00:00", - "2021-08-23T00:00:00", - "2021-08-23T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-28T00:00:00", - "2021-08-28T00:00:00", - "2021-08-28T00:00:00", - "2021-08-28T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-30T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-05T00:00:00", - "2021-09-05T00:00:00", - "2021-09-05T00:00:00", - "2021-09-05T00:00:00", - "2021-09-06T00:00:00", - "2021-09-06T00:00:00", - "2021-09-06T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-09T00:00:00", - "2021-09-09T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-18T00:00:00", - "2021-09-18T00:00:00", - "2021-09-18T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-24T00:00:00", - "2021-09-24T00:00:00", - "2021-09-25T00:00:00", - "2021-09-25T00:00:00", - "2021-09-27T00:00:00", - "2021-09-27T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-28T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-02T00:00:00", - "2021-10-02T00:00:00", - "2021-10-02T00:00:00", - "2021-10-03T00:00:00", - "2021-10-03T00:00:00", - "2021-10-03T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-06T00:00:00", - "2021-10-06T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-07T00:00:00", - "2021-10-07T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-08T00:00:00", - "2021-10-08T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-10T00:00:00", - "2021-10-10T00:00:00", - "2021-10-11T00:00:00", - "2021-10-11T00:00:00", - "2021-10-11T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-14T00:00:00", - "2021-10-14T00:00:00", - "2021-10-14T00:00:00" - ], - "y": [ - 1, 2, 2, 2, 2, 3, 3, 4, 5, 6, 6, 5, 5, 5, 4, 4, 5, 4, 3, 3, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, - 7, 7, 7, 7, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ] - }, - "settings": null - }, - { - "type": "channel-distribution", - "cache": { - "x": ["discord", "twitter", "github", "apis"], - "y": [14, 12, 2, 13] - }, - "settings": null - }, - { - "type": "integrations" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-members" - }, - { - "type": "benchmark" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "inactive-members-graph" - }, - { - "type": "latest-activities" - }, - { - "type": "builder" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "newest-members" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "newest-members" - }, - { - "type": "benchmark" - }, - { - "type": "integrations" - }, - { - "type": "channel-distribution" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "time-to-first-interaction-graph", - "cache": { - "x": [ - "2021-07-23T00:00:00", - "2021-07-23T00:00:00", - "2021-07-24T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-07-31T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-01T00:00:00", - "2021-08-02T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-06T00:00:00", - "2021-08-07T00:00:00", - "2021-08-08T00:00:00", - "2021-08-08T00:00:00", - "2021-08-09T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-13T00:00:00", - "2021-08-13T00:00:00", - "2021-08-14T00:00:00", - "2021-08-14T00:00:00", - "2021-08-15T00:00:00", - "2021-08-15T00:00:00", - "2021-08-15T00:00:00", - "2021-08-16T00:00:00", - "2021-08-16T00:00:00", - "2021-08-16T00:00:00", - "2021-08-18T00:00:00", - "2021-08-18T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-19T00:00:00", - "2021-08-19T00:00:00", - "2021-08-21T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-22T00:00:00", - "2021-08-23T00:00:00", - "2021-08-23T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-28T00:00:00", - "2021-08-28T00:00:00", - "2021-08-28T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-29T00:00:00", - "2021-08-30T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-03T00:00:00", - "2021-09-05T00:00:00", - "2021-09-05T00:00:00", - "2021-09-05T00:00:00", - "2021-09-06T00:00:00", - "2021-09-06T00:00:00", - "2021-09-06T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-10T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-11T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-12T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-17T00:00:00", - "2021-09-18T00:00:00", - "2021-09-18T00:00:00", - "2021-09-18T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-19T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-24T00:00:00", - "2021-09-24T00:00:00", - "2021-09-25T00:00:00", - "2021-09-27T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-01T00:00:00", - "2021-10-02T00:00:00", - "2021-10-02T00:00:00", - "2021-10-02T00:00:00", - "2021-10-03T00:00:00", - "2021-10-03T00:00:00", - "2021-10-03T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-06T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-07T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-08T00:00:00", - "2021-10-08T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-09T00:00:00", - "2021-10-10T00:00:00", - "2021-10-10T00:00:00", - "2021-10-11T00:00:00", - "2021-10-11T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00" - ], - "y": [ - 0, 0, 0, 0, 0.5, 0.428571428571429, 0.375, 0.777777777777778, 0.7, 0.818181818181818, - 1.08333333333333, 1, 1.14285714285714, 1.26666666666667, 1.5, 1.41176470588235, - 1.72222222222222, 2, 1.9, 2.19047619047619, 2.5, 2.39130434782609, 2.58333333333333, 2.48, - 2.73076923076923, 2.7037037037037, 2.92857142857143, 2.82758620689655, 2.73333333333333, - 3.03225806451613, 3.09375, 3.36363636363636, 3.26470588235294, 3.42857142857143, - 3.33333333333333, 3.24324324324324, 3.15789473684211, 3.41025641025641, 3.6, - 3.8780487804878, 4.07142857142857, 3.97674418604651, 4.20454545454545, 4.33333333333333, - 4.58695652173913, 4.72340425531915, 5.02083333333333, 4.91836734693878, 5.2, - 5.15686274509804, 5.09615384615385, 5.05660377358491, 5.33333333333333, 5.23636363636364, - 5.5, 5.40350877192982, 5.58620689655172, 5.76271186440678, 6.06666666666667, - 6.34426229508197, 6.62903225806452, 6.92063492063492, 6.8125, 7.06153846153846, - 7.04545454545455, 7.17910447761194, 7.44117647058824, 7.59420289855072, 7.81428571428571, - 8.14084507042254, 8.43055555555556, 8.73972602739726, 8.62162162162162, 8.50666666666667, - 8.57894736842105, 8.88311688311688, 9.15384615384615, 9.10126582278481, 9.1375, - 9.40740740740741, 9.60975609756097, 9.49397590361446, 9.38095238095238, 9.45882352941176, - 9.67441860465116, 9.6551724137931, 9.76136363636363, 10.0674157303371, 10.3555555555556, - 10.6483516483516, 10.945652173913, 11.2150537634409, 11.4574468085106, 11.5578947368421, - 11.8333333333333, 12.1134020618557, 12.3775510204082, 12.4747474747475, 12.35, - 12.5940594059406, 12.6862745098039, 12.9320388349515, 13, 12.8761904761905, - 13.1603773584906, 13.0373831775701, 12.9166666666667, 13.1284403669725, 13.0090909090909, - 13.2252252252252, 13.3392857142857, 13.5575221238938, 13.4385964912281, 13.3217391304348, - 13.4137931034483, 13.2991452991453, 13.4830508474576, 13.5210084033613, 13.7916666666667, - 14.0661157024793, 14.1639344262295, 14.0487804878049, 13.9354838709677, 14.16, - 14.4126984126984, 14.2992125984252, 14.515625, 14.7751937984496, 14.6615384615385, - 14.8015267175573, 14.8636363636364, 15.1353383458647, 15.3955223880597, 15.2814814814815, - 15.4191176470588, 15.5182481751825, 15.695652173913, 15.8992805755396, 16.0714285714286, - 16.3049645390071, 16.1901408450704, 16.3916083916084, 16.2777777777778, 16.5310344827586, - 16.7739726027397, 17, 17.1216216216216, 17.255033557047, 17.4533333333333, 17.5562913907285, - 17.7828947368421, 18.0196078431373, 17.9025974025974, 18.0967741935484, 18.3141025641026, - 18.5350318471338, 18.6962025316456, 18.8867924528302, 19.1125, 18.9937888198758, - 19.2283950617284, 19.1104294478528, 18.9939024390244, 19.1151515151515, 19.3012048192771, - 19.5149700598802, 19.7261904761905, 19.9408284023669, 20.1705882352941, 20.4035087719298, - 20.5058139534884, 20.7341040462428, 20.6149425287356, 20.7485714285714, 20.6306818181818, - 20.7570621468927, 20.6404494382022, 20.8715083798883, 20.9833333333333, 20.8674033149171, - 21.0824175824176, 20.9672131147541, 21.1902173913044, 21.4, 21.5860215053763, - 21.668449197861, 21.5531914893617, 21.6931216931217, 21.5789473684211, 21.7225130890052, - 21.9270833333333, 22.1295336787565, 22.3659793814433, 22.5692307692308, 22.75, - 22.9492385786802, 23.0757575757576, 23.2562814070352, 23.14, 23.3582089552239, - 23.5346534653465, 23.6305418719212, 23.7254901960784, 23.609756097561, 23.7378640776699, - 23.6231884057971, 23.8557692307692, 24.0813397129187, 24.3190476190476, 24.2037914691943, - 24.4433962264151, 24.6244131455399, 24.7616822429907, 24.9627906976744, 24.8472222222222, - 25.0506912442396, 25.2844036697248, 25.5068493150685, 25.3909090909091, 25.2760180995475, - 25.3828828828829, 25.6143497757848, 25.5, 25.3866666666667, 25.2743362831858, - 25.4757709251101, 25.6798245614035, 25.5676855895197, 25.7739130434783, 25.9177489177489, - 26.0775862068966, 26.2832618025751, 26.465811965812, 26.6893617021277, 26.8305084745763, - 27.0506329113924, 27.2521008403361, 27.1380753138075, 27.3208333333333, 27.5020746887967, - 27.7314049586777 - ] - }, - "settings": null - }, - { - "type": "benchmark", - "settings": { - "repositories": [ - { - "id": 322361358, - "value": "ego", - "label": "ego", - "active": true, - "editing": false, - "githubRepo": { - "id": 322361358, - "node_id": "MDEwOlJlcG9zaXRvcnkzMjIzNjEzNTg=", - "name": "ego", - "full_name": "edgelesssys/ego", - "private": false, - "owner": { - "login": "edgelesssys", - "id": 58512657, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjU4NTEyNjU3", - "avatar_url": "https://avatars.githubusercontent.com/u/58512657?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/edgelesssys", - "html_url": "https://github.com/edgelesssys", - "followers_url": "https://api.github.com/users/edgelesssys/followers", - "following_url": "https://api.github.com/users/edgelesssys/following{/other_user}", - "gists_url": "https://api.github.com/users/edgelesssys/gists{/gist_id}", - "starred_url": "https://api.github.com/users/edgelesssys/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/edgelesssys/subscriptions", - "organizations_url": "https://api.github.com/users/edgelesssys/orgs", - "repos_url": "https://api.github.com/users/edgelesssys/repos", - "events_url": "https://api.github.com/users/edgelesssys/events{/privacy}", - "received_events_url": "https://api.github.com/users/edgelesssys/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/edgelesssys/ego", - "description": "EGo is an open-source SDK that enables you to develop your own confidential apps in the Go programming language.", - "fork": false, - "url": "https://api.github.com/repos/edgelesssys/ego", - "forks_url": "https://api.github.com/repos/edgelesssys/ego/forks", - "keys_url": "https://api.github.com/repos/edgelesssys/ego/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/edgelesssys/ego/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/edgelesssys/ego/teams", - "hooks_url": "https://api.github.com/repos/edgelesssys/ego/hooks", - "issue_events_url": "https://api.github.com/repos/edgelesssys/ego/issues/events{/number}", - "events_url": "https://api.github.com/repos/edgelesssys/ego/events", - "assignees_url": "https://api.github.com/repos/edgelesssys/ego/assignees{/user}", - "branches_url": "https://api.github.com/repos/edgelesssys/ego/branches{/branch}", - "tags_url": "https://api.github.com/repos/edgelesssys/ego/tags", - "blobs_url": "https://api.github.com/repos/edgelesssys/ego/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/edgelesssys/ego/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/edgelesssys/ego/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/edgelesssys/ego/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/edgelesssys/ego/statuses/{sha}", - "languages_url": "https://api.github.com/repos/edgelesssys/ego/languages", - "stargazers_url": "https://api.github.com/repos/edgelesssys/ego/stargazers", - "contributors_url": "https://api.github.com/repos/edgelesssys/ego/contributors", - "subscribers_url": "https://api.github.com/repos/edgelesssys/ego/subscribers", - "subscription_url": "https://api.github.com/repos/edgelesssys/ego/subscription", - "commits_url": "https://api.github.com/repos/edgelesssys/ego/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/edgelesssys/ego/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/edgelesssys/ego/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/edgelesssys/ego/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/edgelesssys/ego/contents/{+path}", - "compare_url": "https://api.github.com/repos/edgelesssys/ego/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/edgelesssys/ego/merges", - "archive_url": "https://api.github.com/repos/edgelesssys/ego/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/edgelesssys/ego/downloads", - "issues_url": "https://api.github.com/repos/edgelesssys/ego/issues{/number}", - "pulls_url": "https://api.github.com/repos/edgelesssys/ego/pulls{/number}", - "milestones_url": "https://api.github.com/repos/edgelesssys/ego/milestones{/number}", - "notifications_url": "https://api.github.com/repos/edgelesssys/ego/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/edgelesssys/ego/labels{/name}", - "releases_url": "https://api.github.com/repos/edgelesssys/ego/releases{/id}", - "deployments_url": "https://api.github.com/repos/edgelesssys/ego/deployments", - "created_at": "2020-12-17T17:09:00Z", - "updated_at": "2021-10-28T13:03:19Z", - "pushed_at": "2021-10-28T13:03:16Z", - "git_url": "git://github.com/edgelesssys/ego.git", - "ssh_url": "git@github.com:edgelesssys/ego.git", - "clone_url": "https://github.com/edgelesssys/ego.git", - "svn_url": "https://github.com/edgelesssys/ego", - "homepage": "https://ego.dev", - "size": 1636, - "stargazers_count": 187, - "watchers_count": 187, - "language": "Go", - "has_issues": true, - "has_projects": false, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 16, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 4, - "license": { - "key": "mpl-2.0", - "name": "Mozilla Public License 2.0", - "spdx_id": "MPL-2.0", - "url": "https://api.github.com/licenses/mpl-2.0", - "node_id": "MDc6TGljZW5zZTE0" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "confidential-computing", - "confidential-microservices", - "enclave", - "golang", - "intel-sgx", - "sgx" - ], - "visibility": "public", - "forks": 16, - "open_issues": 4, - "watchers": 187, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-14": { - "date": "2022-02-14", - "value": 245 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 245 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 245 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 243 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 242 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 242 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 242 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 241 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 241 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 241 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 240 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 240 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 240 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 240 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 239 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 239 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 239 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 239 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 239 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 239 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 237 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 237 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 236 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 235 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 235 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 235 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 235 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 235 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 234 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 234 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 234 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 234 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 234 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 233 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 233 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 233 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 233 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 233 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 232 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 232 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 232 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 232 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 230 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 230 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 230 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 230 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 230 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 228 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 228 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 228 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 228 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 228 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 227 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 227 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 227 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 227 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 227 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 227 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 227 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 227 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 227 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 226 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 225 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 225 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 224 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 223 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 221 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 218 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 217 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 216 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 215 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 214 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 213 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 210 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 197 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 197 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 197 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 197 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 197 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 197 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 196 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 193 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 192 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 191 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 191 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 191 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 191 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 190 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 188 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 188 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 188 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 188 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 187 - } - } - }, - { - "id": 341208515, - "value": "edgelessdb", - "label": "edgelessdb", - "active": true, - "editing": false, - "githubRepo": { - "id": 341208515, - "node_id": "MDEwOlJlcG9zaXRvcnkzNDEyMDg1MTU=", - "name": "edgelessdb", - "full_name": "edgelesssys/edgelessdb", - "private": false, - "owner": { - "login": "edgelesssys", - "id": 58512657, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjU4NTEyNjU3", - "avatar_url": "https://avatars.githubusercontent.com/u/58512657?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/edgelesssys", - "html_url": "https://github.com/edgelesssys", - "followers_url": "https://api.github.com/users/edgelesssys/followers", - "following_url": "https://api.github.com/users/edgelesssys/following{/other_user}", - "gists_url": "https://api.github.com/users/edgelesssys/gists{/gist_id}", - "starred_url": "https://api.github.com/users/edgelesssys/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/edgelesssys/subscriptions", - "organizations_url": "https://api.github.com/users/edgelesssys/orgs", - "repos_url": "https://api.github.com/users/edgelesssys/repos", - "events_url": "https://api.github.com/users/edgelesssys/events{/privacy}", - "received_events_url": "https://api.github.com/users/edgelesssys/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/edgelesssys/edgelessdb", - "description": "EdgelessDB is a MySQL-compatible database for confidential computing. It runs entirely inside a secure enclave and comes with advanced features for collaboration, recovery, and access control.", - "fork": false, - "url": "https://api.github.com/repos/edgelesssys/edgelessdb", - "forks_url": "https://api.github.com/repos/edgelesssys/edgelessdb/forks", - "keys_url": "https://api.github.com/repos/edgelesssys/edgelessdb/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/edgelesssys/edgelessdb/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/edgelesssys/edgelessdb/teams", - "hooks_url": "https://api.github.com/repos/edgelesssys/edgelessdb/hooks", - "issue_events_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues/events{/number}", - "events_url": "https://api.github.com/repos/edgelesssys/edgelessdb/events", - "assignees_url": "https://api.github.com/repos/edgelesssys/edgelessdb/assignees{/user}", - "branches_url": "https://api.github.com/repos/edgelesssys/edgelessdb/branches{/branch}", - "tags_url": "https://api.github.com/repos/edgelesssys/edgelessdb/tags", - "blobs_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/edgelesssys/edgelessdb/statuses/{sha}", - "languages_url": "https://api.github.com/repos/edgelesssys/edgelessdb/languages", - "stargazers_url": "https://api.github.com/repos/edgelesssys/edgelessdb/stargazers", - "contributors_url": "https://api.github.com/repos/edgelesssys/edgelessdb/contributors", - "subscribers_url": "https://api.github.com/repos/edgelesssys/edgelessdb/subscribers", - "subscription_url": "https://api.github.com/repos/edgelesssys/edgelessdb/subscription", - "commits_url": "https://api.github.com/repos/edgelesssys/edgelessdb/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/edgelesssys/edgelessdb/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/edgelesssys/edgelessdb/contents/{+path}", - "compare_url": "https://api.github.com/repos/edgelesssys/edgelessdb/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/edgelesssys/edgelessdb/merges", - "archive_url": "https://api.github.com/repos/edgelesssys/edgelessdb/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/edgelesssys/edgelessdb/downloads", - "issues_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues{/number}", - "pulls_url": "https://api.github.com/repos/edgelesssys/edgelessdb/pulls{/number}", - "milestones_url": "https://api.github.com/repos/edgelesssys/edgelessdb/milestones{/number}", - "notifications_url": "https://api.github.com/repos/edgelesssys/edgelessdb/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/edgelesssys/edgelessdb/labels{/name}", - "releases_url": "https://api.github.com/repos/edgelesssys/edgelessdb/releases{/id}", - "deployments_url": "https://api.github.com/repos/edgelesssys/edgelessdb/deployments", - "created_at": "2021-02-22T13:24:30Z", - "updated_at": "2021-11-05T08:34:42Z", - "pushed_at": "2021-11-05T08:34:39Z", - "git_url": "git://github.com/edgelesssys/edgelessdb.git", - "ssh_url": "git@github.com:edgelesssys/edgelessdb.git", - "clone_url": "https://github.com/edgelesssys/edgelessdb.git", - "svn_url": "https://github.com/edgelesssys/edgelessdb", - "homepage": "https://edgeless.systems/products/edgelessdb", - "size": 434, - "stargazers_count": 71, - "watchers_count": 71, - "language": "Go", - "has_issues": true, - "has_projects": false, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 6, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 2, - "license": { - "key": "gpl-2.0", - "name": "GNU General Public License v2.0", - "spdx_id": "GPL-2.0", - "url": "https://api.github.com/licenses/gpl-2.0", - "node_id": "MDc6TGljZW5zZTg=" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "confidential-computing", - "database", - "enclave", - "mariadb", - "mysql", - "sgx", - "sql" - ], - "visibility": "public", - "forks": 6, - "open_issues": 2, - "watchers": 71, - "default_branch": "main", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-14": { - "date": "2022-02-14", - "value": 93 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 93 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 93 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 93 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 93 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 93 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 93 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 92 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 92 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 92 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 92 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 91 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 91 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 91 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 91 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 91 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 91 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 91 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 91 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 91 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 90 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 90 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 90 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 89 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 89 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 88 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 88 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 88 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 88 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 88 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 88 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 88 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 88 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 88 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 88 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 88 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 88 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 88 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 88 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 87 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 87 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 86 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 86 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 86 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 86 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 85 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 84 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 84 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 84 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 84 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 84 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 84 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 83 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 83 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 83 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 83 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 83 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 83 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 83 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 83 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 83 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 83 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 80 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 80 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 80 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 80 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 80 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 79 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 79 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 78 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 77 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 77 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 77 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 77 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 77 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 77 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 77 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 77 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 77 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 77 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 76 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 76 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 76 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 75 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 75 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 75 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 75 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 74 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 74 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 74 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 72 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 72 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 72 - } - } - }, - { - "id": 281696828, - "value": "marblerun", - "label": "marblerun", - "active": true, - "editing": false, - "githubRepo": { - "id": 281696828, - "node_id": "MDEwOlJlcG9zaXRvcnkyODE2OTY4Mjg=", - "name": "marblerun", - "full_name": "edgelesssys/marblerun", - "private": false, - "owner": { - "login": "edgelesssys", - "id": 58512657, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjU4NTEyNjU3", - "avatar_url": "https://avatars.githubusercontent.com/u/58512657?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/edgelesssys", - "html_url": "https://github.com/edgelesssys", - "followers_url": "https://api.github.com/users/edgelesssys/followers", - "following_url": "https://api.github.com/users/edgelesssys/following{/other_user}", - "gists_url": "https://api.github.com/users/edgelesssys/gists{/gist_id}", - "starred_url": "https://api.github.com/users/edgelesssys/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/edgelesssys/subscriptions", - "organizations_url": "https://api.github.com/users/edgelesssys/orgs", - "repos_url": "https://api.github.com/users/edgelesssys/repos", - "events_url": "https://api.github.com/users/edgelesssys/events{/privacy}", - "received_events_url": "https://api.github.com/users/edgelesssys/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/edgelesssys/marblerun", - "description": "MarbleRun is the control plane for confidential computing. Deploy, scale, and verify your confidential microservices on vanilla Kubernetes. 100% Go, 100% cloud native, 100% confidential.", - "fork": false, - "url": "https://api.github.com/repos/edgelesssys/marblerun", - "forks_url": "https://api.github.com/repos/edgelesssys/marblerun/forks", - "keys_url": "https://api.github.com/repos/edgelesssys/marblerun/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/edgelesssys/marblerun/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/edgelesssys/marblerun/teams", - "hooks_url": "https://api.github.com/repos/edgelesssys/marblerun/hooks", - "issue_events_url": "https://api.github.com/repos/edgelesssys/marblerun/issues/events{/number}", - "events_url": "https://api.github.com/repos/edgelesssys/marblerun/events", - "assignees_url": "https://api.github.com/repos/edgelesssys/marblerun/assignees{/user}", - "branches_url": "https://api.github.com/repos/edgelesssys/marblerun/branches{/branch}", - "tags_url": "https://api.github.com/repos/edgelesssys/marblerun/tags", - "blobs_url": "https://api.github.com/repos/edgelesssys/marblerun/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/edgelesssys/marblerun/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/edgelesssys/marblerun/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/edgelesssys/marblerun/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/edgelesssys/marblerun/statuses/{sha}", - "languages_url": "https://api.github.com/repos/edgelesssys/marblerun/languages", - "stargazers_url": "https://api.github.com/repos/edgelesssys/marblerun/stargazers", - "contributors_url": "https://api.github.com/repos/edgelesssys/marblerun/contributors", - "subscribers_url": "https://api.github.com/repos/edgelesssys/marblerun/subscribers", - "subscription_url": "https://api.github.com/repos/edgelesssys/marblerun/subscription", - "commits_url": "https://api.github.com/repos/edgelesssys/marblerun/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/edgelesssys/marblerun/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/edgelesssys/marblerun/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/edgelesssys/marblerun/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/edgelesssys/marblerun/contents/{+path}", - "compare_url": "https://api.github.com/repos/edgelesssys/marblerun/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/edgelesssys/marblerun/merges", - "archive_url": "https://api.github.com/repos/edgelesssys/marblerun/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/edgelesssys/marblerun/downloads", - "issues_url": "https://api.github.com/repos/edgelesssys/marblerun/issues{/number}", - "pulls_url": "https://api.github.com/repos/edgelesssys/marblerun/pulls{/number}", - "milestones_url": "https://api.github.com/repos/edgelesssys/marblerun/milestones{/number}", - "notifications_url": "https://api.github.com/repos/edgelesssys/marblerun/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/edgelesssys/marblerun/labels{/name}", - "releases_url": "https://api.github.com/repos/edgelesssys/marblerun/releases{/id}", - "deployments_url": "https://api.github.com/repos/edgelesssys/marblerun/deployments", - "created_at": "2020-07-22T14:16:01Z", - "updated_at": "2021-11-08T09:49:31Z", - "pushed_at": "2021-11-08T10:22:46Z", - "git_url": "git://github.com/edgelesssys/marblerun.git", - "ssh_url": "git@github.com:edgelesssys/marblerun.git", - "clone_url": "https://github.com/edgelesssys/marblerun.git", - "svn_url": "https://github.com/edgelesssys/marblerun", - "homepage": "https://marblerun.sh", - "size": 5203, - "stargazers_count": 140, - "watchers_count": 140, - "language": "Go", - "has_issues": true, - "has_projects": false, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 17, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 4, - "license": { - "key": "mpl-2.0", - "name": "Mozilla Public License 2.0", - "spdx_id": "MPL-2.0", - "url": "https://api.github.com/licenses/mpl-2.0", - "node_id": "MDc6TGljZW5zZTE0" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "confidential-computing", - "confidential-microservices", - "distributed-systems", - "enclave", - "golang", - "intel-sgx", - "kubernetes", - "microservice", - "service-mesh", - "sgx" - ], - "visibility": "public", - "forks": 17, - "open_issues": 4, - "watchers": 140, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-14": { - "date": "2022-02-14", - "value": 150 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 150 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 150 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 150 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 150 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 150 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 150 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 150 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 150 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 150 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 150 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 150 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 150 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 150 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 150 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 150 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 150 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 150 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 150 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 150 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 149 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 149 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 149 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 149 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 148 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 148 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 148 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 148 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 148 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 148 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 148 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 148 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 148 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 148 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 148 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 147 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 147 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 147 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 147 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 146 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 146 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 146 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 146 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 146 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 146 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 146 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 146 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 146 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 146 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 146 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 146 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 146 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 146 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 146 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 146 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 146 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 146 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 146 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 146 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 146 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 146 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 146 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 146 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 146 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 146 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 146 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 146 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 145 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 145 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 143 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 142 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 142 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 142 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 142 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 142 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 142 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 142 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 142 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 142 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 142 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 142 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 141 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 141 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 141 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 141 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 141 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 141 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 141 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 141 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 141 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 141 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 141 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 141 - } - } - }, - { - "id": 193215554, - "value": "n8n", - "label": "n8n", - "active": true, - "editing": false, - "githubRepo": { - "id": 193215554, - "node_id": "MDEwOlJlcG9zaXRvcnkxOTMyMTU1NTQ=", - "name": "n8n", - "full_name": "n8n-io/n8n", - "private": false, - "owner": { - "login": "n8n-io", - "id": 45487711, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjQ1NDg3NzEx", - "avatar_url": "https://avatars.githubusercontent.com/u/45487711?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/n8n-io", - "html_url": "https://github.com/n8n-io", - "followers_url": "https://api.github.com/users/n8n-io/followers", - "following_url": "https://api.github.com/users/n8n-io/following{/other_user}", - "gists_url": "https://api.github.com/users/n8n-io/gists{/gist_id}", - "starred_url": "https://api.github.com/users/n8n-io/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/n8n-io/subscriptions", - "organizations_url": "https://api.github.com/users/n8n-io/orgs", - "repos_url": "https://api.github.com/users/n8n-io/repos", - "events_url": "https://api.github.com/users/n8n-io/events{/privacy}", - "received_events_url": "https://api.github.com/users/n8n-io/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/n8n-io/n8n", - "description": "Free and open fair-code licensed node based Workflow Automation Tool. Easily automate tasks across different services.", - "fork": false, - "url": "https://api.github.com/repos/n8n-io/n8n", - "forks_url": "https://api.github.com/repos/n8n-io/n8n/forks", - "keys_url": "https://api.github.com/repos/n8n-io/n8n/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/n8n-io/n8n/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/n8n-io/n8n/teams", - "hooks_url": "https://api.github.com/repos/n8n-io/n8n/hooks", - "issue_events_url": "https://api.github.com/repos/n8n-io/n8n/issues/events{/number}", - "events_url": "https://api.github.com/repos/n8n-io/n8n/events", - "assignees_url": "https://api.github.com/repos/n8n-io/n8n/assignees{/user}", - "branches_url": "https://api.github.com/repos/n8n-io/n8n/branches{/branch}", - "tags_url": "https://api.github.com/repos/n8n-io/n8n/tags", - "blobs_url": "https://api.github.com/repos/n8n-io/n8n/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/n8n-io/n8n/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/n8n-io/n8n/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/n8n-io/n8n/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/n8n-io/n8n/statuses/{sha}", - "languages_url": "https://api.github.com/repos/n8n-io/n8n/languages", - "stargazers_url": "https://api.github.com/repos/n8n-io/n8n/stargazers", - "contributors_url": "https://api.github.com/repos/n8n-io/n8n/contributors", - "subscribers_url": "https://api.github.com/repos/n8n-io/n8n/subscribers", - "subscription_url": "https://api.github.com/repos/n8n-io/n8n/subscription", - "commits_url": "https://api.github.com/repos/n8n-io/n8n/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/n8n-io/n8n/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/n8n-io/n8n/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/n8n-io/n8n/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/n8n-io/n8n/contents/{+path}", - "compare_url": "https://api.github.com/repos/n8n-io/n8n/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/n8n-io/n8n/merges", - "archive_url": "https://api.github.com/repos/n8n-io/n8n/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/n8n-io/n8n/downloads", - "issues_url": "https://api.github.com/repos/n8n-io/n8n/issues{/number}", - "pulls_url": "https://api.github.com/repos/n8n-io/n8n/pulls{/number}", - "milestones_url": "https://api.github.com/repos/n8n-io/n8n/milestones{/number}", - "notifications_url": "https://api.github.com/repos/n8n-io/n8n/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/n8n-io/n8n/labels{/name}", - "releases_url": "https://api.github.com/repos/n8n-io/n8n/releases{/id}", - "deployments_url": "https://api.github.com/repos/n8n-io/n8n/deployments", - "created_at": "2019-06-22T09:24:21Z", - "updated_at": "2022-02-10T17:03:43Z", - "pushed_at": "2022-02-10T16:08:38Z", - "git_url": "git://github.com/n8n-io/n8n.git", - "ssh_url": "git@github.com:n8n-io/n8n.git", - "clone_url": "https://github.com/n8n-io/n8n.git", - "svn_url": "https://github.com/n8n-io/n8n", - "homepage": "https://n8n.io", - "size": 29237, - "stargazers_count": 20775, - "watchers_count": 20775, - "language": "TypeScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": true, - "forks_count": 2214, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 238, - "license": { - "key": "other", - "name": "Other", - "spdx_id": "NOASSERTION", - "url": null, - "node_id": "MDc6TGljZW5zZTA=" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "apis", - "automated", - "automation", - "cli", - "data-flow", - "development", - "docker", - "iaas", - "integration-framework", - "integrations", - "ipaas", - "low-code", - "low-code-development-platform", - "low-code-plattform", - "n8n", - "node", - "self-hosted", - "typescript", - "workflow", - "workflow-automation" - ], - "visibility": "public", - "forks": 2214, - "open_issues": 238, - "watchers": 20775, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-14": { - "date": "2022-02-14", - "value": 20834 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 20817 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 20802 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 20774 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 20748 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 20719 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 20562 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 20365 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 20258 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 20086 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 20028 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 20011 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 19957 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 19937 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 19927 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 19905 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 19884 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 19860 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 19835 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 19817 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 19789 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 19755 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 19742 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 19725 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 19715 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 19697 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 19665 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 19654 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 19631 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 19620 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 19596 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 19580 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 19562 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 19541 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 19522 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 19500 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 19481 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 19466 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 19443 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 19418 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 19395 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 19364 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 19341 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 19329 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 19324 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 19307 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 19292 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 19275 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 19252 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 19236 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 19228 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 19220 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 19210 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 19196 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 19183 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 19171 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 19157 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 19150 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 19145 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 19135 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 19124 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 19106 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 19095 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 19076 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 19052 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 19042 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 19028 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 19018 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 19007 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 18994 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 18983 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 18972 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 18962 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 18943 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 18922 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 18902 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 18884 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 18865 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 18851 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 18840 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 18825 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 18813 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 18797 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 18789 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 18766 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 18738 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 18730 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 18719 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 18699 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 18673 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 18658 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 18643 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 18642 - } - } - } - ], - "last_updated_at": "2022-02-14", - "timeframe": { - "label": "Last three months", - "value": "last_three_months", - "date": "2021-11-14" - } - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "latest-activities" - }, - { - "type": "number-activities" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "channel-distribution" - }, - { - "type": "time-to-first-interaction" - }, - { - "type": "builder" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "benchmark" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "integrations" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "inactive-members", - "cache": [[], []], - "settings": null - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "time-to-first-interaction", - "cache": [[], []], - "settings": null - }, - { - "type": "number-members", - "cache": [[], []], - "settings": null - }, - { - "type": "inactive-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-activities", - "cache": [102, 0], - "settings": { - "last_computed_at": "2022-01-13T11:49:20.813Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-13T11:49:20.113Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-13T11:49:19.632Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-13T11:49:20.106Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "latest-activities" - }, - { - "type": "integrations" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "time-to-first-interaction" - }, - { - "type": "number-members-graph" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "latest-activities" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "channel-distribution", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "newest-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "latest-activities" - }, - { - "type": "builder" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "latest-activities" - }, - { - "type": "integrations" - }, - { - "type": "number-activities" - }, - { - "type": "number-activities-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": null - }, - { - "type": "newest-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "builder" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-10T15:34:16.827Z", - "start": "2022-01-03T00:00:00.000Z", - "end": "2022-01-10T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-02-16T07:16:02.866Z", - "start": "2022-02-09T00:00:00.000Z", - "end": "2022-02-16T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "latest-activities" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-10T15:34:16.785Z", - "start": "2022-01-03T00:00:00.000Z", - "end": "2022-01-10T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-10T15:34:16.774Z", - "start": "2022-01-03T00:00:00.000Z", - "end": "2022-01-10T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": ["2021-12-06T00:00:00.000Z", "2021-12-21T00:00:00.000Z"], - "y": [1, 2] - }, - "settings": { - "last_computed_at": "2022-01-10T15:34:16.779Z", - "start": "2021-10-10T00:00:00.000Z", - "end": "2022-01-10T00:00:00.000Z" - } - }, - { - "type": "number-activities-graph", - "cache": { - "x": ["2021-12-06T00:00:00.000Z", "2021-12-21T00:00:00.000Z"], - "y": [1, 2] - }, - "settings": { - "last_computed_at": "2022-01-10T15:34:16.812Z", - "start": "2021-10-10T00:00:00.000Z", - "end": "2022-01-10T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "benchmark" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": null - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "builder" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": null - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": ["2021-10-05T00:00:00"], - "y": [1] - }, - "settings": null - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": null - }, - { - "type": "channel-distribution" - }, - { - "type": "number-members-graph", - "cache": { - "x": ["2021-10-05T00:00:00"], - "y": [1] - }, - "settings": null - }, - { - "type": "inactive-members", - "cache": [0, 3], - "settings": { - "last_computed_at": "2022-01-14T09:38:18.825Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "channel-distribution" - }, - { - "type": "integrations" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities", - "cache": [0, 29], - "settings": { - "last_computed_at": "2022-01-14T09:38:18.843Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "number-members", - "cache": [0, 6], - "settings": { - "last_computed_at": "2022-01-14T09:38:18.824Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [1, 2], - "settings": { - "last_computed_at": "2022-02-17T10:44:41.342Z", - "start": "2022-02-10T00:00:00.000Z", - "end": "2022-02-17T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-24T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-10-30T00:00:00.000Z", - "2021-10-31T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-04T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2022-01-12T00:00:00.000Z", - "2022-01-13T00:00:00.000Z" - ], - "y": [ - 1, 13, 21, 29, 40, 47, 55, 58, 70, 75, 84, 92, 95, 104, 112, 114, 121, 125, 131, 136, 140, - 149, 152, 161, 168, 170, 172, 175, 181, 186, 186, 188, 195, 198, 200, 208, 213, 216, 225, - 232, 236, 243, 249, 254, 255, 262, 269, 272, 274, 279, 291, 297, 303, 306, 312, 315, 323, - 325, 331, 336, 343, 346, 351, 352, 352, 352, 352, 352, 352, 352, 352, 353, 358 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T09:38:20.260Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "latest-activities" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-24T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-10-30T00:00:00.000Z", - "2021-10-31T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-04T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2022-01-12T00:00:00.000Z", - "2022-01-13T00:00:00.000Z" - ], - "y": [ - 1, 16, 28, 39, 52, 68, 82, 92, 115, 132, 150, 164, 183, 206, 232, 250, 275, 297, 321, 344, - 362, 397, 419, 451, 473, 499, 524, 554, 581, 621, 641, 673, 713, 744, 775, 810, 847, 879, - 925, 979, 1026, 1073, 1125, 1181, 1228, 1281, 1355, 1407, 1472, 1534, 1591, 1662, 1731, - 1818, 1896, 1979, 2062, 2172, 2249, 2351, 2437, 2532, 2618, 2728, 2834, 2939, 3041, 3147, - 3242, 3349, 3439, 3519, 3541 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T09:38:20.297Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-11-30T13:44:33.601Z", - "start": "2021-11-23T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "builder" - }, - { - "type": "integrations" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-11-30T13:44:33.612Z", - "start": "2021-11-23T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "benchmark" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-11-30T13:44:33.617Z", - "start": "2021-11-23T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-11-30T13:44:33.666Z", - "start": "2021-11-23T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "latest-activities" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2021-11-30T13:44:33.658Z", - "start": "2021-08-30T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2021-11-30T13:44:33.629Z", - "start": "2021-08-30T00:00:00.000Z", - "end": "2021-11-30T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-12-09 12:00:00", - "lastComputedAt": 1637875827631 - } - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "builder" - }, - { - "type": "integrations" - }, - { - "type": "time-to-first-interaction", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-12-09 12:00:00", - "lastComputedAt": 1637875827630 - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-09-16 12:00:00", - "lastComputedAt": 1637875828011 - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-members", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-12-09 12:00:00", - "lastComputedAt": 1637875827649 - } - }, - { - "type": "number-activities", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-12-09 12:00:00", - "lastComputedAt": 1637875827657 - } - }, - { - "type": "number-members-graph", - "settings": { - "end": "2021-12-16 12:00:00", - "start": "2021-09-16 12:00:00", - "lastComputedAt": 1637875827627 - } - }, - { - "type": "channel-distribution" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2021-12-23T10:22:10.934Z", - "start": "2021-09-23T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-12-23T10:22:10.816Z", - "start": "2021-12-16T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-12-23T10:22:10.868Z", - "start": "2021-12-16T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-12-23T10:22:10.886Z", - "start": "2021-12-16T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2021-12-23T10:22:10.923Z", - "start": "2021-09-23T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "builder" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2021-12-23T10:22:10.913Z", - "start": "2021-12-16T00:00:00.000Z", - "end": "2021-12-23T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-04T17:32:58.033Z", - "start": "2021-12-28T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-04T17:32:57.942Z", - "start": "2021-12-28T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "channel-distribution" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "benchmark" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-04T17:32:58.006Z", - "start": "2021-12-28T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [ - "2021-10-05T00:00:00.000Z", - "2021-10-08T00:00:00.000Z", - "2021-10-09T00:00:00.000Z", - "2021-10-11T00:00:00.000Z", - "2021-10-13T00:00:00.000Z", - "2021-10-14T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2022-01-03T00:00:00.000Z" - ], - "y": [ - 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 4, 5, 5, 5, 5, 5, 6 - ] - }, - "settings": { - "last_computed_at": "2022-01-04T17:32:58.077Z", - "start": "2021-10-04T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [ - "2021-10-05T00:00:00.000Z", - "2021-10-08T00:00:00.000Z", - "2021-10-09T00:00:00.000Z", - "2021-10-11T00:00:00.000Z", - "2021-10-13T00:00:00.000Z", - "2021-10-14T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2022-01-03T00:00:00.000Z" - ], - "y": [ - 1, 2, 3, 4, 6, 8, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 25, 26, 29, 33, 34, 35, - 36, 37, 38, 43, 44, 46, 48, 50, 51, 52, 53, 55, 57, 58, 59, 60 - ] - }, - "settings": { - "last_computed_at": "2022-01-04T17:32:58.016Z", - "start": "2021-10-04T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-04T17:32:58.021Z", - "start": "2021-12-28T00:00:00.000Z", - "end": "2022-01-04T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:12:17.958Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T15:12:17.944Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:12:18.019Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "latest-activities" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:12:18.069Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:12:17.911Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T15:12:17.984Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:13:00.536Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T15:13:00.565Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T15:13:00.543Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:13:00.567Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:13:00.538Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T15:13:00.570Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "latest-activities" - }, - { - "type": "benchmark" - }, - { - "type": "integrations" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:18:40.304Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T16:18:40.367Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "latest-activities" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:18:40.425Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "channel-distribution" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:18:40.346Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:18:39.876Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T16:18:40.516Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:19:21.548Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T16:19:21.548Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:19:21.536Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:19:21.540Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "latest-activities" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-11T16:19:21.544Z", - "start": "2022-01-04T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-11T16:19:21.616Z", - "start": "2021-10-11T00:00:00.000Z", - "end": "2022-01-11T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "benchmark", - "settings": { - "repositories": [ - { - "id": 56919458, - "value": "vue-multiselect", - "label": "vue-multiselect", - "active": true, - "editing": false, - "githubRepo": { - "id": 56919458, - "node_id": "MDEwOlJlcG9zaXRvcnk1NjkxOTQ1OA==", - "name": "vue-multiselect", - "full_name": "shentao/vue-multiselect", - "private": false, - "owner": { - "login": "shentao", - "id": 3737591, - "node_id": "MDQ6VXNlcjM3Mzc1OTE=", - "avatar_url": "https://avatars.githubusercontent.com/u/3737591?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/shentao", - "html_url": "https://github.com/shentao", - "followers_url": "https://api.github.com/users/shentao/followers", - "following_url": "https://api.github.com/users/shentao/following{/other_user}", - "gists_url": "https://api.github.com/users/shentao/gists{/gist_id}", - "starred_url": "https://api.github.com/users/shentao/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/shentao/subscriptions", - "organizations_url": "https://api.github.com/users/shentao/orgs", - "repos_url": "https://api.github.com/users/shentao/repos", - "events_url": "https://api.github.com/users/shentao/events{/privacy}", - "received_events_url": "https://api.github.com/users/shentao/received_events", - "type": "User", - "site_admin": false - }, - "html_url": "https://github.com/shentao/vue-multiselect", - "description": "Universal select/multiselect/tagging component for Vue.js", - "fork": false, - "url": "https://api.github.com/repos/shentao/vue-multiselect", - "forks_url": "https://api.github.com/repos/shentao/vue-multiselect/forks", - "keys_url": "https://api.github.com/repos/shentao/vue-multiselect/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/shentao/vue-multiselect/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/shentao/vue-multiselect/teams", - "hooks_url": "https://api.github.com/repos/shentao/vue-multiselect/hooks", - "issue_events_url": "https://api.github.com/repos/shentao/vue-multiselect/issues/events{/number}", - "events_url": "https://api.github.com/repos/shentao/vue-multiselect/events", - "assignees_url": "https://api.github.com/repos/shentao/vue-multiselect/assignees{/user}", - "branches_url": "https://api.github.com/repos/shentao/vue-multiselect/branches{/branch}", - "tags_url": "https://api.github.com/repos/shentao/vue-multiselect/tags", - "blobs_url": "https://api.github.com/repos/shentao/vue-multiselect/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/shentao/vue-multiselect/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/shentao/vue-multiselect/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/shentao/vue-multiselect/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/shentao/vue-multiselect/statuses/{sha}", - "languages_url": "https://api.github.com/repos/shentao/vue-multiselect/languages", - "stargazers_url": "https://api.github.com/repos/shentao/vue-multiselect/stargazers", - "contributors_url": "https://api.github.com/repos/shentao/vue-multiselect/contributors", - "subscribers_url": "https://api.github.com/repos/shentao/vue-multiselect/subscribers", - "subscription_url": "https://api.github.com/repos/shentao/vue-multiselect/subscription", - "commits_url": "https://api.github.com/repos/shentao/vue-multiselect/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/shentao/vue-multiselect/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/shentao/vue-multiselect/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/shentao/vue-multiselect/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/shentao/vue-multiselect/contents/{+path}", - "compare_url": "https://api.github.com/repos/shentao/vue-multiselect/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/shentao/vue-multiselect/merges", - "archive_url": "https://api.github.com/repos/shentao/vue-multiselect/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/shentao/vue-multiselect/downloads", - "issues_url": "https://api.github.com/repos/shentao/vue-multiselect/issues{/number}", - "pulls_url": "https://api.github.com/repos/shentao/vue-multiselect/pulls{/number}", - "milestones_url": "https://api.github.com/repos/shentao/vue-multiselect/milestones{/number}", - "notifications_url": "https://api.github.com/repos/shentao/vue-multiselect/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/shentao/vue-multiselect/labels{/name}", - "releases_url": "https://api.github.com/repos/shentao/vue-multiselect/releases{/id}", - "deployments_url": "https://api.github.com/repos/shentao/vue-multiselect/deployments", - "created_at": "2016-04-23T13:02:33Z", - "updated_at": "2022-01-19T11:09:17Z", - "pushed_at": "2022-01-17T04:06:58Z", - "git_url": "git://github.com/shentao/vue-multiselect.git", - "ssh_url": "git@github.com:shentao/vue-multiselect.git", - "clone_url": "https://github.com/shentao/vue-multiselect.git", - "svn_url": "https://github.com/shentao/vue-multiselect", - "homepage": "https://vue-multiselect.js.org/", - "size": 13669, - "stargazers_count": 6021, - "watchers_count": 6021, - "language": "JavaScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": true, - "forks_count": 916, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 357, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "allow_forking": true, - "is_template": false, - "topics": ["component", "dropdown", "javascript", "select", "vue"], - "visibility": "public", - "forks": 916, - "open_issues": 357, - "watchers": 6021, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-01-26": { - "date": "2022-01-26", - "value": 6029 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 6029 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 6029 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 6026 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 6026 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 6022 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 6020 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 6018 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 6016 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 6015 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 6014 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 6011 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 6010 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 6008 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 6007 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 6005 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 6003 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 6003 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 6002 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 5999 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 5996 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 5995 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 5992 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 5991 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 5991 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 5991 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 5989 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 5988 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 5985 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 5985 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 5985 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 5985 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 5985 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 5984 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 5984 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 5980 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 5978 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 5978 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 5978 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 5978 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 5977 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 5974 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 5972 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 5970 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 5969 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 5969 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 5969 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 5967 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 5967 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 5966 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 5962 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 5958 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 5958 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 5957 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 5955 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 5955 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 5954 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 5953 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 5952 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 5951 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 5950 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 5947 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 5947 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 5942 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 5940 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 5938 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 5938 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 5938 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 5935 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 5931 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 5929 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 5927 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 5926 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 5925 - }, - "2021-11-13": { - "date": "2021-11-13", - "value": 5923 - }, - "2021-11-12": { - "date": "2021-11-12", - "value": 5923 - }, - "2021-11-11": { - "date": "2021-11-11", - "value": 5921 - }, - "2021-11-10": { - "date": "2021-11-10", - "value": 5919 - }, - "2021-11-09": { - "date": "2021-11-09", - "value": 5916 - }, - "2021-11-08": { - "date": "2021-11-08", - "value": 5912 - }, - "2021-11-07": { - "date": "2021-11-07", - "value": 5910 - }, - "2021-11-06": { - "date": "2021-11-06", - "value": 5909 - }, - "2021-11-05": { - "date": "2021-11-05", - "value": 5908 - }, - "2021-11-04": { - "date": "2021-11-04", - "value": 5908 - }, - "2021-11-03": { - "date": "2021-11-03", - "value": 5907 - }, - "2021-11-02": { - "date": "2021-11-02", - "value": 5905 - }, - "2021-11-01": { - "date": "2021-11-01", - "value": 5905 - }, - "2021-10-31": { - "date": "2021-10-31", - "value": 5905 - }, - "2021-10-30": { - "date": "2021-10-30", - "value": 5903 - }, - "2021-10-29": { - "date": "2021-10-29", - "value": 5903 - }, - "2021-10-28": { - "date": "2021-10-28", - "value": 5902 - }, - "2021-10-27": { - "date": "2021-10-27", - "value": 5902 - }, - "2021-10-26": { - "date": "2021-10-26", - "value": 5900 - } - }, - "color": "#20A215" - } - ], - "last_updated_at": "2022-01-26", - "timeframe": { - "label": "Last three months", - "value": "last_three_months", - "date": "2021-10-26" - } - } - }, - { - "type": "inactive-members", - "cache": [3, 5], - "settings": { - "last_computed_at": "2022-01-14T10:45:36.437Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-24T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-10-30T00:00:00.000Z", - "2021-10-31T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-04T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2021-12-29T00:00:00.000Z", - "2021-12-30T00:00:00.000Z", - "2022-01-03T00:00:00.000Z", - "2022-01-04T00:00:00.000Z", - "2022-01-05T00:00:00.000Z", - "2022-01-06T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z" - ], - "y": [ - 1, 131, 148, 163, 169, 175, 180, 185, 188, 188, 192, 198, 200, 214, 215, 219, 221, 222, 225, - 229, 233, 235, 236, 237, 237, 239, 240, 242, 245, 257, 257, 257, 257, 258, 260, 261, 264, - 265, 269, 272, 276, 276, 277, 277, 278, 279, 283, 285, 286, 287, 289, 291, 292, 292, 292, - 292, 293, 293, 293, 293, 296, 296, 310, 310, 311, 314, 315, 317, 317, 317, 318, 319, 320, - 321, 321, 323, 325, 326, 327, 327, 328 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T10:45:44.584Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "latest-activities" - }, - { - "type": "channel-distribution" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-25T23:21:32.193Z", - "start": "2022-01-19T00:00:00.000Z", - "end": "2022-01-26T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [17, 5], - "settings": { - "last_computed_at": "2022-01-14T10:45:36.778Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [3, 3], - "settings": { - "last_computed_at": "2022-01-14T10:45:37.631Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-24T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-10-30T00:00:00.000Z", - "2021-10-31T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-04T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2021-12-29T00:00:00.000Z", - "2021-12-30T00:00:00.000Z", - "2022-01-03T00:00:00.000Z", - "2022-01-04T00:00:00.000Z", - "2022-01-05T00:00:00.000Z", - "2022-01-06T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z" - ], - "y": [ - 1, 284, 443, 616, 812, 940, 1093, 1245, 1396, 1530, 1638, 1937, 2214, 2616, 2786, 3071, - 3224, 3411, 3624, 3805, 4030, 4282, 4566, 4722, 5149, 5461, 5776, 5918, 6185, 6591, 6841, - 7137, 7310, 7599, 7850, 8019, 8280, 8522, 8846, 9018, 9280, 9526, 9730, 9889, 10183, 10342, - 10635, 10686, 10984, 11255, 11558, 11717, 11867, 12026, 12268, 12451, 12754, 13027, 13300, - 13516, 13579, 13748, 14014, 14311, 14468, 14883, 15054, 15220, 15477, 15566, 15567, 15568, - 15569, 15570, 15571, 15576, 15585, 15587, 15588, 15589, 15591 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T10:45:44.552Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T11:45:28.654Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-20T15:06:26.809Z", - "start": "2022-01-13T00:00:00.000Z", - "end": "2022-01-20T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T11:45:28.808Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T11:45:28.840Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "inactive-members-graph" - }, - { - "type": "integrations" - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-12T11:45:28.806Z", - "start": "2021-10-12T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "latest-activities" - }, - { - "type": "builder" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-12T11:45:28.818Z", - "start": "2021-10-12T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "newest-members" - }, - { - "type": "benchmark" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark", - "settings": { - "repositories": [ - { - "id": 341208515, - "value": "edgelessdb", - "label": "edgelessdb", - "active": true, - "editing": false, - "githubRepo": { - "id": 341208515, - "node_id": "MDEwOlJlcG9zaXRvcnkzNDEyMDg1MTU=", - "name": "edgelessdb", - "full_name": "edgelesssys/edgelessdb", - "private": false, - "owner": { - "login": "edgelesssys", - "id": 58512657, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjU4NTEyNjU3", - "avatar_url": "https://avatars.githubusercontent.com/u/58512657?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/edgelesssys", - "html_url": "https://github.com/edgelesssys", - "followers_url": "https://api.github.com/users/edgelesssys/followers", - "following_url": "https://api.github.com/users/edgelesssys/following{/other_user}", - "gists_url": "https://api.github.com/users/edgelesssys/gists{/gist_id}", - "starred_url": "https://api.github.com/users/edgelesssys/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/edgelesssys/subscriptions", - "organizations_url": "https://api.github.com/users/edgelesssys/orgs", - "repos_url": "https://api.github.com/users/edgelesssys/repos", - "events_url": "https://api.github.com/users/edgelesssys/events{/privacy}", - "received_events_url": "https://api.github.com/users/edgelesssys/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/edgelesssys/edgelessdb", - "description": "EdgelessDB is a MySQL-compatible database for confidential computing. It runs entirely inside a secure enclave and comes with advanced features for collaboration, recovery, and access control.", - "fork": false, - "url": "https://api.github.com/repos/edgelesssys/edgelessdb", - "forks_url": "https://api.github.com/repos/edgelesssys/edgelessdb/forks", - "keys_url": "https://api.github.com/repos/edgelesssys/edgelessdb/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/edgelesssys/edgelessdb/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/edgelesssys/edgelessdb/teams", - "hooks_url": "https://api.github.com/repos/edgelesssys/edgelessdb/hooks", - "issue_events_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues/events{/number}", - "events_url": "https://api.github.com/repos/edgelesssys/edgelessdb/events", - "assignees_url": "https://api.github.com/repos/edgelesssys/edgelessdb/assignees{/user}", - "branches_url": "https://api.github.com/repos/edgelesssys/edgelessdb/branches{/branch}", - "tags_url": "https://api.github.com/repos/edgelesssys/edgelessdb/tags", - "blobs_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/edgelesssys/edgelessdb/statuses/{sha}", - "languages_url": "https://api.github.com/repos/edgelesssys/edgelessdb/languages", - "stargazers_url": "https://api.github.com/repos/edgelesssys/edgelessdb/stargazers", - "contributors_url": "https://api.github.com/repos/edgelesssys/edgelessdb/contributors", - "subscribers_url": "https://api.github.com/repos/edgelesssys/edgelessdb/subscribers", - "subscription_url": "https://api.github.com/repos/edgelesssys/edgelessdb/subscription", - "commits_url": "https://api.github.com/repos/edgelesssys/edgelessdb/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/edgelesssys/edgelessdb/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/edgelesssys/edgelessdb/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/edgelesssys/edgelessdb/contents/{+path}", - "compare_url": "https://api.github.com/repos/edgelesssys/edgelessdb/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/edgelesssys/edgelessdb/merges", - "archive_url": "https://api.github.com/repos/edgelesssys/edgelessdb/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/edgelesssys/edgelessdb/downloads", - "issues_url": "https://api.github.com/repos/edgelesssys/edgelessdb/issues{/number}", - "pulls_url": "https://api.github.com/repos/edgelesssys/edgelessdb/pulls{/number}", - "milestones_url": "https://api.github.com/repos/edgelesssys/edgelessdb/milestones{/number}", - "notifications_url": "https://api.github.com/repos/edgelesssys/edgelessdb/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/edgelesssys/edgelessdb/labels{/name}", - "releases_url": "https://api.github.com/repos/edgelesssys/edgelessdb/releases{/id}", - "deployments_url": "https://api.github.com/repos/edgelesssys/edgelessdb/deployments", - "created_at": "2021-02-22T13:24:30Z", - "updated_at": "2022-01-06T11:27:56Z", - "pushed_at": "2021-12-17T12:07:53Z", - "git_url": "git://github.com/edgelesssys/edgelessdb.git", - "ssh_url": "git@github.com:edgelesssys/edgelessdb.git", - "clone_url": "https://github.com/edgelesssys/edgelessdb.git", - "svn_url": "https://github.com/edgelesssys/edgelessdb", - "homepage": "https://edgeless.systems/products/edgelessdb", - "size": 438, - "stargazers_count": 88, - "watchers_count": 88, - "language": "Go", - "has_issues": true, - "has_projects": false, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 7, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 4, - "license": { - "key": "gpl-2.0", - "name": "GNU General Public License v2.0", - "spdx_id": "GPL-2.0", - "url": "https://api.github.com/licenses/gpl-2.0", - "node_id": "MDc6TGljZW5zZTg=" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "confidential-computing", - "database", - "enclave", - "mariadb", - "mysql", - "sgx", - "sql" - ], - "visibility": "public", - "forks": 7, - "open_issues": 4, - "watchers": 88, - "default_branch": "main", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-17": { - "date": "2022-02-17", - "value": 94 - }, - "2022-02-16": { - "date": "2022-02-16", - "value": 94 - }, - "2022-02-15": { - "date": "2022-02-15", - "value": 93 - }, - "2022-02-14": { - "date": "2022-02-14", - "value": 93 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 93 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 93 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 93 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 93 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 93 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 93 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 92 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 92 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 92 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 92 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 91 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 91 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 91 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 91 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 91 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 91 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 91 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 91 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 91 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 90 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 90 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 90 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 89 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 89 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 88 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 88 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 88 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 88 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 88 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 88 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 88 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 88 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 88 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 88 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 88 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 88 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 88 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 88 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 87 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 87 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 86 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 86 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 86 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 86 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 85 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 84 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 84 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 84 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 84 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 84 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 84 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 83 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 83 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 83 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 83 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 83 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 83 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 83 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 83 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 83 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 83 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 80 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 80 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 80 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 80 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 80 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 79 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 79 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 78 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 77 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 77 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 77 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 77 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 77 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 77 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 77 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 77 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 77 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 77 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 76 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 76 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 76 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 75 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 75 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 75 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 75 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 74 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 74 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 74 - } - } - }, - { - "id": 389910135, - "value": "awesome-community-building", - "label": "awesome-community-building", - "active": true, - "editing": false, - "githubRepo": { - "id": 389910135, - "node_id": "MDEwOlJlcG9zaXRvcnkzODk5MTAxMzU=", - "name": "awesome-community-building", - "full_name": "CrowdDevHQ/awesome-community-building", - "private": false, - "owner": { - "login": "CrowdDevHQ", - "id": 85551972, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjg1NTUxOTcy", - "avatar_url": "https://avatars.githubusercontent.com/u/85551972?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/CrowdDevHQ", - "html_url": "https://github.com/CrowdDevHQ", - "followers_url": "https://api.github.com/users/CrowdDevHQ/followers", - "following_url": "https://api.github.com/users/CrowdDevHQ/following{/other_user}", - "gists_url": "https://api.github.com/users/CrowdDevHQ/gists{/gist_id}", - "starred_url": "https://api.github.com/users/CrowdDevHQ/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/CrowdDevHQ/subscriptions", - "organizations_url": "https://api.github.com/users/CrowdDevHQ/orgs", - "repos_url": "https://api.github.com/users/CrowdDevHQ/repos", - "events_url": "https://api.github.com/users/CrowdDevHQ/events{/privacy}", - "received_events_url": "https://api.github.com/users/CrowdDevHQ/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/CrowdDevHQ/awesome-community-building", - "description": "A curated list of awesome resources on building developer communities. 🥑", - "fork": false, - "url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building", - "forks_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/forks", - "keys_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/teams", - "hooks_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/hooks", - "issue_events_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/issues/events{/number}", - "events_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/events", - "assignees_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/assignees{/user}", - "branches_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/branches{/branch}", - "tags_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/tags", - "blobs_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/statuses/{sha}", - "languages_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/languages", - "stargazers_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/stargazers", - "contributors_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/contributors", - "subscribers_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/subscribers", - "subscription_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/subscription", - "commits_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/contents/{+path}", - "compare_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/merges", - "archive_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/downloads", - "issues_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/issues{/number}", - "pulls_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/pulls{/number}", - "milestones_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/milestones{/number}", - "notifications_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/labels{/name}", - "releases_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/releases{/id}", - "deployments_url": "https://api.github.com/repos/CrowdDevHQ/awesome-community-building/deployments", - "created_at": "2021-07-27T08:43:58Z", - "updated_at": "2022-01-03T18:09:50Z", - "pushed_at": "2021-11-22T10:48:14Z", - "git_url": "git://github.com/CrowdDevHQ/awesome-community-building.git", - "ssh_url": "git@github.com:CrowdDevHQ/awesome-community-building.git", - "clone_url": "https://github.com/CrowdDevHQ/awesome-community-building.git", - "svn_url": "https://github.com/CrowdDevHQ/awesome-community-building", - "homepage": null, - "size": 4, - "stargazers_count": 6, - "watchers_count": 6, - "language": null, - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": false, - "forks_count": 1, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 0, - "license": null, - "allow_forking": true, - "is_template": false, - "topics": [], - "visibility": "public", - "forks": 1, - "open_issues": 0, - "watchers": 6, - "default_branch": "main", - "permissions": { - "admin": true, - "maintain": true, - "push": true, - "triage": true, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-17": { - "date": "2022-02-17", - "value": 6 - }, - "2022-02-16": { - "date": "2022-02-16", - "value": 6 - }, - "2022-02-15": { - "date": "2022-02-15", - "value": 6 - }, - "2022-02-14": { - "date": "2022-02-14", - "value": 5 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 5 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 5 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 5 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 5 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 5 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 5 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 5 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 5 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 5 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 5 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 5 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 5 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 5 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 5 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 5 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 5 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 5 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 5 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 5 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 5 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 5 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 5 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 5 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 5 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 5 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 5 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 5 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 5 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 5 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 5 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 5 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 5 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 5 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 5 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 5 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 5 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 5 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 5 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 5 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 5 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 5 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 3 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 3 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 3 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 3 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 3 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 3 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 3 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 3 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 3 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 3 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 3 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 3 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 3 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 3 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 3 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 3 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 3 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 3 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 3 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 3 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 3 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 3 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 3 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 3 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 3 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 3 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 3 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 3 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 3 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 3 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 3 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 3 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 3 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 3 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 2 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 2 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 2 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 2 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 2 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 2 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 2 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 2 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 2 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 2 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 2 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 2 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 2 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 2 - } - }, - "color": "#331717" - }, - { - "id": 267045750, - "value": "edgelessrt", - "label": "edgelessrt", - "active": true, - "editing": false, - "githubRepo": { - "id": 267045750, - "node_id": "MDEwOlJlcG9zaXRvcnkyNjcwNDU3NTA=", - "name": "edgelessrt", - "full_name": "edgelesssys/edgelessrt", - "private": false, - "owner": { - "login": "edgelesssys", - "id": 58512657, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjU4NTEyNjU3", - "avatar_url": "https://avatars.githubusercontent.com/u/58512657?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/edgelesssys", - "html_url": "https://github.com/edgelesssys", - "followers_url": "https://api.github.com/users/edgelesssys/followers", - "following_url": "https://api.github.com/users/edgelesssys/following{/other_user}", - "gists_url": "https://api.github.com/users/edgelesssys/gists{/gist_id}", - "starred_url": "https://api.github.com/users/edgelesssys/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/edgelesssys/subscriptions", - "organizations_url": "https://api.github.com/users/edgelesssys/orgs", - "repos_url": "https://api.github.com/users/edgelesssys/repos", - "events_url": "https://api.github.com/users/edgelesssys/events{/privacy}", - "received_events_url": "https://api.github.com/users/edgelesssys/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/edgelesssys/edgelessrt", - "description": "Edgeless RT is an SDK and a runtime for Intel SGX. It combines top-notch Go support with simplicity, robustness and a small TCB. Developing confidential microservices has never been easier! C++17 and Rust (experimental) are also supported.", - "fork": false, - "url": "https://api.github.com/repos/edgelesssys/edgelessrt", - "forks_url": "https://api.github.com/repos/edgelesssys/edgelessrt/forks", - "keys_url": "https://api.github.com/repos/edgelesssys/edgelessrt/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/edgelesssys/edgelessrt/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/edgelesssys/edgelessrt/teams", - "hooks_url": "https://api.github.com/repos/edgelesssys/edgelessrt/hooks", - "issue_events_url": "https://api.github.com/repos/edgelesssys/edgelessrt/issues/events{/number}", - "events_url": "https://api.github.com/repos/edgelesssys/edgelessrt/events", - "assignees_url": "https://api.github.com/repos/edgelesssys/edgelessrt/assignees{/user}", - "branches_url": "https://api.github.com/repos/edgelesssys/edgelessrt/branches{/branch}", - "tags_url": "https://api.github.com/repos/edgelesssys/edgelessrt/tags", - "blobs_url": "https://api.github.com/repos/edgelesssys/edgelessrt/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/edgelesssys/edgelessrt/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/edgelesssys/edgelessrt/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/edgelesssys/edgelessrt/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/edgelesssys/edgelessrt/statuses/{sha}", - "languages_url": "https://api.github.com/repos/edgelesssys/edgelessrt/languages", - "stargazers_url": "https://api.github.com/repos/edgelesssys/edgelessrt/stargazers", - "contributors_url": "https://api.github.com/repos/edgelesssys/edgelessrt/contributors", - "subscribers_url": "https://api.github.com/repos/edgelesssys/edgelessrt/subscribers", - "subscription_url": "https://api.github.com/repos/edgelesssys/edgelessrt/subscription", - "commits_url": "https://api.github.com/repos/edgelesssys/edgelessrt/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/edgelesssys/edgelessrt/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/edgelesssys/edgelessrt/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/edgelesssys/edgelessrt/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/edgelesssys/edgelessrt/contents/{+path}", - "compare_url": "https://api.github.com/repos/edgelesssys/edgelessrt/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/edgelesssys/edgelessrt/merges", - "archive_url": "https://api.github.com/repos/edgelesssys/edgelessrt/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/edgelesssys/edgelessrt/downloads", - "issues_url": "https://api.github.com/repos/edgelesssys/edgelessrt/issues{/number}", - "pulls_url": "https://api.github.com/repos/edgelesssys/edgelessrt/pulls{/number}", - "milestones_url": "https://api.github.com/repos/edgelesssys/edgelessrt/milestones{/number}", - "notifications_url": "https://api.github.com/repos/edgelesssys/edgelessrt/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/edgelesssys/edgelessrt/labels{/name}", - "releases_url": "https://api.github.com/repos/edgelesssys/edgelessrt/releases{/id}", - "deployments_url": "https://api.github.com/repos/edgelesssys/edgelessrt/deployments", - "created_at": "2020-05-26T13:09:17Z", - "updated_at": "2022-01-06T06:11:55Z", - "pushed_at": "2022-01-14T10:45:52Z", - "git_url": "git://github.com/edgelesssys/edgelessrt.git", - "ssh_url": "git@github.com:edgelesssys/edgelessrt.git", - "clone_url": "https://github.com/edgelesssys/edgelessrt.git", - "svn_url": "https://github.com/edgelesssys/edgelessrt", - "homepage": "https://edgeless.systems", - "size": 98955, - "stargazers_count": 101, - "watchers_count": 101, - "language": "C++", - "has_issues": true, - "has_projects": false, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 14, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 1, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "confidential-computing", - "confidential-microservices", - "enclave", - "golang", - "intel-sgx", - "rust", - "sgx", - "trusted-execution-environment" - ], - "visibility": "public", - "forks": 14, - "open_issues": 1, - "watchers": 101, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "data": { - "2022-02-17": { - "date": "2022-02-17", - "value": 101 - }, - "2022-02-16": { - "date": "2022-02-16", - "value": 101 - }, - "2022-02-15": { - "date": "2022-02-15", - "value": 101 - }, - "2022-02-14": { - "date": "2022-02-14", - "value": 101 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 101 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 101 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 101 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 101 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 101 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 101 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 101 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 101 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 101 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 101 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 101 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 101 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 101 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 101 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 101 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 101 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 101 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 101 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 101 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 101 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 101 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 101 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 101 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 101 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 101 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 101 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 101 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 101 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 101 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 101 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 101 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 101 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 101 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 101 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 101 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 101 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 101 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 101 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 100 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 100 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 100 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 99 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 99 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 99 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 99 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 99 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 99 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 99 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 99 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 99 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 99 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 99 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 99 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 99 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 99 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 98 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 98 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 98 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 98 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 98 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 98 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 98 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 98 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 98 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 98 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 98 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 98 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 98 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 98 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 98 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 98 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 98 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 98 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 98 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 98 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 98 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 98 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 98 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 98 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 98 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 97 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 97 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 97 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 97 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 97 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 97 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 97 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 97 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 97 - } - }, - "color": "#4D2929" - } - ], - "last_updated_at": "2022-02-17", - "timeframe": { - "label": "Last three months", - "value": "last_three_months", - "date": "2021-11-17" - } - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2021-12-24T00:00:00.000Z", - "2021-12-25T00:00:00.000Z", - "2021-12-26T00:00:00.000Z", - "2021-12-27T00:00:00.000Z", - "2021-12-28T00:00:00.000Z", - "2021-12-29T00:00:00.000Z", - "2021-12-30T00:00:00.000Z", - "2021-12-31T00:00:00.000Z", - "2022-01-01T00:00:00.000Z", - "2022-01-02T00:00:00.000Z", - "2022-01-03T00:00:00.000Z", - "2022-01-04T00:00:00.000Z", - "2022-01-05T00:00:00.000Z", - "2022-01-06T00:00:00.000Z", - "2022-01-07T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-09T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z", - "2022-01-13T00:00:00.000Z" - ], - "y": [ - 1, 2, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 11, 11, 11, 12, 13, 13, - 14, 15, 16, 16, 16, 16, 18, 18, 19, 20, 20, 20, 20, 20, 20, 21, 22, 22, 23, 24, 24, 24, 24, - 24, 25, 25, 26, 27, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 31, 31, 33, 33, 34, 34, 34, - 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T10:58:17.393Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [3, 5], - "settings": { - "last_computed_at": "2022-01-14T10:58:17.152Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-02-17T12:08:11.126Z", - "start": "2022-02-10T00:00:00.000Z", - "end": "2022-02-17T00:00:00.000Z" - } - }, - { - "type": "channel-distribution" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "number-activities", - "cache": [155, 131], - "settings": { - "last_computed_at": "2022-01-14T10:58:17.045Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "number-members", - "cache": [1, 11], - "settings": { - "last_computed_at": "2022-01-14T10:58:17.085Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "integrations" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [ - "2021-10-14T00:00:00.000Z", - "2021-10-15T00:00:00.000Z", - "2021-10-16T00:00:00.000Z", - "2021-10-17T00:00:00.000Z", - "2021-10-18T00:00:00.000Z", - "2021-10-19T00:00:00.000Z", - "2021-10-20T00:00:00.000Z", - "2021-10-21T00:00:00.000Z", - "2021-10-22T00:00:00.000Z", - "2021-10-23T00:00:00.000Z", - "2021-10-25T00:00:00.000Z", - "2021-10-26T00:00:00.000Z", - "2021-10-27T00:00:00.000Z", - "2021-10-28T00:00:00.000Z", - "2021-10-29T00:00:00.000Z", - "2021-11-01T00:00:00.000Z", - "2021-11-02T00:00:00.000Z", - "2021-11-03T00:00:00.000Z", - "2021-11-04T00:00:00.000Z", - "2021-11-05T00:00:00.000Z", - "2021-11-06T00:00:00.000Z", - "2021-11-07T00:00:00.000Z", - "2021-11-08T00:00:00.000Z", - "2021-11-09T00:00:00.000Z", - "2021-11-10T00:00:00.000Z", - "2021-11-11T00:00:00.000Z", - "2021-11-12T00:00:00.000Z", - "2021-11-13T00:00:00.000Z", - "2021-11-14T00:00:00.000Z", - "2021-11-15T00:00:00.000Z", - "2021-11-16T00:00:00.000Z", - "2021-11-17T00:00:00.000Z", - "2021-11-18T00:00:00.000Z", - "2021-11-19T00:00:00.000Z", - "2021-11-20T00:00:00.000Z", - "2021-11-21T00:00:00.000Z", - "2021-11-22T00:00:00.000Z", - "2021-11-23T00:00:00.000Z", - "2021-11-24T00:00:00.000Z", - "2021-11-25T00:00:00.000Z", - "2021-11-26T00:00:00.000Z", - "2021-11-27T00:00:00.000Z", - "2021-11-28T00:00:00.000Z", - "2021-11-29T00:00:00.000Z", - "2021-11-30T00:00:00.000Z", - "2021-12-01T00:00:00.000Z", - "2021-12-02T00:00:00.000Z", - "2021-12-03T00:00:00.000Z", - "2021-12-05T00:00:00.000Z", - "2021-12-06T00:00:00.000Z", - "2021-12-07T00:00:00.000Z", - "2021-12-08T00:00:00.000Z", - "2021-12-09T00:00:00.000Z", - "2021-12-10T00:00:00.000Z", - "2021-12-11T00:00:00.000Z", - "2021-12-12T00:00:00.000Z", - "2021-12-13T00:00:00.000Z", - "2021-12-14T00:00:00.000Z", - "2021-12-15T00:00:00.000Z", - "2021-12-16T00:00:00.000Z", - "2021-12-17T00:00:00.000Z", - "2021-12-18T00:00:00.000Z", - "2021-12-19T00:00:00.000Z", - "2021-12-20T00:00:00.000Z", - "2021-12-21T00:00:00.000Z", - "2021-12-22T00:00:00.000Z", - "2021-12-23T00:00:00.000Z", - "2021-12-24T00:00:00.000Z", - "2021-12-25T00:00:00.000Z", - "2021-12-26T00:00:00.000Z", - "2021-12-27T00:00:00.000Z", - "2021-12-28T00:00:00.000Z", - "2021-12-29T00:00:00.000Z", - "2021-12-30T00:00:00.000Z", - "2021-12-31T00:00:00.000Z", - "2022-01-01T00:00:00.000Z", - "2022-01-02T00:00:00.000Z", - "2022-01-03T00:00:00.000Z", - "2022-01-04T00:00:00.000Z", - "2022-01-05T00:00:00.000Z", - "2022-01-06T00:00:00.000Z", - "2022-01-07T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-09T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z", - "2022-01-13T00:00:00.000Z" - ], - "y": [ - 1, 5, 25, 26, 33, 40, 51, 53, 55, 63, 64, 83, 94, 101, 104, 108, 111, 114, 115, 123, 126, - 128, 130, 151, 162, 168, 173, 177, 178, 194, 212, 214, 218, 234, 237, 240, 246, 259, 281, - 293, 308, 309, 310, 312, 338, 342, 345, 349, 351, 352, 356, 361, 364, 388, 395, 396, 399, - 407, 419, 426, 432, 443, 450, 455, 466, 471, 490, 548, 555, 561, 567, 574, 577, 586, 594, - 600, 606, 612, 631, 653, 730, 749, 764, 774, 778, 795, 809, 872 - ] - }, - "settings": { - "last_computed_at": "2022-01-14T10:58:17.440Z", - "start": "2021-10-14T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T16:49:14.400Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T16:49:14.910Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "number-members", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T16:49:15.013Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "channel-distribution" - }, - { - "type": "number-activities-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-12T16:49:14.309Z", - "start": "2021-10-12T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "number-members-graph", - "cache": { - "x": [], - "y": [] - }, - "settings": { - "last_computed_at": "2022-01-12T16:49:14.325Z", - "start": "2021-10-12T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "builder" - }, - { - "type": "newest-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-12T16:49:14.910Z", - "start": "2022-01-05T00:00:00.000Z", - "end": "2022-01-12T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-25T10:18:55.331Z", - "start": "2022-01-18T00:00:00.000Z", - "end": "2022-01-25T00:00:00.000Z" - } - }, - { - "type": "inactive-members", - "cache": [2, 4], - "settings": { - "last_computed_at": "2022-01-13T11:51:34.942Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "number-activities", - "cache": [71, 81], - "settings": { - "last_computed_at": "2022-01-13T11:51:35.738Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "number-activities-graph", - "cache": { - "x": [ - "2022-01-06T00:00:00.000Z", - "2022-01-07T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-09T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z" - ], - "y": [1, 15, 27, 37, 53, 62, 74] - }, - "settings": { - "last_computed_at": "2022-01-13T11:51:35.734Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-members", - "cache": [0, 1], - "settings": { - "last_computed_at": "2022-01-13T11:51:35.640Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "newest-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "latest-activities" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "number-members-graph", - "cache": { - "x": [ - "2022-01-06T00:00:00.000Z", - "2022-01-07T00:00:00.000Z", - "2022-01-08T00:00:00.000Z", - "2022-01-09T00:00:00.000Z", - "2022-01-10T00:00:00.000Z", - "2022-01-11T00:00:00.000Z", - "2022-01-12T00:00:00.000Z" - ], - "y": [1, 12, 19, 24, 30, 33, 34] - }, - "settings": { - "last_computed_at": "2022-01-13T11:51:35.770Z", - "start": "2022-01-06T00:00:00.000Z", - "end": "2022-01-13T00:00:00.000Z" - } - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-14T11:46:50.598Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "latest-activities" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-14T11:52:42.202Z", - "start": "2022-01-07T00:00:00.000Z", - "end": "2022-01-14T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members" - }, - { - "type": "number-activities" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction" - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-02-14T10:11:35.523Z", - "start": "2022-02-07T00:00:00.000Z", - "end": "2022-02-14T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "number-activities-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "number-members-graph" - }, - { - "type": "benchmark" - }, - { - "type": "latest-activities" - }, - { - "type": "newest-members" - }, - { - "type": "integrations" - }, - { - "type": "builder" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [1, 0], - "settings": { - "last_computed_at": "2022-02-17T11:24:42.425Z", - "start": "2022-02-10T00:00:00.000Z", - "end": "2022-02-17T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "benchmark", - "settings": { - "repositories": [ - { - "id": 56919458, - "value": "vue-multiselect", - "label": "vue-multiselect", - "active": true, - "editing": false, - "githubRepo": { - "id": 56919458, - "node_id": "MDEwOlJlcG9zaXRvcnk1NjkxOTQ1OA==", - "name": "vue-multiselect", - "full_name": "shentao/vue-multiselect", - "private": false, - "owner": { - "login": "shentao", - "id": 3737591, - "node_id": "MDQ6VXNlcjM3Mzc1OTE=", - "avatar_url": "https://avatars.githubusercontent.com/u/3737591?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/shentao", - "html_url": "https://github.com/shentao", - "followers_url": "https://api.github.com/users/shentao/followers", - "following_url": "https://api.github.com/users/shentao/following{/other_user}", - "gists_url": "https://api.github.com/users/shentao/gists{/gist_id}", - "starred_url": "https://api.github.com/users/shentao/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/shentao/subscriptions", - "organizations_url": "https://api.github.com/users/shentao/orgs", - "repos_url": "https://api.github.com/users/shentao/repos", - "events_url": "https://api.github.com/users/shentao/events{/privacy}", - "received_events_url": "https://api.github.com/users/shentao/received_events", - "type": "User", - "site_admin": false - }, - "html_url": "https://github.com/shentao/vue-multiselect", - "description": "Universal select/multiselect/tagging component for Vue.js", - "fork": false, - "url": "https://api.github.com/repos/shentao/vue-multiselect", - "forks_url": "https://api.github.com/repos/shentao/vue-multiselect/forks", - "keys_url": "https://api.github.com/repos/shentao/vue-multiselect/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/shentao/vue-multiselect/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/shentao/vue-multiselect/teams", - "hooks_url": "https://api.github.com/repos/shentao/vue-multiselect/hooks", - "issue_events_url": "https://api.github.com/repos/shentao/vue-multiselect/issues/events{/number}", - "events_url": "https://api.github.com/repos/shentao/vue-multiselect/events", - "assignees_url": "https://api.github.com/repos/shentao/vue-multiselect/assignees{/user}", - "branches_url": "https://api.github.com/repos/shentao/vue-multiselect/branches{/branch}", - "tags_url": "https://api.github.com/repos/shentao/vue-multiselect/tags", - "blobs_url": "https://api.github.com/repos/shentao/vue-multiselect/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/shentao/vue-multiselect/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/shentao/vue-multiselect/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/shentao/vue-multiselect/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/shentao/vue-multiselect/statuses/{sha}", - "languages_url": "https://api.github.com/repos/shentao/vue-multiselect/languages", - "stargazers_url": "https://api.github.com/repos/shentao/vue-multiselect/stargazers", - "contributors_url": "https://api.github.com/repos/shentao/vue-multiselect/contributors", - "subscribers_url": "https://api.github.com/repos/shentao/vue-multiselect/subscribers", - "subscription_url": "https://api.github.com/repos/shentao/vue-multiselect/subscription", - "commits_url": "https://api.github.com/repos/shentao/vue-multiselect/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/shentao/vue-multiselect/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/shentao/vue-multiselect/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/shentao/vue-multiselect/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/shentao/vue-multiselect/contents/{+path}", - "compare_url": "https://api.github.com/repos/shentao/vue-multiselect/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/shentao/vue-multiselect/merges", - "archive_url": "https://api.github.com/repos/shentao/vue-multiselect/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/shentao/vue-multiselect/downloads", - "issues_url": "https://api.github.com/repos/shentao/vue-multiselect/issues{/number}", - "pulls_url": "https://api.github.com/repos/shentao/vue-multiselect/pulls{/number}", - "milestones_url": "https://api.github.com/repos/shentao/vue-multiselect/milestones{/number}", - "notifications_url": "https://api.github.com/repos/shentao/vue-multiselect/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/shentao/vue-multiselect/labels{/name}", - "releases_url": "https://api.github.com/repos/shentao/vue-multiselect/releases{/id}", - "deployments_url": "https://api.github.com/repos/shentao/vue-multiselect/deployments", - "created_at": "2016-04-23T13:02:33Z", - "updated_at": "2022-01-19T11:09:17Z", - "pushed_at": "2022-01-17T04:06:58Z", - "git_url": "git://github.com/shentao/vue-multiselect.git", - "ssh_url": "git@github.com:shentao/vue-multiselect.git", - "clone_url": "https://github.com/shentao/vue-multiselect.git", - "svn_url": "https://github.com/shentao/vue-multiselect", - "homepage": "https://vue-multiselect.js.org/", - "size": 13669, - "stargazers_count": 6021, - "watchers_count": 6021, - "language": "JavaScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": true, - "forks_count": 916, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 357, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "allow_forking": true, - "is_template": false, - "topics": ["component", "dropdown", "javascript", "select", "vue"], - "visibility": "public", - "forks": 916, - "open_issues": 357, - "watchers": 6021, - "default_branch": "master", - "permissions": { - "admin": false, - "maintain": false, - "push": false, - "triage": false, - "pull": true - }, - "score": 1 - }, - "color": "#29AE1D", - "data": { - "2022-02-17": { - "date": "2022-02-17", - "value": 6049 - }, - "2022-02-16": { - "date": "2022-02-16", - "value": 6047 - }, - "2022-02-15": { - "date": "2022-02-15", - "value": 6046 - }, - "2022-02-14": { - "date": "2022-02-14", - "value": 6043 - }, - "2022-02-13": { - "date": "2022-02-13", - "value": 6042 - }, - "2022-02-12": { - "date": "2022-02-12", - "value": 6042 - }, - "2022-02-11": { - "date": "2022-02-11", - "value": 6040 - }, - "2022-02-10": { - "date": "2022-02-10", - "value": 6037 - }, - "2022-02-09": { - "date": "2022-02-09", - "value": 6035 - }, - "2022-02-08": { - "date": "2022-02-08", - "value": 6034 - }, - "2022-02-07": { - "date": "2022-02-07", - "value": 6034 - }, - "2022-02-06": { - "date": "2022-02-06", - "value": 6034 - }, - "2022-02-05": { - "date": "2022-02-05", - "value": 6032 - }, - "2022-02-04": { - "date": "2022-02-04", - "value": 6032 - }, - "2022-02-03": { - "date": "2022-02-03", - "value": 6030 - }, - "2022-02-02": { - "date": "2022-02-02", - "value": 6029 - }, - "2022-02-01": { - "date": "2022-02-01", - "value": 6029 - }, - "2022-01-31": { - "date": "2022-01-31", - "value": 6028 - }, - "2022-01-30": { - "date": "2022-01-30", - "value": 6026 - }, - "2022-01-29": { - "date": "2022-01-29", - "value": 6026 - }, - "2022-01-28": { - "date": "2022-01-28", - "value": 6025 - }, - "2022-01-27": { - "date": "2022-01-27", - "value": 6024 - }, - "2022-01-26": { - "date": "2022-01-26", - "value": 6023 - }, - "2022-01-25": { - "date": "2022-01-25", - "value": 6022 - }, - "2022-01-24": { - "date": "2022-01-24", - "value": 6022 - }, - "2022-01-23": { - "date": "2022-01-23", - "value": 6020 - }, - "2022-01-22": { - "date": "2022-01-22", - "value": 6019 - }, - "2022-01-21": { - "date": "2022-01-21", - "value": 6015 - }, - "2022-01-20": { - "date": "2022-01-20", - "value": 6013 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 6011 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 6009 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 6008 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 6008 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 6004 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 6003 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 6001 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 6000 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 5998 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 5996 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 5996 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 5995 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 5992 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 5989 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 5988 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 5985 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 5984 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 5984 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 5984 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 5982 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 5981 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 5979 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 5978 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 5978 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 5978 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 5978 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 5977 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 5977 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 5973 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 5971 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 5971 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 5971 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 5971 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 5970 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 5967 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 5965 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 5963 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 5963 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 5962 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 5962 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 5960 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 5960 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 5959 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 5955 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 5951 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 5951 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 5950 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 5948 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 5948 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 5947 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 5947 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 5946 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 5945 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 5944 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 5941 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 5941 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 5936 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 5934 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 5933 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 5932 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 5932 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 5930 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 5925 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 5923 - } - } - } - ], - "last_updated_at": "2022-02-17", - "timeframe": { - "label": "Last three months", - "value": "last_three_months", - "date": "2021-11-17" - } - } - }, - { - "type": "latest-activities" - }, - { - "type": "integrations" - }, - { - "type": "newest-members" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-members" - }, - { - "type": "number-activities-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [3, 3], - "settings": { - "last_computed_at": "2022-01-20T17:18:35.921Z", - "start": "2022-01-13T00:00:00.000Z", - "end": "2022-01-20T00:00:00.000Z" - } - }, - { - "type": "number-members-graph" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "inactive-members" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "benchmark", - "settings": { - "repositories": [ - { - "id": 26390092, - "value": "deepstream.io", - "label": "deepstream.io", - "active": true, - "editing": false, - "githubRepo": { - "id": 26390092, - "node_id": "MDEwOlJlcG9zaXRvcnkyNjM5MDA5Mg==", - "name": "deepstream.io", - "full_name": "deepstreamIO/deepstream.io", - "private": false, - "owner": { - "login": "deepstreamIO", - "id": 9024218, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjkwMjQyMTg=", - "avatar_url": "https://avatars.githubusercontent.com/u/9024218?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/deepstreamIO", - "html_url": "https://github.com/deepstreamIO", - "followers_url": "https://api.github.com/users/deepstreamIO/followers", - "following_url": "https://api.github.com/users/deepstreamIO/following{/other_user}", - "gists_url": "https://api.github.com/users/deepstreamIO/gists{/gist_id}", - "starred_url": "https://api.github.com/users/deepstreamIO/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/deepstreamIO/subscriptions", - "organizations_url": "https://api.github.com/users/deepstreamIO/orgs", - "repos_url": "https://api.github.com/users/deepstreamIO/repos", - "events_url": "https://api.github.com/users/deepstreamIO/events{/privacy}", - "received_events_url": "https://api.github.com/users/deepstreamIO/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/deepstreamIO/deepstream.io", - "description": "deepstream.io server", - "fork": false, - "url": "https://api.github.com/repos/deepstreamIO/deepstream.io", - "forks_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/forks", - "keys_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/teams", - "hooks_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/hooks", - "issue_events_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/issues/events{/number}", - "events_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/events", - "assignees_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/assignees{/user}", - "branches_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/branches{/branch}", - "tags_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/tags", - "blobs_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/statuses/{sha}", - "languages_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/languages", - "stargazers_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/stargazers", - "contributors_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/contributors", - "subscribers_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/subscribers", - "subscription_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/subscription", - "commits_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/contents/{+path}", - "compare_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/merges", - "archive_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/downloads", - "issues_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/issues{/number}", - "pulls_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/pulls{/number}", - "milestones_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/milestones{/number}", - "notifications_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/labels{/name}", - "releases_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/releases{/id}", - "deployments_url": "https://api.github.com/repos/deepstreamIO/deepstream.io/deployments", - "created_at": "2014-11-09T08:30:01Z", - "updated_at": "2022-01-18T13:10:13Z", - "pushed_at": "2022-01-02T03:19:39Z", - "git_url": "git://github.com/deepstreamIO/deepstream.io.git", - "ssh_url": "git@github.com:deepstreamIO/deepstream.io.git", - "clone_url": "https://github.com/deepstreamIO/deepstream.io.git", - "svn_url": "https://github.com/deepstreamIO/deepstream.io", - "homepage": "http://deepstream.io/", - "size": 10866, - "stargazers_count": 6952, - "watchers_count": 6952, - "language": "TypeScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": false, - "forks_count": 399, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 6, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "authentication", - "datasync", - "deepstream", - "permissions", - "pubsub", - "realtime", - "rpc", - "typescript", - "websocket" - ], - "visibility": "public", - "forks": 399, - "open_issues": 6, - "watchers": 6952, - "default_branch": "master", - "score": 1 - }, - "data": { - "2022-01-20": { - "date": "2022-01-20", - "value": 6952 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 6952 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 6950 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 6950 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 6950 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 6950 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 6950 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 6950 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 6950 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 6949 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 6949 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 6949 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 6949 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 6949 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 6949 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 6948 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 6948 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 6948 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 6948 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 6948 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 6948 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 6948 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 6947 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 6946 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 6945 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 6943 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 6942 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 6941 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 6941 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 6940 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 6940 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 6940 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 6940 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 6940 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 6940 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 6940 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 6940 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 6939 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 6938 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 6938 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 6938 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 6937 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 6937 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 6936 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 6934 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 6934 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 6934 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 6934 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 6933 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 6933 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 6931 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 6930 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 6929 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 6929 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 6929 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 6929 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 6928 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 6928 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 6928 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 6928 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 6928 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 6926 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 6925 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 6925 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 6925 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 6924 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 6923 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 6923 - }, - "2021-11-13": { - "date": "2021-11-13", - "value": 6923 - }, - "2021-11-12": { - "date": "2021-11-12", - "value": 6923 - }, - "2021-11-11": { - "date": "2021-11-11", - "value": 6923 - }, - "2021-11-10": { - "date": "2021-11-10", - "value": 6923 - }, - "2021-11-09": { - "date": "2021-11-09", - "value": 6922 - }, - "2021-11-08": { - "date": "2021-11-08", - "value": 6922 - }, - "2021-11-07": { - "date": "2021-11-07", - "value": 6922 - }, - "2021-11-06": { - "date": "2021-11-06", - "value": 6922 - }, - "2021-11-05": { - "date": "2021-11-05", - "value": 6922 - }, - "2021-11-04": { - "date": "2021-11-04", - "value": 6920 - }, - "2021-11-03": { - "date": "2021-11-03", - "value": 6920 - }, - "2021-11-02": { - "date": "2021-11-02", - "value": 6920 - }, - "2021-11-01": { - "date": "2021-11-01", - "value": 6920 - }, - "2021-10-31": { - "date": "2021-10-31", - "value": 6919 - }, - "2021-10-30": { - "date": "2021-10-30", - "value": 6919 - }, - "2021-10-29": { - "date": "2021-10-29", - "value": 6916 - }, - "2021-10-28": { - "date": "2021-10-28", - "value": 6915 - }, - "2021-10-27": { - "date": "2021-10-27", - "value": 6914 - }, - "2021-10-26": { - "date": "2021-10-26", - "value": 6913 - }, - "2021-10-25": { - "date": "2021-10-25", - "value": 6913 - }, - "2021-10-24": { - "date": "2021-10-24", - "value": 6913 - }, - "2021-10-23": { - "date": "2021-10-23", - "value": 6913 - }, - "2021-10-22": { - "date": "2021-10-22", - "value": 6912 - }, - "2021-10-21": { - "date": "2021-10-21", - "value": 6912 - }, - "2021-10-20": { - "date": "2021-10-20", - "value": 6911 - } - }, - "color": "#F98181" - }, - { - "id": 337414495, - "value": "nhost", - "label": "nhost", - "active": true, - "editing": false, - "githubRepo": { - "id": 337414495, - "node_id": "MDEwOlJlcG9zaXRvcnkzMzc0MTQ0OTU=", - "name": "nhost", - "full_name": "nhost/nhost", - "private": false, - "owner": { - "login": "nhost", - "id": 48448799, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjQ4NDQ4Nzk5", - "avatar_url": "https://avatars.githubusercontent.com/u/48448799?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nhost", - "html_url": "https://github.com/nhost", - "followers_url": "https://api.github.com/users/nhost/followers", - "following_url": "https://api.github.com/users/nhost/following{/other_user}", - "gists_url": "https://api.github.com/users/nhost/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nhost/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nhost/subscriptions", - "organizations_url": "https://api.github.com/users/nhost/orgs", - "repos_url": "https://api.github.com/users/nhost/repos", - "events_url": "https://api.github.com/users/nhost/events{/privacy}", - "received_events_url": "https://api.github.com/users/nhost/received_events", - "type": "Organization", - "site_admin": false - }, - "html_url": "https://github.com/nhost/nhost", - "description": "Serverless backend for web and mobile apps.", - "fork": false, - "url": "https://api.github.com/repos/nhost/nhost", - "forks_url": "https://api.github.com/repos/nhost/nhost/forks", - "keys_url": "https://api.github.com/repos/nhost/nhost/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/nhost/nhost/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/nhost/nhost/teams", - "hooks_url": "https://api.github.com/repos/nhost/nhost/hooks", - "issue_events_url": "https://api.github.com/repos/nhost/nhost/issues/events{/number}", - "events_url": "https://api.github.com/repos/nhost/nhost/events", - "assignees_url": "https://api.github.com/repos/nhost/nhost/assignees{/user}", - "branches_url": "https://api.github.com/repos/nhost/nhost/branches{/branch}", - "tags_url": "https://api.github.com/repos/nhost/nhost/tags", - "blobs_url": "https://api.github.com/repos/nhost/nhost/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/nhost/nhost/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/nhost/nhost/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/nhost/nhost/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/nhost/nhost/statuses/{sha}", - "languages_url": "https://api.github.com/repos/nhost/nhost/languages", - "stargazers_url": "https://api.github.com/repos/nhost/nhost/stargazers", - "contributors_url": "https://api.github.com/repos/nhost/nhost/contributors", - "subscribers_url": "https://api.github.com/repos/nhost/nhost/subscribers", - "subscription_url": "https://api.github.com/repos/nhost/nhost/subscription", - "commits_url": "https://api.github.com/repos/nhost/nhost/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/nhost/nhost/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/nhost/nhost/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/nhost/nhost/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/nhost/nhost/contents/{+path}", - "compare_url": "https://api.github.com/repos/nhost/nhost/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/nhost/nhost/merges", - "archive_url": "https://api.github.com/repos/nhost/nhost/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/nhost/nhost/downloads", - "issues_url": "https://api.github.com/repos/nhost/nhost/issues{/number}", - "pulls_url": "https://api.github.com/repos/nhost/nhost/pulls{/number}", - "milestones_url": "https://api.github.com/repos/nhost/nhost/milestones{/number}", - "notifications_url": "https://api.github.com/repos/nhost/nhost/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/nhost/nhost/labels{/name}", - "releases_url": "https://api.github.com/repos/nhost/nhost/releases{/id}", - "deployments_url": "https://api.github.com/repos/nhost/nhost/deployments", - "created_at": "2021-02-09T13:33:34Z", - "updated_at": "2022-01-20T10:02:04Z", - "pushed_at": "2022-01-20T11:31:23Z", - "git_url": "git://github.com/nhost/nhost.git", - "ssh_url": "git@github.com:nhost/nhost.git", - "clone_url": "https://github.com/nhost/nhost.git", - "svn_url": "https://github.com/nhost/nhost", - "homepage": "https://nhost.io", - "size": 5433, - "stargazers_count": 1426, - "watchers_count": 1426, - "language": "TypeScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": false, - "forks_count": 72, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 27, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "allow_forking": true, - "is_template": false, - "topics": [ - "authentication", - "backend", - "database", - "flutter", - "graphql", - "hasura", - "postgres", - "serverless", - "serverless-functions", - "storage" - ], - "visibility": "public", - "forks": 72, - "open_issues": 27, - "watchers": 1426, - "default_branch": "main", - "score": 1 - }, - "data": { - "2022-01-20": { - "date": "2022-01-20", - "value": 1423 - }, - "2022-01-19": { - "date": "2022-01-19", - "value": 1418 - }, - "2022-01-18": { - "date": "2022-01-18", - "value": 1417 - }, - "2022-01-17": { - "date": "2022-01-17", - "value": 1413 - }, - "2022-01-16": { - "date": "2022-01-16", - "value": 1407 - }, - "2022-01-15": { - "date": "2022-01-15", - "value": 1407 - }, - "2022-01-14": { - "date": "2022-01-14", - "value": 1400 - }, - "2022-01-13": { - "date": "2022-01-13", - "value": 1399 - }, - "2022-01-12": { - "date": "2022-01-12", - "value": 1392 - }, - "2022-01-11": { - "date": "2022-01-11", - "value": 1391 - }, - "2022-01-10": { - "date": "2022-01-10", - "value": 1387 - }, - "2022-01-09": { - "date": "2022-01-09", - "value": 1382 - }, - "2022-01-08": { - "date": "2022-01-08", - "value": 1379 - }, - "2022-01-07": { - "date": "2022-01-07", - "value": 1375 - }, - "2022-01-06": { - "date": "2022-01-06", - "value": 1371 - }, - "2022-01-05": { - "date": "2022-01-05", - "value": 1369 - }, - "2022-01-04": { - "date": "2022-01-04", - "value": 1365 - }, - "2022-01-03": { - "date": "2022-01-03", - "value": 1362 - }, - "2022-01-02": { - "date": "2022-01-02", - "value": 1361 - }, - "2022-01-01": { - "date": "2022-01-01", - "value": 1361 - }, - "2021-12-31": { - "date": "2021-12-31", - "value": 1358 - }, - "2021-12-30": { - "date": "2021-12-30", - "value": 1358 - }, - "2021-12-29": { - "date": "2021-12-29", - "value": 1355 - }, - "2021-12-28": { - "date": "2021-12-28", - "value": 1355 - }, - "2021-12-27": { - "date": "2021-12-27", - "value": 1353 - }, - "2021-12-26": { - "date": "2021-12-26", - "value": 1350 - }, - "2021-12-25": { - "date": "2021-12-25", - "value": 1349 - }, - "2021-12-24": { - "date": "2021-12-24", - "value": 1348 - }, - "2021-12-23": { - "date": "2021-12-23", - "value": 1347 - }, - "2021-12-22": { - "date": "2021-12-22", - "value": 1346 - }, - "2021-12-21": { - "date": "2021-12-21", - "value": 1342 - }, - "2021-12-20": { - "date": "2021-12-20", - "value": 1341 - }, - "2021-12-19": { - "date": "2021-12-19", - "value": 1339 - }, - "2021-12-18": { - "date": "2021-12-18", - "value": 1336 - }, - "2021-12-17": { - "date": "2021-12-17", - "value": 1330 - }, - "2021-12-16": { - "date": "2021-12-16", - "value": 1326 - }, - "2021-12-15": { - "date": "2021-12-15", - "value": 1324 - }, - "2021-12-14": { - "date": "2021-12-14", - "value": 1322 - }, - "2021-12-13": { - "date": "2021-12-13", - "value": 1316 - }, - "2021-12-12": { - "date": "2021-12-12", - "value": 1315 - }, - "2021-12-11": { - "date": "2021-12-11", - "value": 1312 - }, - "2021-12-10": { - "date": "2021-12-10", - "value": 1307 - }, - "2021-12-09": { - "date": "2021-12-09", - "value": 1300 - }, - "2021-12-08": { - "date": "2021-12-08", - "value": 1297 - }, - "2021-12-07": { - "date": "2021-12-07", - "value": 1289 - }, - "2021-12-06": { - "date": "2021-12-06", - "value": 1285 - }, - "2021-12-05": { - "date": "2021-12-05", - "value": 1282 - }, - "2021-12-04": { - "date": "2021-12-04", - "value": 1279 - }, - "2021-12-03": { - "date": "2021-12-03", - "value": 1276 - }, - "2021-12-02": { - "date": "2021-12-02", - "value": 1273 - }, - "2021-12-01": { - "date": "2021-12-01", - "value": 1262 - }, - "2021-11-30": { - "date": "2021-11-30", - "value": 1254 - }, - "2021-11-29": { - "date": "2021-11-29", - "value": 1252 - }, - "2021-11-28": { - "date": "2021-11-28", - "value": 1248 - }, - "2021-11-27": { - "date": "2021-11-27", - "value": 1244 - }, - "2021-11-26": { - "date": "2021-11-26", - "value": 1239 - }, - "2021-11-25": { - "date": "2021-11-25", - "value": 1238 - }, - "2021-11-24": { - "date": "2021-11-24", - "value": 1235 - }, - "2021-11-23": { - "date": "2021-11-23", - "value": 1230 - }, - "2021-11-22": { - "date": "2021-11-22", - "value": 1229 - }, - "2021-11-21": { - "date": "2021-11-21", - "value": 1226 - }, - "2021-11-20": { - "date": "2021-11-20", - "value": 1222 - }, - "2021-11-19": { - "date": "2021-11-19", - "value": 1219 - }, - "2021-11-18": { - "date": "2021-11-18", - "value": 1216 - }, - "2021-11-17": { - "date": "2021-11-17", - "value": 1207 - }, - "2021-11-16": { - "date": "2021-11-16", - "value": 1200 - }, - "2021-11-15": { - "date": "2021-11-15", - "value": 1198 - }, - "2021-11-14": { - "date": "2021-11-14", - "value": 1195 - }, - "2021-11-13": { - "date": "2021-11-13", - "value": 1189 - }, - "2021-11-12": { - "date": "2021-11-12", - "value": 1187 - }, - "2021-11-11": { - "date": "2021-11-11", - "value": 1182 - }, - "2021-11-10": { - "date": "2021-11-10", - "value": 1169 - }, - "2021-11-09": { - "date": "2021-11-09", - "value": 1164 - }, - "2021-11-08": { - "date": "2021-11-08", - "value": 1149 - }, - "2021-11-07": { - "date": "2021-11-07", - "value": 1137 - }, - "2021-11-06": { - "date": "2021-11-06", - "value": 1128 - }, - "2021-11-05": { - "date": "2021-11-05", - "value": 1122 - }, - "2021-11-04": { - "date": "2021-11-04", - "value": 1111 - }, - "2021-11-03": { - "date": "2021-11-03", - "value": 1092 - }, - "2021-11-02": { - "date": "2021-11-02", - "value": 1075 - }, - "2021-11-01": { - "date": "2021-11-01", - "value": 1049 - }, - "2021-10-31": { - "date": "2021-10-31", - "value": 1014 - }, - "2021-10-30": { - "date": "2021-10-30", - "value": 1000 - }, - "2021-10-29": { - "date": "2021-10-29", - "value": 998 - }, - "2021-10-28": { - "date": "2021-10-28", - "value": 987 - }, - "2021-10-27": { - "date": "2021-10-27", - "value": 965 - }, - "2021-10-26": { - "date": "2021-10-26", - "value": 942 - }, - "2021-10-25": { - "date": "2021-10-25", - "value": 928 - }, - "2021-10-24": { - "date": "2021-10-24", - "value": 913 - }, - "2021-10-23": { - "date": "2021-10-23", - "value": 899 - }, - "2021-10-22": { - "date": "2021-10-22", - "value": 890 - }, - "2021-10-21": { - "date": "2021-10-21", - "value": 882 - }, - "2021-10-20": { - "date": "2021-10-20", - "value": 871 - } - }, - "color": "#15FF00" - } - ], - "last_updated_at": "2022-01-20", - "timeframe": { - "label": "Last three months", - "value": "last_three_months", - "date": "2021-10-20" - } - } - }, - { - "type": "builder" - }, - { - "type": "newest-members" - }, - { - "type": "channel-distribution" - }, - { - "type": "number-activities" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "inactive-members" - }, - { - "type": "builder" - }, - { - "type": "integrations" - }, - { - "type": "time-to-first-interaction-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-20T12:08:03.168Z", - "start": "2022-01-13T00:00:00.000Z", - "end": "2022-01-20T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "number-activities-graph" - }, - { - "type": "inactive-members-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "channel-distribution" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "latest-activities" - }, - { - "type": "inactive-members" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-25T16:47:57.727Z", - "start": "2022-01-18T00:00:00.000Z", - "end": "2022-01-25T00:00:00.000Z" - } - }, - { - "type": "benchmark" - }, - { - "type": "number-activities-graph" - }, - { - "type": "newest-members" - }, - { - "type": "number-activities" - }, - { - "type": "number-members" - }, - { - "type": "builder" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "number-members-graph" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-01-27T10:11:38.938Z", - "start": "2022-01-20T00:00:00.000Z", - "end": "2022-01-27T00:00:00.000Z" - } - }, - { - "type": "number-activities" - }, - { - "type": "builder" - }, - { - "type": "integrations" - }, - { - "type": "latest-activities" - }, - { - "type": "number-members-graph" - }, - { - "type": "number-members" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "inactive-members" - }, - { - "type": "number-activities-graph" - }, - { - "type": "latest-activities" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 1], - "settings": { - "last_computed_at": "2022-02-14T08:41:38.812Z", - "start": "2022-02-07T00:00:00.000Z", - "end": "2022-02-14T00:00:00.000Z" - } - }, - { - "type": "number-members" - }, - { - "type": "inactive-members" - }, - { - "type": "number-activities-graph" - }, - { - "type": "number-members-graph" - }, - { - "type": "builder" - }, - { - "type": "benchmark" - }, - { - "type": "newest-members" - }, - { - "type": "number-activities" - }, - { - "type": "integrations" - }, - { - "type": "number-members" - }, - { - "type": "inactive-members" - }, - { - "type": "latest-activities" - }, - { - "type": "number-activities-graph" - }, - { - "type": "benchmark" - }, - { - "type": "number-activities" - }, - { - "type": "newest-members" - }, - { - "type": "builder" - }, - { - "type": "time-to-first-interaction", - "cache": [0, 0], - "settings": { - "last_computed_at": "2022-02-15T23:21:35.145Z", - "start": "2022-02-09T00:00:00.000Z", - "end": "2022-02-16T00:00:00.000Z" - } - }, - { - "type": "number-members-graph" - }, - { - "type": "integrations" - } -] diff --git a/backend/src/database/models/member.ts b/backend/src/database/models/member.ts index dac8431473..09618faa39 100644 --- a/backend/src/database/models/member.ts +++ b/backend/src/database/models/member.ts @@ -109,12 +109,7 @@ export default (sequelize) => { through: 'memberSegments', timestamps: false, }) - - models.member.belongsToMany(models.note, { - as: 'notes', - through: 'memberNotes', - }) - + models.member.belongsToMany(models.task, { as: 'tasks', through: 'memberTasks', diff --git a/backend/src/database/models/note.ts b/backend/src/database/models/note.ts index e360f8e5a0..8738eebef7 100644 --- a/backend/src/database/models/note.ts +++ b/backend/src/database/models/note.ts @@ -29,12 +29,6 @@ export default (sequelize) => { ) note.associate = (models) => { - models.note.belongsToMany(models.member, { - as: 'members', - through: 'memberNotes', - foreignKey: 'noteId', - }) - models.note.belongsTo(models.tenant, { as: 'tenant', foreignKey: { diff --git a/backend/src/database/models/tenant.ts b/backend/src/database/models/tenant.ts index 2fa6188463..b43b857045 100644 --- a/backend/src/database/models/tenant.ts +++ b/backend/src/database/models/tenant.ts @@ -1,5 +1,3 @@ -import { TenantPlans } from '@crowd/types' - export default (sequelize, DataTypes) => { const tenant = sequelize.define( 'tenant', @@ -37,23 +35,6 @@ export default (sequelize, DataTypes) => { reasonForUsingCrowd: { type: DataTypes.STRING(50), }, - plan: { - type: DataTypes.STRING(255), - allowNull: false, - validate: { - notEmpty: true, - isIn: [ - [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - ], - }, - defaultValue: TenantPlans.Essential, - }, onboardedAt: { type: DataTypes.DATE, @@ -72,14 +53,6 @@ export default (sequelize, DataTypes) => { type: DataTypes.DATE, defaultValue: null, }, - stripeSubscriptionId: { - type: DataTypes.TEXT, - defaultValue: null, - }, - planSubscriptionEndsAt: { - type: DataTypes.DATE, - defaultValue: null, - }, }, { indexes: [ diff --git a/backend/src/database/repositories/IRepositoryOptions.ts b/backend/src/database/repositories/IRepositoryOptions.ts index ec4bef43d2..4e19f3dd38 100644 --- a/backend/src/database/repositories/IRepositoryOptions.ts +++ b/backend/src/database/repositories/IRepositoryOptions.ts @@ -1,5 +1,4 @@ import { DbConnection } from '@crowd/data-access-layer/src/database' -import { Unleash } from '@crowd/feature-flags' import { Logger } from '@crowd/logging' import { RedisClient } from '@crowd/redis' import { Client as TemporalClient } from '@crowd/temporal' @@ -17,7 +16,6 @@ export interface IRepositoryOptions { transaction?: any bypassPermissionValidation?: any opensearch?: any - unleash?: Unleash temporal: TemporalClient productDb: DbConnection } diff --git a/backend/src/database/repositories/__tests__/noteRepository.test.ts b/backend/src/database/repositories/__tests__/noteRepository.test.ts deleted file mode 100644 index ba48802790..0000000000 --- a/backend/src/database/repositories/__tests__/noteRepository.test.ts +++ /dev/null @@ -1,332 +0,0 @@ -import { Error404 } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import SequelizeTestUtils from '../../utils/sequelizeTestUtils' -import MemberRepository from '../memberRepository' -import NoteRepository from '../noteRepository' - -const db = null - -describe('NoteRepository tests', () => { - beforeEach(async () => { - await SequelizeTestUtils.wipeDatabase(db) - }) - - afterAll((done) => { - // Closing the DB connection allows Jest to exit successfully. - SequelizeTestUtils.closeConnection(db) - done() - }) - - describe('create method', () => { - it('Should create the given note succesfully', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note2add = { body: 'test-note' } - - const noteCreated = await NoteRepository.create(note2add, mockIRepositoryOptions) - - noteCreated.createdAt = noteCreated.createdAt.toISOString().split('T')[0] - noteCreated.updatedAt = noteCreated.updatedAt.toISOString().split('T')[0] - - const plainUser = mockIRepositoryOptions.currentUser.get({ plain: true }) - const expectedCreatedBy = { - id: plainUser.id, - fullName: plainUser.fullName, - avatarUrl: null, - } - - const expectedNoteCreated = { - id: noteCreated.id, - body: note2add.body, - members: [], - importHash: null, - createdAt: SequelizeTestUtils.getNowWithoutTime(), - updatedAt: SequelizeTestUtils.getNowWithoutTime(), - deletedAt: null, - tenantId: mockIRepositoryOptions.currentTenant.id, - createdBy: expectedCreatedBy, - createdById: mockIRepositoryOptions.currentUser.id, - updatedById: mockIRepositoryOptions.currentUser.id, - } - expect(noteCreated).toStrictEqual(expectedNoteCreated) - }) - - it('Should throw sequelize not null error -- body field is required', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note2add = {} - - await expect(() => NoteRepository.create(note2add, mockIRepositoryOptions)).rejects.toThrow() - }) - }) - - describe('findById method', () => { - it('Should successfully find created note by id', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note2add = { body: 'test-note' } - - const noteCreated = await NoteRepository.create(note2add, mockIRepositoryOptions) - - noteCreated.createdAt = noteCreated.createdAt.toISOString().split('T')[0] - noteCreated.updatedAt = noteCreated.updatedAt.toISOString().split('T')[0] - - const plainUser = mockIRepositoryOptions.currentUser.get({ plain: true }) - const expectedCreatedBy = { - id: plainUser.id, - fullName: plainUser.fullName, - avatarUrl: null, - } - - const expectedNoteFound = { - id: noteCreated.id, - body: note2add.body, - members: [], - importHash: null, - createdAt: SequelizeTestUtils.getNowWithoutTime(), - updatedAt: SequelizeTestUtils.getNowWithoutTime(), - deletedAt: null, - tenantId: mockIRepositoryOptions.currentTenant.id, - createdBy: expectedCreatedBy, - createdById: mockIRepositoryOptions.currentUser.id, - updatedById: mockIRepositoryOptions.currentUser.id, - } - const noteById = await NoteRepository.findById(noteCreated.id, mockIRepositoryOptions) - - noteById.createdAt = noteById.createdAt.toISOString().split('T')[0] - noteById.updatedAt = noteById.updatedAt.toISOString().split('T')[0] - - expect(noteById).toStrictEqual(expectedNoteFound) - }) - - it('Should throw 404 error when no note found with given id', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const { randomUUID } = require('crypto') - - await expect(() => - NoteRepository.findById(randomUUID(), mockIRepositoryOptions), - ).rejects.toThrowError(new Error404()) - }) - }) - - describe('filterIdsInTenant method', () => { - it('Should return the given ids of previously created note entities', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note1 = { body: 'test1' } - const note2 = { body: 'test2' } - - const note1Created = await NoteRepository.create(note1, mockIRepositoryOptions) - const note2Created = await NoteRepository.create(note2, mockIRepositoryOptions) - - const filterIdsReturned = await NoteRepository.filterIdsInTenant( - [note1Created.id, note2Created.id], - mockIRepositoryOptions, - ) - - expect(filterIdsReturned).toStrictEqual([note1Created.id, note2Created.id]) - }) - - it('Should only return the ids of previously created notes and filter random uuids out', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note = { body: 'test1' } - - const noteCreated = await NoteRepository.create(note, mockIRepositoryOptions) - - const { randomUUID } = require('crypto') - - const filterIdsReturned = await NoteRepository.filterIdsInTenant( - [noteCreated.id, randomUUID(), randomUUID()], - mockIRepositoryOptions, - ) - - expect(filterIdsReturned).toStrictEqual([noteCreated.id]) - }) - - it('Should return an empty array for an irrelevant tenant', async () => { - let mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note = { body: 'test' } - - const noteCreated = await NoteRepository.create(note, mockIRepositoryOptions) - - // create a new tenant and bind options to it - mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const filterIdsReturned = await NoteRepository.filterIdsInTenant( - [noteCreated.id], - mockIRepositoryOptions, - ) - - expect(filterIdsReturned).toStrictEqual([]) - }) - }) - - describe('findAndCountAll method', () => { - it.skip('Should find and count all notes, with various filters', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const member = await MemberRepository.create( - { - username: { - [PlatformType.GITHUB]: 'test', - }, - displayName: 'Member 1', - joinedAt: '2020-05-27T15:13:30Z', - }, - mockIRepositoryOptions, - ) - - const note1 = { body: 'test-note', members: [member.id] } - const note2 = { body: 'test-note-2', members: [member.id] } - const note3 = { body: 'another-note', members: [member.id] } - - const note1Created = await NoteRepository.create(note1, mockIRepositoryOptions) - await new Promise((resolve) => { - setTimeout(resolve, 50) - }) - - const note2Created = await NoteRepository.create(note2, mockIRepositoryOptions) - await new Promise((resolve) => { - setTimeout(resolve, 50) - }) - - const note3Created = await NoteRepository.create(note3, mockIRepositoryOptions) - - // Test filter by body - // Current findAndCountAll uses wildcarded like statement so it matches both notes - let notes = await NoteRepository.findAndCountAll( - { filter: { body: 'test-note' } }, - mockIRepositoryOptions, - ) - - expect(notes.count).toEqual(2) - expect(notes.rows).toStrictEqual([note2Created, note1Created]) - - // Test filter by id - notes = await NoteRepository.findAndCountAll( - { filter: { id: note1Created.id } }, - mockIRepositoryOptions, - ) - - expect(notes.count).toEqual(1) - expect(notes.rows).toStrictEqual([note1Created]) - - // Test filter by createdAt - find all between note1.createdAt and note3.createdAt - notes = await NoteRepository.findAndCountAll( - { - filter: { - createdAtRange: [note1Created.createdAt, note3Created.createdAt], - }, - }, - mockIRepositoryOptions, - ) - - expect(notes.count).toEqual(3) - expect(notes.rows).toStrictEqual([note3Created, note2Created, note1Created]) - - // Test filter by createdAt - find all where createdAt < note2.createdAt - notes = await NoteRepository.findAndCountAll( - { - filter: { - createdAtRange: [null, note2Created.createdAt], - }, - }, - mockIRepositoryOptions, - ) - expect(notes.count).toEqual(2) - expect(notes.rows).toStrictEqual([note2Created, note1Created]) - - // Test filter by createdAt - find all where createdAt < note1.createdAt - notes = await NoteRepository.findAndCountAll( - { - filter: { - createdAtRange: [null, note1Created.createdAt], - }, - }, - mockIRepositoryOptions, - ) - expect(notes.count).toEqual(1) - expect(notes.rows).toStrictEqual([note1Created]) - }) - }) - - describe('update method', () => { - it('Should succesfully update previously created note', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note1 = { body: 'test-note' } - - const noteCreated = await NoteRepository.create(note1, mockIRepositoryOptions) - - const noteUpdated = await NoteRepository.update( - noteCreated.id, - { body: 'updated-note-body' }, - mockIRepositoryOptions, - ) - - expect(noteUpdated.updatedAt.getTime()).toBeGreaterThan(noteUpdated.createdAt.getTime()) - - const plainUser = mockIRepositoryOptions.currentUser.get({ plain: true }) - const expectedCreatedBy = { - id: plainUser.id, - fullName: plainUser.fullName, - avatarUrl: null, - } - - const noteExpected = { - id: noteCreated.id, - body: noteUpdated.body, - importHash: null, - createdAt: noteCreated.createdAt, - updatedAt: noteUpdated.updatedAt, - deletedAt: null, - tenantId: mockIRepositoryOptions.currentTenant.id, - createdBy: expectedCreatedBy, - createdById: mockIRepositoryOptions.currentUser.id, - updatedById: mockIRepositoryOptions.currentUser.id, - members: [], - } - - expect(noteUpdated).toStrictEqual(noteExpected) - }) - - it('Should throw 404 error when trying to update non existent note', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const { randomUUID } = require('crypto') - - await expect(() => - NoteRepository.update(randomUUID(), { body: 'non-existent' }, mockIRepositoryOptions), - ).rejects.toThrowError(new Error404()) - }) - }) - - describe('destroy method', () => { - it('Should succesfully destroy previously created note', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const note = { body: 'test-note' } - - const returnedNote = await NoteRepository.create(note, mockIRepositoryOptions) - - await NoteRepository.destroy(returnedNote.id, mockIRepositoryOptions, true) - - // Try selecting it after destroy, should throw 404 - await expect(() => - NoteRepository.findById(returnedNote.id, mockIRepositoryOptions), - ).rejects.toThrowError(new Error404()) - }) - - it('Should throw 404 when trying to destroy a non existent note', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const { randomUUID } = require('crypto') - - await expect(() => - NoteRepository.destroy(randomUUID(), mockIRepositoryOptions), - ).rejects.toThrowError(new Error404()) - }) - }) -}) diff --git a/backend/src/database/repositories/__tests__/tenantRepository.test.ts b/backend/src/database/repositories/__tests__/tenantRepository.test.ts index 0bbdbddfc7..4e0f61cef6 100644 --- a/backend/src/database/repositories/__tests__/tenantRepository.test.ts +++ b/backend/src/database/repositories/__tests__/tenantRepository.test.ts @@ -1,6 +1,3 @@ -import { TenantPlans } from '@crowd/types' - -import Plans from '../../../security/plans' import SequelizeTestUtils from '../../utils/sequelizeTestUtils' import TenantRepository from '../tenantRepository' @@ -17,28 +14,6 @@ describe('TenantRepository tests', () => { done() }) - describe('getPayingTenantIds method', () => { - it('should return tenants not using the essential plan', async () => { - const ToCreatePLanForEssentialPlanTenantOnTrial = { - name: 'essential tenant name', - url: 'an-essential-tenant-name', - plan: TenantPlans.Essential, - } - const ToCreatPlanForGrowthTenantOnTrial = { - name: 'growth tenant name', - url: 'a-growth-tenant-name', - plan: TenantPlans.Growth, - } - const options = await SequelizeTestUtils.getTestIRepositoryOptions(db) - await options.database.tenant.create(ToCreatePLanForEssentialPlanTenantOnTrial) - const growthTenant = await options.database.tenant.create(ToCreatPlanForGrowthTenantOnTrial) - const tenantIds = await TenantRepository.getPayingTenantIds(options) - - expect(tenantIds).toHaveLength(1) - expect(growthTenant.id).toStrictEqual(tenantIds[0].id) - }) - }) - describe('generateTenantUrl method', () => { it('Should generate a url from name - 0 existing tenants with same url', async () => { const options = await SequelizeTestUtils.getTestIRepositoryOptions(db) @@ -58,7 +33,6 @@ describe('TenantRepository tests', () => { await options.database.tenant.create({ name: tenantName, url: 'a-tenant-name', - plan: TenantPlans.Essential, }) // now generate function should return 'a-tenant-name-1' because it already exists diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index 063e5b62a5..90e16c9d95 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -202,10 +202,6 @@ class MemberRepository { transaction, }) - await record.setNotes(data.notes || [], { - transaction, - }) - await record.setNoMerge(data.noMerge || [], { transaction, }) @@ -1011,12 +1007,6 @@ class MemberRepository { }) } - if (data.notes) { - await record.setNotes(data.notes || [], { - transaction, - }) - } - await MemberRepository.updateMemberOrganizations( record, data.organizations, @@ -2579,11 +2569,6 @@ class MemberRepository { joinTableAttributes: [], }) - if (exportMode) { - plainRecord.notes = await record.getNotes({ - joinTableAttributes: [], - }) - } return plainRecord }), ) @@ -2676,11 +2661,6 @@ class MemberRepository { joinTableAttributes: [], }) - output.notes = await record.getNotes({ - transaction, - joinTableAttributes: [], - }) - output.noMerge = ( await record.getNoMerge({ transaction, @@ -3105,44 +3085,6 @@ class MemberRepository { }) } - static async moveNotesBetweenMembers( - fromMemberId: string, - toMemberId: string, - options: IRepositoryOptions, - ): Promise { - const transaction = SequelizeRepository.getTransaction(options) - - const seq = SequelizeRepository.getSequelize(options) - - const params: any = { - fromMemberId, - toMemberId, - } - - const deleteQuery = ` - delete from "memberNotes" using "memberNotes" as mn2 - where "memberNotes"."memberId" = :fromMemberId - and "memberNotes"."noteId" = mn2."noteId" - and mn2."memberId" = :toMemberId; - ` - - await seq.query(deleteQuery, { - replacements: params, - type: QueryTypes.DELETE, - transaction, - }) - - const updateQuery = ` - update "memberNotes" set "memberId" = :toMemberId where "memberId" = :fromMemberId; - ` - - await seq.query(updateQuery, { - replacements: params, - type: QueryTypes.UPDATE, - transaction, - }) - } - static async moveTasksBetweenMembers( fromMemberId: string, toMemberId: string, diff --git a/backend/src/database/repositories/noteRepository.ts b/backend/src/database/repositories/noteRepository.ts deleted file mode 100644 index b5b6fa194b..0000000000 --- a/backend/src/database/repositories/noteRepository.ts +++ /dev/null @@ -1,380 +0,0 @@ -import lodash from 'lodash' -import sanitizeHtml from 'sanitize-html' -import Sequelize from 'sequelize' - -import { Error404 } from '@crowd/common' - -import SequelizeFilterUtils from '../utils/sequelizeFilterUtils' - -import { IRepositoryOptions } from './IRepositoryOptions' -import AuditLogRepository from './auditLogRepository' -import QueryParser from './filters/queryParser' -import { QueryOutput } from './filters/queryTypes' -import SequelizeRepository from './sequelizeRepository' -import UserRepository from './userRepository' - -const { Op } = Sequelize - -class NoteRepository { - static async create(data, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const tenant = SequelizeRepository.getCurrentTenant(options) - - const transaction = SequelizeRepository.getTransaction(options) - - if (data.body) { - data.body = sanitizeHtml(data.body).trim() - } - - const record = await options.database.note.create( - { - ...lodash.pick(data, ['body', 'importHash']), - - tenantId: tenant.id, - createdById: currentUser.id, - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - await record.setMembers(data.members || [], { - transaction, - }) - - await this._createAuditLog(AuditLogRepository.CREATE, record, data, options) - - return this.findById(record.id, options) - } - - static async update(id, data, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const transaction = SequelizeRepository.getTransaction(options) - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - let record = await options.database.note.findOne({ - where: { - id, - tenantId: currentTenant.id, - }, - transaction, - }) - - if (!record) { - throw new Error404() - } - - if (data.body) { - data.body = sanitizeHtml(data.body).trim() - } - - record = await record.update( - { - ...lodash.pick(data, ['body', 'importHash']), - - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - await record.setMembers(data.members || [], { - transaction, - }) - - await this._createAuditLog(AuditLogRepository.UPDATE, record, data, options) - - return this.findById(record.id, options) - } - - static async destroy(id, options: IRepositoryOptions, force = false) { - const transaction = SequelizeRepository.getTransaction(options) - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const record = await options.database.note.findOne({ - where: { - id, - tenantId: currentTenant.id, - }, - transaction, - }) - - if (!record) { - throw new Error404() - } - - await record.destroy({ - transaction, - force, - }) - - await this._createAuditLog(AuditLogRepository.DELETE, record, record, options) - } - - static async findById(id, options: IRepositoryOptions) { - const transaction = SequelizeRepository.getTransaction(options) - - const include = [] - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const record = await options.database.note.findOne({ - where: { - id, - tenantId: currentTenant.id, - }, - include, - transaction, - }) - - if (!record) { - throw new Error404() - } - - return this._populateRelations(record, options) - } - - static async filterIdInTenant(id, options: IRepositoryOptions) { - return lodash.get(await this.filterIdsInTenant([id], options), '[0]', null) - } - - static async filterIdsInTenant(ids, options: IRepositoryOptions) { - if (!ids || !ids.length) { - return [] - } - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const where = { - id: { - [Op.in]: ids, - }, - tenantId: currentTenant.id, - } - - const records = await options.database.note.findAll({ - attributes: ['id'], - where, - }) - - return records.map((record) => record.id) - } - - static async count(filter, options: IRepositoryOptions) { - const transaction = SequelizeRepository.getTransaction(options) - - const tenant = SequelizeRepository.getCurrentTenant(options) - - return options.database.note.count({ - where: { - ...filter, - tenantId: tenant.id, - }, - transaction, - }) - } - - static async findAndCountAll( - { filter = {} as any, advancedFilter = null as any, limit = 0, offset = 0, orderBy = '' }, - options: IRepositoryOptions, - ) { - const tenant = SequelizeRepository.getCurrentTenant(options) - - const whereAnd: Array = [] - const include = [ - { - model: options.database.member, - as: 'members', - include: [ - { - model: options.database.segment, - as: 'segments', - where: { - id: SequelizeRepository.getSegmentIds(options), - }, - }, - ], - }, - ] - - whereAnd.push({ - tenantId: tenant.id, - }) - - if (!advancedFilter) { - advancedFilter = { and: [] } - if (filter.id) { - advancedFilter.and.push({ - id: filter.id, - }) - } - - if (filter.body) { - advancedFilter.and.push({ - body: { - textContains: filter.body, - }, - }) - } - - if (filter.members) { - advancedFilter.and.push({ - members: filter.members, - }) - } - - if (filter.createdAtRange) { - const [start, end] = filter.createdAtRange - - if (start !== undefined && start !== null && start !== '') { - advancedFilter.and.push({ - createdAt: { - gte: start, - }, - }) - } - - if (end !== undefined && end !== null && end !== '') { - advancedFilter.and.push({ - createdAt: { - lte: end, - }, - }) - } - } - } - - const parser = new QueryParser( - { - manyToMany: { - members: { - table: 'notes', - model: 'note', - relationTable: { - name: 'memberNotes', - from: 'noteId', - to: 'memberId', - }, - }, - }, - withSegments: false, - }, - options, - ) - const parsed: QueryOutput = parser.parse({ - filter: advancedFilter, - orderBy: orderBy || ['createdAt_DESC'], - limit, - offset, - }) - - let { - rows, - count, // eslint-disable-line prefer-const - } = await options.database.note.findAndCountAll({ - ...(parsed.where ? { where: parsed.where } : {}), - ...(parsed.having ? { having: parsed.having } : {}), - order: parsed.order, - limit: parsed.limit, - offset: parsed.offset, - include, - transaction: SequelizeRepository.getTransaction(options), - }) - - rows = await this._populateRelationsForRows(rows, options) - - return { rows, count, limit: parsed.limit, offset: parsed.offset } - } - - static async findAllAutocomplete(query, limit, options: IRepositoryOptions) { - const tenant = SequelizeRepository.getCurrentTenant(options) - - const whereAnd: Array = [ - { - tenantId: tenant.id, - }, - ] - - if (query) { - whereAnd.push({ - [Op.or]: [ - { id: SequelizeFilterUtils.uuid(query) }, - { - [Op.and]: SequelizeFilterUtils.ilikeIncludes('note', 'body', query), - }, - ], - }) - } - - const where = { [Op.and]: whereAnd } - - const records = await options.database.note.findAll({ - attributes: ['id', 'body'], - where, - limit: limit ? Number(limit) : undefined, - order: [['body', 'ASC']], - }) - - return records.map((record) => ({ - id: record.id, - label: record.body, - })) - } - - static async _createAuditLog(action, record, data, options: IRepositoryOptions) { - let values = {} - - if (data) { - values = { - ...record.get({ plain: true }), - memberIds: data.members, - } - } - - await AuditLogRepository.log( - { - entityName: 'note', - entityId: record.id, - action, - values, - }, - options, - ) - } - - static async _populateRelationsForRows(rows, options: IRepositoryOptions) { - if (!rows) { - return rows - } - - return Promise.all(rows.map((record) => this._populateRelations(record, options))) - } - - static async _populateRelations(record, options: IRepositoryOptions) { - if (!record) { - return record - } - - const output = record.get({ plain: true }) - - const transaction = SequelizeRepository.getTransaction(options) - - output.members = await record.getMembers({ - transaction, - joinTableAttributes: [], - }) - - const user = await UserRepository.findById(record.createdById, options) - output.createdBy = { id: user.id, fullName: user.fullName, avatarUrl: null } - - return output - } -} - -export default NoteRepository diff --git a/backend/src/database/repositories/sequelizeRepository.ts b/backend/src/database/repositories/sequelizeRepository.ts index 409fda7be8..44ea3acaec 100644 --- a/backend/src/database/repositories/sequelizeRepository.ts +++ b/backend/src/database/repositories/sequelizeRepository.ts @@ -1,29 +1,26 @@ import lodash from 'lodash' import { Sequelize, UniqueConstraintError } from 'sequelize' -import { Error400, SERVICE } from '@crowd/common' +import { Error400 } from '@crowd/common' import { DbConnection, getDbConnection } from '@crowd/data-access-layer/src/database' import { QueryExecutor, SequelizeQueryExecutor, TransactionalSequelizeQueryExecutor, } from '@crowd/data-access-layer/src/queryExecutor' -import { Unleash, getUnleashClient } from '@crowd/feature-flags' import { getServiceLogger } from '@crowd/logging' import { getOpensearchClient } from '@crowd/opensearch' import { getClientSQL } from '@crowd/questdb' import { getRedisClient } from '@crowd/redis' import { Client as TemporalClient, getTemporalClient } from '@crowd/temporal' -import { Edition, SegmentData } from '@crowd/types' +import { SegmentData } from '@crowd/types' import { - API_CONFIG, IS_TEST_ENV, OPENSEARCH_CONFIG, PRODUCT_DB_CONFIG, REDIS_CONFIG, TEMPORAL_CONFIG, - UNLEASH_CONFIG, } from '../../conf' import { IServiceOptions } from '../../services/IServiceOptions' import { databaseInit } from '../databaseConnection' @@ -51,16 +48,6 @@ export default class SequelizeRepository { tenant?, segments?, ): Promise { - let unleash: Unleash | undefined - - if (UNLEASH_CONFIG.url && API_CONFIG.edition === Edition.CROWD_HOSTED) { - unleash = await getUnleashClient({ - url: UNLEASH_CONFIG.url, - apiKey: UNLEASH_CONFIG.backendApiKey, - appName: SERVICE, - }) - } - let temporal: TemporalClient | undefined if (TEMPORAL_CONFIG.serverUrl) { temporal = await getTemporalClient(TEMPORAL_CONFIG) @@ -84,7 +71,6 @@ export default class SequelizeRepository { bypassPermissionValidation: true, language: 'en', redis: await getRedisClient(REDIS_CONFIG, true), - unleash, temporal, productDb, qdb, diff --git a/backend/src/database/repositories/tenantRepository.ts b/backend/src/database/repositories/tenantRepository.ts index 1a56aee325..542eba0bd2 100644 --- a/backend/src/database/repositories/tenantRepository.ts +++ b/backend/src/database/repositories/tenantRepository.ts @@ -2,9 +2,7 @@ import lodash from 'lodash' import Sequelize, { QueryTypes } from 'sequelize' import { Error400, Error404, getCleanString } from '@crowd/common' -import { Edition, TenantPlans } from '@crowd/types' -import { API_CONFIG } from '../../conf' import SequelizeFilterUtils from '../utils/sequelizeFilterUtils' import { isUserInTenant } from '../utils/userTenantUtils' @@ -17,26 +15,6 @@ const { Op } = Sequelize const forbiddenTenantUrls = ['www'] class TenantRepository { - static async getPayingTenantIds(options: IRepositoryOptions): Promise<({ id: string } & {})[]> { - const database = SequelizeRepository.getSequelize(options) - const transaction = SequelizeRepository.getTransaction(options) - - const query = ` - SELECT "id" - FROM "tenants" - WHERE tenants."plan" IN (:growth) - OR (tenants."isTrialPlan" is true AND tenants."plan" = :growth) - ; - ` - return database.query(query, { - type: QueryTypes.SELECT, - transaction, - replacements: { - growth: TenantPlans.Growth, - }, - }) - } - static async create(data, options: IRepositoryOptions) { const currentUser = SequelizeRepository.getCurrentUser(options) @@ -71,7 +49,6 @@ class TenantRepository { 'integrationsRequired', 'importHash', ]), - plan: API_CONFIG.edition === Edition.LFX ? TenantPlans.Enterprise : TenantPlans.Essential, createdById: currentUser.id, updatedById: currentUser.id, }, @@ -187,60 +164,6 @@ class TenantRepository { return this.findById(record.id, options) } - static async updatePlanUser(id, planStripeCustomerId, planUserId, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const transaction = SequelizeRepository.getTransaction(options) - - let record = await options.database.tenant.findByPk(id, { - transaction, - }) - - const data = { - planStripeCustomerId, - planUserId, - updatedById: currentUser.id, - } - - record = await record.update(data, { - transaction, - }) - - await this._createAuditLog(AuditLogRepository.UPDATE, record, data, options) - - return this.findById(record.id, options) - } - - static async updatePlanStatus( - planStripeCustomerId, - plan, - planStatus, - options: IRepositoryOptions, - ) { - const transaction = SequelizeRepository.getTransaction(options) - - let record = await options.database.tenant.findOne({ - where: { - planStripeCustomerId, - }, - transaction, - }) - - const data = { - plan, - planStatus, - updatedById: null, - } - - record = await record.update(data, { - transaction, - }) - - await this._createAuditLog(AuditLogRepository.UPDATE, record, data, options) - - return this.findById(record.id, options) - } - static async destroy(id, options: IRepositoryOptions) { const transaction = SequelizeRepository.getTransaction(options) diff --git a/backend/src/database/utils/sequelizeTestUtils.ts b/backend/src/database/utils/sequelizeTestUtils.ts index 96de0c2326..7c26097629 100644 --- a/backend/src/database/utils/sequelizeTestUtils.ts +++ b/backend/src/database/utils/sequelizeTestUtils.ts @@ -8,7 +8,7 @@ import { getServiceLogger } from '@crowd/logging' import { getClientSQL } from '@crowd/questdb' import { getRedisClient } from '@crowd/redis' import { getTemporalClient } from '@crowd/temporal' -import { SegmentStatus, TenantPlans } from '@crowd/types' +import { SegmentStatus } from '@crowd/types' import { API_CONFIG, PRODUCT_DB_CONFIG, REDIS_CONFIG, TEMPORAL_CONFIG } from '../../conf' import Roles from '../../security/roles' @@ -36,8 +36,6 @@ export default class SequelizeTestUtils { '"activities"', '"files"', '"memberNoMerge"', - '"memberNotes"', - '"notes"', '"memberTags"', '"memberTasks"', '"microservices"', @@ -97,7 +95,6 @@ export default class SequelizeTestUtils { static async getTestIServiceOptions( db, - plan: TenantPlans = TenantPlans.Essential, tenantName?, tenantUrl?, ) { @@ -105,8 +102,8 @@ export default class SequelizeTestUtils { const randomTenant = tenantName && tenantUrl - ? this.getTenant(tenantName, tenantUrl, plan) - : this.getRandomTestTenant(plan) + ? this.getTenant(tenantName, tenantUrl) + : this.getRandomTestTenant() const randomUser = await this.getRandomUser() @@ -235,15 +232,14 @@ export default class SequelizeTestUtils { } as IRepositoryOptions } - static getRandomTestTenant(plan = TenantPlans.Essential) { - return this.getTenant(this.getRandomString('test-tenant'), this.getRandomString('url#'), plan) + static getRandomTestTenant() { + return this.getTenant(this.getRandomString('test-tenant'), this.getRandomString('url#')) } - static getTenant(name, url, plan = TenantPlans.Essential) { + static getTenant(name, url) { return { name, url, - plan, } } diff --git a/backend/src/documentation/openapi.json b/backend/src/documentation/openapi.json deleted file mode 100644 index 2cfcf5bbdb..0000000000 --- a/backend/src/documentation/openapi.json +++ /dev/null @@ -1,5455 +0,0 @@ -{ - "openapi": "3.0.3", - "info": { - "title": "crowd.dev API", - "version": "1.0.5", - "description": "crowd.dev API\n", - "contact": { "email": "joan@crowd.dev" }, - "license": { "name": "Apache 2.0", "url": "http://www.apache.org/licenses/LICENSE-2.0.html" }, - "x-github": "https://github.com/crowdHQ" - }, - "servers": [{ "url": "https://app.crowd.dev/api" }], - "paths": { - "/tenant/{tenantId}/activity/with-member": { - "post": { - "summary": "Create or update an activity with a member", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Create or update an activity with a member\nActivity existence is checked by sourceId and tenantId\nMember existence is checked by platform and username", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityUpsertWithMemberInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity": { - "post": { - "summary": "Create or update an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Create or update an activity. Existence is checked by sourceId and tenantId", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity/{id}": { - "delete": { - "summary": "Delete an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Delete a activity given an ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Find a single activity by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityResponse" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an activity", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Update an activity given an ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the activity", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Activity" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/activity/query": { - "post": { - "summary": "Query activities", - "tags": ["Activities"], - "security": [{ "Bearer": [] }], - "description": "Query activities. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ActivityQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ActivityList" }, - "examples": { "Activity": { "$ref": "#/components/examples/ActivityList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation": { - "post": { - "summary": "Create an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Create a new automation for the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationCreateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List automations", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get all existing automation data for tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[type]", - "in": "query", - "description": "Filter by type of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[trigger]", - "in": "query", - "description": "Filter by trigger type of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[state]", - "in": "query", - "description": "Filter by state of automation", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationPage" }, - "examples": { "AutomationPage": { "$ref": "#/components/examples/AutomationPage" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation/{automationId}": { - "delete": { - "summary": "Destroy an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Destroys an existing automation in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to update", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "204": { "description": "Ok - No content" }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get an existing automation data in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to find", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an automation", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Updates an existing automation in the tenant.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Automation ID that you want to update", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationUpdateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Automation" }, - "examples": { "Automation": { "$ref": "#/components/examples/Automation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/automation/{automationId}/executions": { - "get": { - "summary": "Get automation history", - "tags": ["Automations"], - "security": [{ "Bearer": [] }], - "description": "Get all automation execution history for tenant and automation", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "automationId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "How many elements from the beginning would you like to skip", - "required": false, - "schema": { "type": "integer", "default": 0 } - }, - { - "name": "limit", - "in": "query", - "description": "How many elements would you like to fetch", - "required": false, - "schema": { "type": "integer", "default": 10 } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/AutomationExecutionPage" }, - "examples": { - "AutomationExecutionPage": { - "$ref": "#/components/examples/AutomationExecutionPage" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/conversation": { - "post": { - "summary": "Create a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Create a conversation.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ConversationNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List conversations", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Get a list of conversations with filtering, sorting and offsetting.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[title]", - "in": "query", - "description": "Filter by the title of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[slug]", - "in": "query", - "description": "Filter by the slug of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[published]", - "in": "query", - "description": "Filter by whether it is published or not.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[platform]", - "in": "query", - "description": "Filter by the platform of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[channel]", - "in": "query", - "description": "Filter by the channel of the conversation.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activitiesCountRange]", - "in": "query", - "description": "activitiesCount lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "Send this parameter twice with [min] and [max].", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default timestamp_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/ConversationSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/ConversationList" }, - "examples": { - "Conversations": { "$ref": "#/components/examples/ConversationList" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/conversation/{id}": { - "delete": { - "summary": "Delete a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Delete a conversation.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Find a conversation by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID.", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation.", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an conversation", - "tags": ["Conversations"], - "security": [{ "Bearer": [] }], - "description": "Update a conversation given an ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the conversation", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/ConversationNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Conversation" }, - "examples": { "Conversation": { "$ref": "#/components/examples/Conversation" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/active": { - "get": { - "summary": "List active members", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "List active members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[platforms]", - "in": "query", - "description": "Filter by activity platforms (comma separated list without spaces)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[isTeamMember]", - "in": "query", - "description": "If true we will return just team members, if false we will return just non-team members, if undefined we will return both.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[isBot]", - "in": "query", - "description": "If true we will return just members who are bots, if false we will return just non-bot members, if undefined we will return both.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activityTimestampFrom]", - "in": "query", - "description": "Filter by activity timestamp from (required)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[activityTimestampTo]", - "in": "query", - "description": "Filter by activity timestamp to (required)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "How to sort results. Available values: activityCount_DESC, activityCount_ASC, activeDaysCount_DESC, activeDaysCount_ASC (default activityCount_DESC)", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 20.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member": { - "post": { - "summary": "Create or update a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Create or update a member. Existence is checked by platform and username.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Member" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/{id}": { - "delete": { - "summary": "Delete a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Delete a member given an ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Find a single member by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberResponse" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberFind" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update a member", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Update a member", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberUpsertInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Member" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberUpsert" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/export": { - "post": { - "summary": "Export members as CSV", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Export members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberQuery" } } - } - }, - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/member/query": { - "post": { - "summary": "Query members", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Query members. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/MemberQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberList" }, - "examples": { "Member": { "$ref": "#/components/examples/MemberList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note": { - "post": { - "summary": "Create a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Create a note", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Note" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note/{id}": { - "delete": { - "summary": "Delete a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Delete a note.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Find a note by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID.", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note.", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/NoteResponse" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update a note", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Update a note", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the note", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Note" }, - "examples": { "Note": { "$ref": "#/components/examples/Note" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/note/query": { - "post": { - "summary": "Query notes", - "tags": ["Notes"], - "security": [{ "Bearer": [] }], - "description": "Query notes. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/NoteQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/NoteList" }, - "examples": { "Note": { "$ref": "#/components/examples/NoteList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization": { - "post": { - "summary": "Create a organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Create a organization", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Organization" }, - "examples": { - "Organization": { "$ref": "#/components/examples/OrganizationCreate" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization/{id}": { - "delete": { - "summary": "Delete a organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Delete a organization.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find an organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Find an organization by ID.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/OrganizationResponse" }, - "examples": { "Organization": { "$ref": "#/components/examples/Organization" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an organization", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Update a organization", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the organization", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Organization" }, - "examples": { - "Organization": { "$ref": "#/components/examples/OrganizationCreate" } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/organization/query": { - "post": { - "summary": "Query organizations", - "tags": ["Organizations"], - "security": [{ "Bearer": [] }], - "description": "Query organizations. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/OrganizationQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/OrganizationList" }, - "examples": { "Organization": { "$ref": "#/components/examples/OrganizationList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/members/attributes": { - "post": { - "summary": "Attribute settings: create", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Create a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsCreateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "delete": { - "summary": "Attribute settings: delete", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Delete a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "query", - "description": "Id to destroy", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Attributes settings: list", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Get a list of members' attribute settings", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[label]", - "in": "query", - "description": "Filter by label of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[name]", - "in": "query", - "description": "Filter by name of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[type]", - "in": "query", - "description": "Filter by type of member attribute settings", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[canDelete]", - "in": "query", - "description": "Filter by canDelete: \"true\" or \"false\"", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[show]", - "in": "query", - "description": "Filter by show: \"true\" or \"false\"", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "CreatedAt lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default createdAt_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsList" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettingsList" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/settings/members/attributes/{id}": { - "get": { - "summary": "Attributes settings: find", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Find a single members' attribute setting by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member attribute's settings", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Attribute settings: update", - "tags": ["Members"], - "security": [{ "Bearer": [] }], - "description": "Update a members' attribute setting", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the member attribute settings", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettingsUpdateInput" } - } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/MemberAttributeSettings" }, - "examples": { - "MemberAttributeSettings": { - "$ref": "#/components/examples/MemberAttributeSettings" - } - } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/tag": { - "post": { - "summary": "Create a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Create a tag", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TagNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "List tags", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Get a list of tags with filtering, sorting and offsetting.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "filter[name]", - "in": "query", - "description": "Filter by the name of the tag.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "filter[createdAtRange]", - "in": "query", - "description": "Created at lower bound. If you want a range, send this parameter twice with [min] and [max]. If you send it once it will be interpreted as a lower bound.", - "required": false, - "schema": { "type": "string" } - }, - { - "name": "orderBy", - "in": "query", - "description": "Sort the results. Default timestamp_DESC.", - "required": false, - "schema": { "$ref": "#/components/schemas/TagSort" } - }, - { - "name": "offset", - "in": "query", - "description": "Skip the first n results. Default 0.", - "required": false, - "schema": { "type": "number" } - }, - { - "name": "limit", - "in": "query", - "description": "Limit the number of results. Default 50.", - "required": false, - "schema": { "type": "number" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TagList" }, - "examples": { "Tags": { "$ref": "#/components/examples/TagList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/tag/{id}": { - "delete": { - "summary": "Delete a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Delete a tag.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Find a tag by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an tag", - "tags": ["Tags"], - "security": [{ "Bearer": [] }], - "description": "Update a tag", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the tag", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TagNoId" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Tag" }, - "examples": { "Tag": { "$ref": "#/components/examples/Tag" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/batch": { - "post": { - "summary": "Make batch operations on tasks", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Make batch operations on tasks", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskBatchInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskFindAndUpdateAll" }, - "examples": { "Task": { "$ref": "#/components/examples/TaskFindAndUpdateAll" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task": { - "post": { - "summary": "Create a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Create a task", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Task" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/{id}": { - "delete": { - "summary": "Delete a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Delete a task.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { "description": "Ok" }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "get": { - "summary": "Find a task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Find a task by ID", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskResponse" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - }, - "put": { - "summary": "Update an task", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Update a task", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "id", - "in": "path", - "description": "The ID of the task", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskInput" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Task" }, - "examples": { "Task": { "$ref": "#/components/examples/Task" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - }, - "/tenant/{tenantId}/task/query": { - "post": { - "summary": "Query tasks", - "tags": ["Tasks"], - "security": [{ "Bearer": [] }], - "description": "Query tasks. It accepts filters, sorting options and pagination.", - "parameters": [ - { - "name": "tenantId", - "in": "path", - "description": "Your workspace/tenant ID", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/TaskQuery" } } - } - }, - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TaskList" }, - "examples": { "Task": { "$ref": "#/components/examples/TaskList" } } - } - } - }, - "401": { "description": "Unauthorized" }, - "404": { "description": "Not found" }, - "429": { "description": "Too many requests" } - } - } - } - }, - "components": { - "securitySchemes": { "Bearer": { "type": "http", "scheme": "bearer" } }, - "schemas": { - "MemberType": { "type": "string", "enum": ["member"] }, - "MemberScore": { "type": "integer", "minimum": -1, "maximum": 10 }, - "MemberSort": { - "type": "string", - "enum": [ - "activitiesCount_ASC", - "activitiesCount_DESC", - "score_ASC", - "score_ASC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC" - ] - }, - "ActivitySort": { - "type": "string", - "enum": [ - "timestamp_DESC", - "timestamp_ASC", - "createdAt_DESC", - "createdAt_ASC", - "score_DESC", - "score_ASC", - "type_DESC", - "type_ASC", - "platform_DESC", - "platform_ASC", - "createdBy_DESC", - "createdBy_ASC" - ] - }, - "ConversationSort": { - "type": "string", - "enum": [ - "createdAt_DESC", - "createdAt_ASC", - "activityCount_DESC", - "activityCount_ASC", - "platform_DESC", - "platform_ASC", - "channel_DESC", - "channel_ASC", - "createdBy_DESC", - "createdBy_ASC" - ] - }, - "TagSort": { - "type": "string", - "enum": ["name_ASC", "name_DESC", "createdAt_DESC", "createdAt_ASC"] - }, - "MemberAttributeSettingsSort": { - "type": "string", - "enum": [ - "label_ASC", - "label_DESC", - "type_ASC", - "type_DESC", - "createdAt_DESC", - "createdAt_ASC" - ] - }, - "ActivityRelationsInput": { - "description": "Relations of an activity.", - "type": "object", - "properties": { - "tasks": { - "description": "Tasks associated with the activity", - "type": "array", - "items": { "$ref": "#/components/schemas/TaskNoId" } - } - } - }, - "ActivityUpsertInput": { - "required": ["memberId"], - "description": "An activity performed by a member of your community. The member is sent as an ID.", - "allOf": [ - { "$ref": "#/components/schemas/ActivityNoId" }, - { "$ref": "#/components/schemas/ActivityRelationsInput" } - ], - "properties": { - "memberId": { "description": "The ID of the member that performed the activity" } - } - }, - "ActivityUpsertWithMemberInput": { - "type": "object", - "description": "An activity performed by a member of your community. The member is sent as a whole object.", - "allOf": [ - { "$ref": "#/components/schemas/ActivityNoId" }, - { "$ref": "#/components/schemas/ActivityRelationsInput" } - ], - "properties": { "member": { "$ref": "#/components/schemas/MemberNoId" } } - }, - "ActivityNoId": { - "description": "An activity performed by a member of your community.", - "type": "object", - "required": ["type", "platform", "timestamp", "sourceId"], - "properties": { - "type": { "description": "Type of activity", "type": "string" }, - "timestamp": { - "description": "Date and time when the activity took place", - "type": "string", - "format": "date-time" - }, - "platform": { - "description": "Platform on which the activity took place", - "type": "string" - }, - "title": { "description": "Title of the activity", "type": "string" }, - "body": { "description": "Body of the activity", "type": "string" }, - "channel": { "description": "Channel of the activity", "type": "string" }, - "sentiment": { - "description": "Sentiment of the activity", - "type": "object", - "properties": { - "sentiment": { - "description": "Default sentiment score.
Computed by mapping (positive - negative) from 0 to 100", - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "label": { - "description": "Sentiment label", - "type": "string", - "enum": ["positive", "negative", "neutral", "mixed"] - }, - "positive": { - "description": "Positive sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "negative": { - "description": "Negative sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "neutral": { - "description": "Neutral sentiment score", - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "mixed": { - "description": "Mixed sentiment score. Mixed contains both positive and negative sentiments", - "type": "number", - "minimum": 0, - "maximum": 1 - } - } - }, - "sourceId": { - "description": "The id of the activity in the platform (e.g. the id of the message in Discord)", - "type": "string" - }, - "sourceParentId": { - "description": "The id of the parent activity in the platform (e.g. the id of the parent message in Discord)", - "type": "string" - }, - "parentId": { - "description": "Id of the parent activity, if the activity has a parent", - "type": "string", - "format": "uuid" - }, - "score": { "description": "Score associated with the activity", "type": "number" }, - "isContribution": { - "description": "Whether the activity was a contribution", - "type": "boolean" - }, - "attributes": { - "description": "Extra attributes of the activity", - "type": "object", - "additionalProperties": true - }, - "createdAt": { - "description": "Date the activity was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the activity was last updated", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "ActivityNoId" } - }, - "FilterType": { - "type": "object", - "additionalProperties": { - "oneOf": [{ "type": "string" }, { "$ref": "#/components/schemas/FilterType" }] - } - }, - "ActivityQuery": { - "description": "All the parameters you can use to query activitys.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "activitiesCount_DESC", - "score_ASC", - "score_ASC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Activity": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/ActivityNoId" }], - "properties": { "id": { "description": "The unique identifier for an activity." } } - }, - "ActivityRelationsResponse": { - "description": "Relations of an activity.", - "type": "object", - "properties": { - "member": { - "description": "Member that performed the activity", - "$ref": "#/components/schemas/Member" - }, - "tasks": { - "description": "Tasks associated with the activity.", - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - } - } - }, - "ActivityResponse": { - "description": "An activity performed by a member.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Activity" }, - { "$ref": "#/components/schemas/ActivityRelationsResponse" } - ] - }, - "ActivityList": { - "description": "List and count of activities.", - "type": "object", - "properties": { - "rows": { - "description": "List of activities", - "type": "array", - "items": { "$ref": "#/components/schemas/ActivityResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "ActivitiesList" } - }, - "AutomationCreateInput": { - "type": "object", - "description": "Data to create a new automation.", - "required": ["type", "trigger", "settings"], - "properties": { - "type": { "$ref": "#/components/schemas/AutomationType" }, - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" } - } - }, - "AutomationUpdateInput": { - "type": "object", - "description": "Data to update an existing automation.", - "required": ["trigger", "settings", "state"], - "properties": { - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" }, - "state": { "$ref": "#/components/schemas/AutomationState" } - } - }, - "AutomationType": { "description": "Automation type", "type": "string", "enum": ["webhook"] }, - "AutomationState": { - "description": "Automation state", - "type": "string", - "enum": ["active", "disabled"] - }, - "AutomationTrigger": { - "description": "What will trigger an automation", - "type": "string", - "enum": ["new_activity", "new_member"] - }, - "AutomationExecutionState": { - "description": "What was the state of the automation execution", - "type": "string", - "enum": ["success", "error"] - }, - "WebhookAutomationSettings": { - "description": "Settings used by automation with type webhook", - "type": "object", - "required": ["url"], - "properties": { - "url": { "description": "URL to POST webhook data to", "type": "string", "format": "uri" } - } - }, - "NewActivityAutomationSettings": { - "description": "Settings used by automation that is triggered by new activities", - "type": "object", - "required": ["types", "platforms", "keywords", "teamMemberActivities"], - "properties": { - "types": { - "description": "If activity type matches any of these we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "platforms": { - "description": "If activity came from any of these platforms we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "keywords": { - "description": "If activity content contains any of these keywords we should trigger this automation", - "type": "array", - "items": { "type": "string" } - }, - "teamMemberActivities": { - "description": "If activity came from any of our team members - should we trigger automation or not?", - "type": "boolean" - } - } - }, - "AutomationSettings": { - "description": "Settings based on automation type and trigger - you need to provide union object of both automation type based settings and trigger based settings", - "type": "object", - "anyOf": [ - { "$ref": "#/components/schemas/WebhookAutomationSettings" }, - { "$ref": "#/components/schemas/NewActivityAutomationSettings" } - ] - }, - "Automation": { - "type": "object", - "required": ["id", "type", "tenantId", "trigger", "settings", "state", "createdAt"], - "properties": { - "id": { "description": "Automation unique ID", "type": "string", "format": "uuid" }, - "type": { "$ref": "#/components/schemas/AutomationType" }, - "tenantId": { - "description": "Automation tenant unique ID", - "type": "string", - "format": "uuid" - }, - "trigger": { "$ref": "#/components/schemas/AutomationTrigger" }, - "settings": { "$ref": "#/components/schemas/AutomationSettings" }, - "state": { "$ref": "#/components/schemas/AutomationState" }, - "createdAt": { - "description": "When was automation created", - "type": "string", - "format": "date-time" - }, - "lastExecutionAt": { - "description": "When was automation last executed", - "type": "string", - "format": "date-time" - }, - "lastExecutionState": { - "description": "State of the last automation execution", - "$ref": "#/components/schemas/AutomationExecutionState" - }, - "lastExecutionError": { - "description": "Error information if last automation execution failed", - "type": "object" - } - } - }, - "AutomationPage": { - "type": "object", - "required": ["rows", "count", "offset", "limit"], - "properties": { - "rows": { - "description": "Array of automations that were fetched", - "type": "array", - "items": { "$ref": "#/components/schemas/Automation" } - }, - "count": { "description": "How many total automations there are", "type": "integer" }, - "offset": { - "description": "What offset was used when preparing this response", - "type": "integer" - }, - "limit": { - "description": "What limit was used when preparing this response", - "type": "integer" - } - } - }, - "AutomationExecution": { - "type": "object", - "required": ["id", "automationId", "state", "executedAt", "eventId", "payload"], - "properties": { - "id": { - "description": "Automation execution unique ID", - "type": "string", - "format": "uuid" - }, - "automationId": { - "description": "Automation unique ID", - "type": "string", - "format": "uuid" - }, - "state": { - "description": "Automation execution state", - "$ref": "#/components/schemas/AutomationExecutionState" - }, - "error": { - "description": "If execution was not successful this object will contain error information", - "type": "object" - }, - "executedAt": { - "description": "Automation execution timestamp", - "type": "string", - "format": "date-time" - }, - "eventId": { - "description": "Unique ID of the event that triggered this automation execution.", - "type": "string" - }, - "payload": { - "description": "Payload that was sent when this execution was processed", - "type": "object" - } - } - }, - "AutomationExecutionPage": { - "type": "object", - "required": ["rows", "count", "offset", "limit"], - "properties": { - "rows": { - "description": "Automation Execution List", - "type": "array", - "items": { "$ref": "#/components/schemas/AutomationExecution" } - }, - "count": { "description": "How many items are there in total", "type": "integer" }, - "offset": { - "description": "What offset was used when preparing this response", - "type": "integer" - }, - "limit": { - "description": "What limit was used when preparing this response", - "type": "integer" - } - } - }, - "ConversationNoId": { - "type": "object", - "required": ["platform", "slug", "tenantId"], - "description": "A conversation is a group of activities. Some attributes, like slug, are mostly used in public pages.", - "properties": { - "title": { "description": "Title of the conversation", "type": "string" }, - "slug": { "description": "Unique slug of the conversation", "type": "string" }, - "published": { - "description": "Whether the conversation is publicaly visible from open pages.", - "type": "boolean", - "default": false - }, - "conversationStarter": { - "description": "The conversation starter activity", - "type": "object", - "additionalProperties": { "$ref": "#/components/schemas/Activity" } - }, - "memberCount": { - "description": "Number of participating members in the conversation.", - "type": "integer" - }, - "lastActive": { - "description": "Last activity time in the conversation", - "type": "string", - "format": "date-time" - }, - "createdAt": { - "description": "Date the conversation was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the conversation was last updated", - "type": "string", - "format": "date-time" - }, - "tenantId": { - "description": "Your workspace/tenant id", - "type": "string", - "format": "uuid" - } - }, - "xml": { "name": "Conversation" } - }, - "Conversation": { - "allOf": [{ "$ref": "#/components/schemas/ConversationNoId" }], - "properties": { - "id": { "description": "Unique identifier of the conversation", "type": "string" }, - "activities": { - "description": "List of IDs of the activities in the conversation", - "type": "array", - "items": { "type": "string" } - } - } - }, - "ConversationList": { - "type": "object", - "properties": { - "rows": { "type": "array", "items": { "$ref": "#/components/schemas/Conversation" } }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - } - }, - "MemberPlatformHelper": { - "type": "object", - "required": ["platform"], - "properties": { - "platform": { - "type": "string", - "description": "Platform for which to check member existence." - } - } - }, - "MemberOrganizations": { - "type": "object", - "properties": { - "organizations": { - "description": "Organizations associated with the member. Each element in the array is the name of the organization, or an organization object. If the organization does not exist, it will be created.", - "type": "array", - "items": { "$ref": "#/components/schemas/OrganizationNoId" } - } - } - }, - "MemberInputRelations": { - "type": "object", - "properties": { - "tags": { - "description": "Tags associated with the member. Each element in the array is the ID of the tag.", - "type": "array", - "items": { "type": "string" } - }, - "tasks": { - "description": "Tasks associated with the member. Each element in the array is the ID of the task.", - "type": "array", - "items": { "type": "string" } - }, - "notes": { - "description": "Notes associated with the member. Each element in the array is the ID of the note.", - "type": "array", - "items": { "type": "string" } - }, - "activities": { - "description": "Activities associated with the member. Each element in the array is the ID of the activity.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "MemberUpsertInput": { - "allOf": [ - { "$ref": "#/components/schemas/MemberPlatformHelper" }, - { "$ref": "#/components/schemas/MemberNoId" }, - { "$ref": "#/components/schemas/MemberOrganizations" }, - { "$ref": "#/components/schemas/MemberInputRelations" } - ] - }, - "MemberNoId": { - "description": "A member of your community.", - "type": "object", - "required": ["username"], - "properties": { - "username": { - "description": "Usernames of the member in each platform. Exactly one for each platform in which the member is active.
Example: ```{ github: 'iamgilfoyle', discord: 'gilfoyle '}```", - "type": "object", - "additionalProperties": true - }, - "displayName": { "description": "UI friendly name of the member", "type": "string" }, - "email": { "description": "Email address of the member", "type": "string" }, - "joinedAt": { - "description": "Date of joining the community", - "type": "string", - "format": "date-time" - }, - "activeOn": { - "description": "List of platforms the member is active on.", - "type": "array", - "items": { "type": "string" } - }, - "identities": { - "description": "List of platforms the member has identities in.", - "type": "array", - "items": { "type": "string" } - }, - "activityCount": { "description": "Number of activities member has.", "type": "integer" }, - "averageSentiment": { - "description": "Averge sentiment of member's activities.", - "type": "number" - }, - "numberOfOpenSourceContributions": { - "description": "Number of open source contributions by the member.", - "type": "integer" - }, - "lastActivity": { - "description": "The last activity of a member", - "type": "object", - "additionalProperties": { "$ref": "#/components/schemas/Activity" } - }, - "score": { - "description": "Engagement score of the member. From 0 to 10. Set -1 for not yet calculated.", - "type": "number" - }, - "reach": { - "description": "Reach of the member in each platform. At most one for each platform in which the member is active.
Example: ```{ github: 10, twitter: 250, total: 260 }```", - "type": "object", - "properties": { - "total": { "description": "Sum of all the platform reaches.", "type": "number" } - }, - "additionalProperties": true - }, - "attributes": { - "description": "Attributes associated to the member. Each attribute must be an object with it's value for each platform, and a default.
For example: ```{\"location\": {\"github\": \"San Francisco\", \"twitter\": \"California\", \"default\": \"San Francisco\"}}```", - "type": "object", - "additionalProperties": { "$ref": "#/components/schemas/MemberAttribute" } - }, - "createdAt": { - "description": "Date the member was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the member was last updated", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Member" } - }, - "MemberAttribute": { - "description": "A key for each platform.
- ```default``` is the value that will be displayed by default in the app
- ```custom``` is the value that will be displayed if the user has set a custom value for the attribute", - "type": "object", - "properties": { - "default": { - "description": "Default value for the attribute. This is set automatically according to crowd.dev rules.", - "type": "string" - }, - "custom": { - "description": "Custom value for the attribute. This is optionally set by the user. It will always be picked as the default when sent.", - "type": "string" - } - }, - "additionalProperties": true - }, - "MemberQuery": { - "description": "All the parameters you can use to query members.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "activityCount_ASC", - "activityCount_DESC", - "score_ASC", - "score_DESC", - "joinedAt_ASC", - "joinedAt_DESC", - "createdAt_ASC", - "createdAt_DESC", - "organisation_ASC", - "organisation_DESC", - "location_ASC", - "location_DESC", - "numberOfOpenSourceContributions_ASC", - "numberOfOpenSourceContributions_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Member": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/MemberNoId" }], - "properties": { - "id": { "description": "The unique identifier for a member of your community." }, - "activityCount": { - "description": "Number of activities performed by the member.", - "type": "integer" - }, - "lastActivity": { - "description": "Timestamp, type and platform of the last activity performed by the member.", - "type": "object", - "properties": { - "type": { "description": "Type of the last activity", "type": "string" }, - "timestamp": { - "description": "Date and time of the last activity", - "type": "string", - "format": "date-time" - }, - "platform": { "description": "Platform of the last activity", "type": "string" } - } - }, - "averageSentiment": { - "description": "Average sentiment of the member. From 0 to 100.", - "type": "number" - }, - "numberOfOpenSourceContributions": { - "description": "Number of open source contributions by the member.", - "type": "integer" - } - } - }, - "MemberRelationsResponse": { - "description": "Relations of a member.", - "type": "object", - "properties": { - "tags": { - "description": "Tags associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Tag" } - }, - "notes": { - "description": "Notes associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Note" } - }, - "tasks": { - "description": "Tasks associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - }, - "organizations": { - "description": "Organizations associated with the member.", - "type": "array", - "items": { "$ref": "#/components/schemas/Organization" } - } - } - }, - "MemberResponse": { - "description": "A member of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Member" }, - { "$ref": "#/components/schemas/MemberRelationsResponse" } - ] - }, - "MemberList": { - "description": "List and count of members.", - "type": "object", - "properties": { - "rows": { - "description": "List of members", - "type": "array", - "items": { "$ref": "#/components/schemas/MemberResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "MembersList" } - }, - "NoteInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the note. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string" } - } - } - }, - "NoteInput": { - "allOf": [ - { "$ref": "#/components/schemas/NoteNoId" }, - { "$ref": "#/components/schemas/NoteInputRelations" } - ] - }, - "NoteNoId": { - "description": "A created note.", - "type": "object", - "properties": { - "body": { "description": "The body of the note.", "type": "string", "format": "blob" }, - "createdAt": { - "description": "Date the note was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the note was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Note" } - }, - "NoteQuery": { - "description": "All the parameters you can use to query notes.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { "type": "string", "enum": ["createdAt_ASC", "createdAt_DESC"] }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Note": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/NoteNoId" }], - "properties": { - "id": { "description": "The ID of the note." }, - "body": { "description": "The body of the note.", "type": "string", "format": "blob" } - } - }, - "NoteRelationsResponse": { - "description": "Relations of a note.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the note.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - } - } - }, - "NoteResponse": { - "description": "A note of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Note" }, - { "$ref": "#/components/schemas/NoteRelationsResponse" } - ] - }, - "NoteList": { - "description": "List and count of notes.", - "type": "object", - "properties": { - "rows": { - "description": "List of notes", - "type": "array", - "items": { "$ref": "#/components/schemas/NoteResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "NotesList" } - }, - "OrganizationInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the organization. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - } - } - }, - "OrganizationInput": { - "allOf": [ - { "$ref": "#/components/schemas/OrganizationNoId" }, - { "$ref": "#/components/schemas/OrganizationInputRelations" } - ] - }, - "OrganizationNoId": { - "description": "A created organization.", - "type": "object", - "required": ["name"], - "properties": { - "name": { "description": "The name of the organization.", "type": "string" }, - "url": { "description": "The URL of the organization.", "type": "string" }, - "description": { - "description": "A short description of the organization.", - "type": "string", - "format": "blob" - }, - "logo": { "description": "A URL for logo of the organization.", "type": "string" }, - "emails": { - "description": "The emails for contacting the organization.", - "type": "array", - "items": { "type": "string" } - }, - "phoneNumbers": { - "description": "The phone numbers for contacting for the organization.", - "type": "array", - "items": { "type": "string" } - }, - "tags": { - "description": "Tags associated with the organization.", - "type": "array", - "items": { "type": "string" } - }, - "twitter": { - "description": "Twitter information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The Twitter handle for the organization.", - "type": "string" - }, - "id": { "description": "The Twitter ID for the organization.", "type": "string" }, - "bio": { "description": "The Twitter bio for the organization.", "type": "string" }, - "followers": { - "description": "The number of followers on Twitter.", - "type": "integer" - }, - "location": { - "description": "The Twitter location for the organization.", - "type": "string" - }, - "site": { - "description": "The website linked to the organization's Twitter profile.", - "type": "string" - }, - "avatar": { - "description": "The URL for the organization's Twitter avatar.", - "type": "string" - } - } - }, - "employees": { - "description": "The number of employees of the organization.", - "type": "integer" - }, - "revenueRange": { - "description": "The estimated revenue range of the organization.", - "type": "object", - "properties": { - "min": { - "description": "The minimum estimated revenue of the organization.", - "type": "integer" - }, - "max": { - "description": "The maximum estimated revenue of the organization.", - "type": "integer" - } - } - }, - "linkedin": { - "description": "LinkedIn information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The LinkedIn handle for the organization.", - "type": "string" - } - } - }, - "crunchbase": { - "description": "Crunchbase information for the organization.", - "type": "object", - "properties": { - "handle": { - "description": "The Crunchbase handle for the organization.", - "type": "string" - } - } - }, - "activeOn": { - "description": "List of platforms the organization members are active on.", - "type": "array", - "items": { "type": "string" } - }, - "identities": { - "description": "List of platforms the organization members have identities in.", - "type": "array", - "items": { "type": "string" } - }, - "memberCount": { - "description": "Number of members organization has.", - "type": "integer" - }, - "createdAt": { - "description": "Date the organization was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the organization was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Organization" } - }, - "OrganizationQuery": { - "description": "All the parameters you can use to query organizations.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { - "type": "string", - "enum": [ - "createdAt_ASC", - "createdAt_DESC", - "memberCount_ASC", - "memberCount_DESC", - "activityCount_ASC", - "activityCount_DESC", - "joinedAt_ASC", - "joinedAt_DESC", - "lastActive_ASC", - "lastActive_DESC" - ] - }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Organization": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/OrganizationNoId" }], - "properties": { - "id": { "description": "The ID of the organization." }, - "body": { - "description": "The body of the organization.", - "type": "string", - "format": "blob" - } - } - }, - "OrganizationRelationsResponse": { - "description": "Relations of a organization.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the organization.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - }, - "activeOn": { - "description": "The platforms where the organization is active.", - "type": "array", - "items": { "type": "string" } - }, - "identities": { - "description": "The list of identities of the members in the organization.", - "type": "array", - "items": { "type": "string" } - }, - "lastActive": { - "description": "The last time the organization was active.", - "type": "string", - "format": "date-time" - }, - "joinedAt": { - "description": "The date the first member from the organization joined the community.", - "type": "string", - "format": "date-time" - } - } - }, - "OrganizationResponse": { - "description": "A organization of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Organization" }, - { "$ref": "#/components/schemas/OrganizationRelationsResponse" } - ] - }, - "OrganizationList": { - "description": "List and count of organizations.", - "type": "object", - "properties": { - "rows": { - "description": "List of organizations", - "type": "array", - "items": { "$ref": "#/components/schemas/OrganizationResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "OrganizationsList" } - }, - "TagNoId": { - "description": "A tag associated with a member.", - "type": "object", - "required": ["name", "tenantId"], - "properties": { - "name": { "description": "The name of the tag", "type": "string" }, - "createdAt": { - "description": "Date the tag was created", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the tag was last updated", - "type": "string", - "format": "date-time" - }, - "tenantId": { - "description": "Your workspace/tenant id", - "type": "string", - "format": "uuid" - } - }, - "xml": { "name": "Tag" } - }, - "Tag": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/TagNoId" }], - "properties": { "id": { "description": "The unique identifier for a tag." } } - }, - "TagList": { - "description": "List and count of tags.", - "type": "object", - "properties": { - "rows": { - "description": "List of tags", - "type": "array", - "items": { "$ref": "#/components/schemas/Tag" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "TagsList" } - }, - "TaskInputRelations": { - "type": "object", - "properties": { - "members": { - "description": "Members associated with the task. Each element in the array is the ID of the member.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - }, - "activities": { - "description": "Activities associated with the task. Each element in the array is the ID of the activity.", - "type": "array", - "items": { "type": "string", "format": "uuid" } - }, - "assignees": { - "description": "Users assigned with the task. Each element in the array is the ID of the user.", - "type": "string", - "format": "uuid", - "default": null - } - } - }, - "TaskInput": { - "allOf": [ - { "$ref": "#/components/schemas/TaskNoId" }, - { "$ref": "#/components/schemas/TaskInputRelations" } - ] - }, - "TaskBatchInput": { - "type": "object", - "properties": { - "operation": { - "description": "Batch operation name.", - "type": "string", - "enum": ["findAndUpdateAll"] - }, - "payload": { - "type": "object", - "description": "Payload to send to the batch operation", - "properties": { - "filter": { - "description": "Filter to select the task entities. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "update": { - "description": "key value object with desired updated fields.", - "type": "object" - } - } - } - } - }, - "TaskNoId": { - "description": "A created task.", - "type": "object", - "properties": { - "name": { "description": "The name of the task.", "type": "string" }, - "body": { "description": "The body of the task.", "type": "string", "format": "blob" }, - "status": { - "description": "The status of the task.", - "type": "string", - "enum": ["in-progress", "done"], - "default": null - }, - "createdAt": { - "description": "Date the task was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the task was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "Task" } - }, - "TaskQuery": { - "description": "All the parameters you can use to query tasks.", - "properties": { - "filter": { - "description": "Filter. Please refer to filter docs.", - "type": "string", - "format": "blob" - }, - "orderBy": { "type": "string", "enum": ["createdAt_ASC", "createdAt_DESC"] }, - "limit": { - "description": "Limit the number of records returned. Default is 10.", - "type": "integer", - "minimum": 1, - "maximum": 200, - "default": 10 - }, - "offset": { - "description": "Offset the number of records returned. Default is 0.", - "type": "integer", - "minimum": 0, - "default": 0 - } - } - }, - "Task": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/TaskNoId" }], - "properties": { - "id": { "description": "The ID of the task." }, - "body": { "description": "The body of the task.", "type": "string", "format": "blob" } - } - }, - "TaskRelationsResponse": { - "description": "Relations of a task.", - "type": "object", - "properties": { - "members": { - "description": "Members associated with the task.", - "type": "array", - "items": { "$ref": "#/components/schemas/Member" } - }, - "activities": { - "description": "Activities associated with the task.", - "type": "array", - "items": { "$ref": "#/components/schemas/Activity" } - }, - "assignedTo": { - "description": "The workspace member assigned to the task.", - "$ref": "#/components/schemas/Member" - } - } - }, - "TaskResponse": { - "description": "A task of your community.", - "type": "object", - "allOf": [ - { "$ref": "#/components/schemas/Task" }, - { "$ref": "#/components/schemas/TaskRelationsResponse" } - ] - }, - "TaskList": { - "description": "List and count of tasks.", - "type": "object", - "properties": { - "rows": { - "description": "List of tasks", - "type": "array", - "items": { "$ref": "#/components/schemas/TaskResponse" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "TasksList" } - }, - "TaskFindAndUpdateAll": { - "description": "Returns number of tasks updated", - "type": "object", - "properties": { - "rowsUpdated": { "description": "Number of tasks updated", "type": "integer" } - } - }, - "MemberAttributeSettingsCreateInput": { - "description": "A member attribute.", - "allOf": [{ "$ref": "#/components/schemas/MemberAttributeSettingsNoId" }] - }, - "MemberAttributeSettingsUpdateInput": { - "description": "A member attribute.", - "properties": { - "label": { - "description": "Human-friendly name of the attribute. Label is unique in workspaces.", - "type": "string" - }, - "show": { - "description": "Whether to show the member attribute in the web app or not.", - "type": "boolean", - "default": true - } - } - }, - "MemberAttributeSettingsNoId": { - "type": "object", - "required": ["label", "type"], - "description": "A member attribute that can be created dynamically.", - "properties": { - "label": { - "description": "Human-friendly name of the attribute. Label is unique in workspaces.", - "type": "string" - }, - "name": { - "description": "Camel-case code friendly name of the attribute. If ommited, name will be generated from the label. Name is unique in workspaces.", - "type": "string" - }, - "type": { - "description": "Type of the attribute's value", - "type": "string", - "enum": ["boolean", "number", "email", "string", "url", "date"] - }, - "canDelete": { - "description": "If set to false, member attribute can not be deleted in future requests.", - "type": "boolean", - "default": false - }, - "show": { - "description": "Whether to show the member attribute in the web app or not.", - "type": "boolean", - "default": true - }, - "createdAt": { - "description": "Date the member attribute was created.", - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "description": "Date the member attribute was last updated.", - "type": "string", - "format": "date-time" - } - }, - "xml": { "name": "MemberAttributeSettings" } - }, - "MemberAttributeSettings": { - "type": "object", - "allOf": [{ "$ref": "#/components/schemas/MemberAttributeSettingsNoId" }], - "properties": { "id": { "description": "The attribute settings ID." } } - }, - "MemberAttributeSettingsList": { - "description": "List and count member attribute settings.", - "type": "object", - "properties": { - "rows": { - "description": "List of member attribute settings", - "type": "array", - "items": { "$ref": "#/components/schemas/MemberAttributeSettings" } - }, - "count": { "description": "Count", "type": "integer" }, - "limit": { "description": "Limit of records returned", "type": "integer" }, - "offset": { "description": "Offset, for pagination", "type": "integer" } - }, - "xml": { "name": "MemberAttributeSettingsList" } - } - }, - "examples": { - "ActivityUpsert": { - "value": { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": null, - "tasks": [] - } - }, - "ActivityFind": { - "value": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:20:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have fewer bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-03T15:30:55.679Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": null, - "tasks": [] - } - }, - "ActivityFind2": { - "value": { - "id": "73aa13b7-1ef9-4987-a273-e560edff94ca", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_2", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "I will never underestimate my talents again.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 14.308956265449524, - "neutral": 14.437079429626465, - "negative": 9.826807677745819, - "positive": 61.42715811729431, - "sentiment": 86 - }, - "importHash": null, - "createdAt": "2022-10-03T15:38:05.847Z", - "updatedAt": "2022-10-03T15:46:34.610Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-03T15:30:55.679Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have less bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "importHash": null, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "tasks": [] - } - }, - "ActivityFind3": { - "value": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "parent": { - "id": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "type": "pull_request-closed", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 10, - "sourceId": "gh_1", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Last one to finish the code sprint! But I will have less bugs than Gilfoyle.", - "title": "Code sprint over!", - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 0.7594161201268435, - "neutral": 39.13898766040802, - "negative": 12.336093187332153, - "positive": 47.76550233364105, - "sentiment": 79 - }, - "importHash": null, - "createdAt": "2022-10-03T15:36:43.775Z", - "updatedAt": "2022-10-03T15:39:38.199Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "tasks": [] - } - }, - "ActivityList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/ActivityFind" }, - { "$ref": "#/components/examples/ActivityFind2" }, - { "$ref": "#/components/examples/ActivityFind3" } - ], - "count": 3, - "limit": 10, - "offset": 0 - } - }, - "Automation": { - "value": { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "type": "webhook", - "tenantId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "trigger": "new_activity", - "settings": { "url": "https://webhook.url/new_activities" }, - "createdAt": "2022-03-29T09:22:31.989Z" - } - }, - "AutomationPage": { - "value": { - "count": 1, - "offset": 0, - "limit": 10, - "rows": [ - { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "type": "webhook", - "tenantId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "trigger": "new_activity", - "settings": { "url": "https://webhook.url/new_activities" }, - "createdAt": "2022-03-29T09:22:31.989Z" - } - ] - } - }, - "AutomationExecutionPage": { - "value": { - "count": 1, - "offset": 0, - "limit": 10, - "rows": [ - { - "id": "b3297f3b-6924-4e92-80e7-ef2e0d87a120", - "automationId": "a3297f3b-6924-4e92-80e7-ef2e0d87a120", - "state": "success", - "executedAt": "2022-03-29T09:22:31.989Z", - "eventId": "a3297f3b-6924-4e92-80e7-ef2e0d87a121", - "payload": [ - { - "id": "a3297f3b-6924-4e92-80e7-ef2e0d87a121", - "type": "comment", - "timestamp": "2022-03-29T09:22:31.989Z", - "platform": "twitter" - } - ] - } - ] - } - }, - "Conversation": { - "value": { - "id": "24bdea79-3125-4950-bb38-07fa4a555012", - "title": "Best of dinesh and Gilfoyle", - "slug": "best-of-dinesh-and-gilfoyle", - "published": true, - "createdAt": "2022-10-05T12:21:53.271Z", - "updatedAt": "2022-10-05T12:21:53.271Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activities": [ - { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "activityCount": 2, - "memberCount": 2, - "platform": "discord", - "channel": "piedpiper", - "lastActive": "2020-06-27T15:13:30.000Z" - } - }, - "ConversationList": { - "value": { - "rows": [ - { - "id": "291af008-7717-457e-9242-f5c507c8987b", - "title": "Code sprint over!", - "slug": "code-sprint-over", - "published": false, - "createdAt": "2022-10-03T15:38:05.900Z", - "updatedAt": "2022-10-03T15:38:05.900Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "platform": "github", - "activityCount": 3, - "lastActive": "2021-07-27T20:23:30.000Z", - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-06-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Sooner or later Gilfoyle's servers are going to fail and then it's all done", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 3.6482997238636017, - "neutral": 19.5749893784523, - "negative": 75.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "lastReplies": [ - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "memberCount": 2, - "channel": null - }, - { - "id": "24bdea79-3125-4950-bb38-07fa4a555012", - "title": "Best of dinesh and Gilfoyle", - "slug": "best-of-dinesh-and-gilfoyle", - "published": true, - "createdAt": "2022-10-05T12:21:53.271Z", - "updatedAt": "2022-10-05T12:21:53.271Z", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "platform": "discord", - "activityCount": 1, - "lastActive": "2020-06-29T15:13:30.000Z", - "conversationStarter": { - "id": "89a136ed-336d-4586-8842-790775465212", - "type": "message", - "timestamp": "2020-05-27T14:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "d42", - "sourceParentId": null, - "attributes": {}, - "channel": "piedpiper", - "body": "Best of Dinesh and gilfoyle", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "negative", - "mixed": 1.6482997238636017, - "neutral": 12.5749893784523, - "negative": 62.36468505859375, - "positive": 1.4120269566774368, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-05T12:09:44.414Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "lastReplies": [ - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-29T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "A very last reply to the conversation.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-05T12:21:53.279Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "24bdea79-3125-4950-bb38-07fa4a555012", - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "member": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - } - ], - "memberCount": 2, - "channel": "dev" - } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "MemberUpsert": { - "value": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - }, - "MemberFind": { - "value": { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activities": [ - { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "c39dc046-da1d-4a25-8624-6b78aad00f30", - "type": "message", - "timestamp": "2020-06-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "2345", - "sourceParentId": "1234", - "attributes": { "reactions": 68 }, - "channel": "dev", - "body": "My servers could handle 10x the traffic, if they weren't busy apologizing for your sh*t codebase.", - "title": null, - "url": "discord.gg/2345", - "sentiment": { - "label": "negative", - "mixed": 5.963129922747612, - "neutral": 20.673033595085144, - "negative": 69.99874711036682, - "positive": 3.365083411335945, - "sentiment": 5 - }, - "importHash": null, - "createdAt": "2022-10-03T15:19:30.415Z", - "updatedAt": "2022-10-03T15:26:02.599Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "lastActivity": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "lastActive": "2021-07-27T20:23:30.000Z", - "activityCount": 3, - "averageSentiment": 34.67, - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tasks": [], - "notes": [], - "noMerge": [], - "toMerge": [] - } - }, - "MemberList": { - "value": { - "rows": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "identities": ["github", "twitter"], - "activeOn": ["github"], - "activityCount": "2", - "lastActive": "2021-07-27T20:22:30.000Z", - "averageSentiment": "82.50", - "numberOfOpenSourceContributions": 10, - "noMerge": [], - "toMerge": [], - "lastActivity": { - "id": "73aa13b7-1ef9-4987-a273-e560edff94ca", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:22:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_2", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "I will never underestimate my talents again.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 14.308956265449524, - "neutral": 14.437079429626465, - "negative": 9.826807677745819, - "positive": 61.42715811729431, - "sentiment": 86 - }, - "importHash": null, - "createdAt": "2022-10-03T15:38:05.847Z", - "updatedAt": "2022-10-03T15:46:34.610Z", - "deletedAt": null, - "memberId": "2effc566-1932-44f3-a821-2d692933a953", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - }, - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "activityCount": "3", - "lastActive": "2021-07-27T20:23:30.000Z", - "averageSentiment": "34.67", - "numberOfOpenSourceContributions": 5, - "noMerge": [], - "toMerge": [], - "lastActivity": { - "id": "2dcbe40e-36e0-4929-ab21-a30467fd9a65", - "type": "pull_request-comment", - "timestamp": "2021-07-27T20:23:30.000Z", - "platform": "github", - "isContribution": true, - "score": 3, - "sourceId": "gh_3", - "sourceParentId": "gh_1", - "attributes": {}, - "channel": "piedpiper", - "body": "Don't worry. I will continue to do it for you.", - "title": null, - "url": "github.com/piedpiper/piedpier", - "sentiment": { - "label": "positive", - "mixed": 2.9098065569996834, - "neutral": 25.578168034553528, - "negative": 2.241993509232998, - "positive": 69.27002668380737, - "sentiment": 97 - }, - "importHash": null, - "createdAt": "2022-10-03T15:47:20.151Z", - "updatedAt": "2022-10-03T15:47:20.220Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": "291af008-7717-457e-9242-f5c507c8987b", - "parentId": "462ddc6b-5672-43b2-9018-4e3fd7332228", - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - "organizations": [ - { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "tags": [ - { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "importHash": null, - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - ], - "count": 2, - "offset": 0, - "limit": 10 - } - }, - "Note2": { - "value": { - "id": "39c850f6-fb96-4d16-8e8c-cd7072e33925", - "body": "Refused to have a user feedback call", - "importHash": null, - "createdAt": "2022-10-03T16:00:57.867Z", - "updatedAt": "2022-10-03T16:00:57.867Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "Note": { - "value": { - "id": "196c07da-14e0-419e-bd9a-5f15c721a694", - "body": "Likes frunks", - "importHash": null, - "createdAt": "2022-10-05T11:58:30.977Z", - "updatedAt": "2022-10-05T11:58:30.977Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "importHash": null, - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "NoteList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Note" }, - { "$ref": "#/components/examples/Note2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "OrganizationCreate": { - "value": { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 2, - "activityCount": 4 - } - }, - "Organization": { - "value": { - "id": "31bff99a-2eac-49f5-b015-cba95aa6e530", - "name": "Pied Piper", - "url": "https://piedpiper.io", - "description": "The new internet", - "emails": ["richard@piedpiper.io", "hello@piedpiper.io"], - "phoneNumbers": null, - "logo": null, - "tags": ["new-internet", "making-the-world-a-better-place", "not-like-hooli"], - "identities": ["github", "twitter"], - "activeOn": ["github"], - "lastActive": "2022-10-03T16:15:21.812Z", - "joinedAt": "2022-05-03T11:16:32.812Z", - "twitter": { - "bio": "The internet we deserve", - "handle": "PiedPiper", - "location": "The valley", - "followers": 5000, - "following": 20 - }, - "linkedin": { "handle": "company/PiedPiper" }, - "crunchbase": { "handle": "company/PiedPiper" }, - "employees": 50, - "revenueRange": { "max": 50, "min": 10 }, - "importHash": null, - "createdAt": "2022-10-03T16:15:21.812Z", - "updatedAt": "2022-10-03T16:15:21.812Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 2, - "activityCount": 4 - } - }, - "Organization2": { - "value": { - "id": "65257687-0bfa-498e-8b2f-53559f41522b", - "name": "Hooli", - "url": "https://hooli.xyz", - "description": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "emails": ["gavin@hooli.xyz"], - "phoneNumbers": null, - "logo": null, - "tags": ["hooli", "tethics", "not-google"], - "identities": ["devto", "github", "twitter"], - "activeOn": ["devto"], - "lastActive": "2022-10-04", - "joinedAt": "2020-01-30", - "twitter": { - "bio": "Hooli is an international corporation founded by Gavin Belson and Peter Gregory", - "handle": "hooli", - "location": "Menlo Park", - "followers": 500000, - "following": 0 - }, - "linkedin": { "handle": "company/Hooli" }, - "crunchbase": { "handle": "company/Hooli" }, - "employees": 4000, - "revenueRange": { "max": 500, "min": 100 }, - "importHash": null, - "createdAt": "2022-10-05T12:03:11.228Z", - "updatedAt": "2022-10-05T12:03:11.228Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "memberCount": 0, - "activityCount": 0 - } - }, - "OrganizationList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Organization" }, - { "$ref": "#/components/examples/Organization2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "Tag": { - "value": { - "id": "dca36c33-38cd-4e68-8ba8-515167e00971", - "name": "attended-hooli-con", - "importHash": null, - "createdAt": "2022-10-05T11:42:17.414Z", - "updatedAt": "2022-10-05T11:42:17.414Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "Tag2": { - "value": { - "id": "38807625-6302-47b5-9f35-58566ddec83b", - "name": "developer", - "createdAt": "2022-10-05T11:41:20.162Z", - "updatedAt": "2022-10-05T11:41:20.162Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "2effc566-1932-44f3-a821-2d692933a953", - "username": { "github": "dinesh", "twitter": "dinesh.chugtai" }, - "attributes": { - "bio": { - "github": "Lead developer at Pied Piper", - "default": "Pakistani Denzel. Tesla and gold chain owner.", - "twitter": "Pakistani Denzel. Tesla and gold chain owner." - }, - "url": { - "github": "https://github.com/dinesh", - "default": "https://t.co/d", - "twitter": "https://t.co/d" - }, - "location": { - "custom": "Silicon Valley", - "github": "Palo alto", - "default": "Silicon Valley" - } - }, - "displayName": "Dinesh", - "email": "dinesh@piedpiper.io", - "score": 9, - "joinedAt": "2022-10-03T15:30:55.672Z", - "reach": { "total": 100, "github": 60, "twitter": 40 }, - "createdAt": "2022-10-03T15:30:55.679Z", - "updatedAt": "2022-10-05T11:39:58.095Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - }, - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": 8, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-05T11:40:32.560Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "TagList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Tag" }, - { "$ref": "#/components/examples/Tag2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "Task": { - "value": { - "id": "8a127785-f11d-4102-804d-5b79ccddd4cc", - "name": "Ask for tips on building a new Anton", - "body": null, - "status": null, - "dueDate": "2022-05-27T15:13:30.000Z", - "importHash": null, - "createdAt": "2022-10-03T16:00:18.701Z", - "updatedAt": "2022-10-03T16:00:18.701Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "assignedToId": null, - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [ - { - "id": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "username": { "github": "gilfoyle", "twitter": "gilfoyle" }, - "attributes": { - "bio": { - "github": "Systems engineer at Pied Piper", - "default": "It's not magic. It's talent and sweat", - "twitter": "It's not magic. It's talent and sweat" - }, - "url": { - "github": "https://github.com/gilfoyle", - "default": "https://t.co/g", - "twitter": "https://t.co/g" - }, - "location": { - "custom": "Erlich's house", - "github": "Palo alto", - "default": "Erlich's house" - } - }, - "displayName": "Gilfoyle", - "email": "gilfoyle@piedpiper.io", - "score": -1, - "joinedAt": "2022-10-03T15:17:03.540Z", - "importHash": null, - "reach": { "total": 10000, "github": 5000, "twitter": 5000 }, - "createdAt": "2022-10-03T15:17:03.547Z", - "updatedAt": "2022-10-03T15:17:27.073Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ], - "activities": [] - } - }, - "Task2": { - "value": { - "id": "ef22fb05-a41b-472e-9917-a4d10d19fcc6", - "name": "Ask if we can use as quote", - "body": null, - "status": null, - "dueDate": "2022-08-27T00:00:00.000Z", - "importHash": null, - "createdAt": "2022-10-05T11:55:55.606Z", - "updatedAt": "2022-10-05T11:55:55.606Z", - "deletedAt": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "assignedToId": null, - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "members": [], - "activities": [ - { - "id": "782b426d-adc8-4fb4-a4ee-ab0bb07ffca0", - "type": "message", - "timestamp": "2020-05-27T15:13:30.000Z", - "platform": "discord", - "isContribution": true, - "score": 1, - "sourceId": "1234", - "sourceParentId": null, - "attributes": { "reactions": 43 }, - "channel": "dev", - "body": "It's not magic. It's talend and sweat.", - "title": null, - "url": "discord.gg/1234", - "sentiment": { - "label": "negative", - "mixed": 1.1410574428737164, - "neutral": 11.00325882434845, - "negative": 85.99738478660583, - "positive": 1.8582981079816818, - "sentiment": 2 - }, - "importHash": null, - "createdAt": "2022-10-03T15:18:11.294Z", - "updatedAt": "2022-10-03T15:21:49.402Z", - "deletedAt": null, - "memberId": "ab7a9fe9-4576-46b1-a710-8b8eaeff87a5", - "conversationId": null, - "parentId": null, - "tenantId": "8642a2bd-965e-4acd-be8c-dfedc83ef0af", - "createdById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75", - "updatedById": "debc3c7f-4c5d-4bec-9130-17bb0aea8b75" - } - ] - } - }, - "TaskList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/Task" }, - { "$ref": "#/components/examples/Task2" } - ], - "count": 2, - "limit": 10, - "offset": 0 - } - }, - "TaskFindAndUpdateAll": { "value": { "rowsUpdated": 5 } }, - "MemberAttributeSettings": { - "value": { - "id": "9eaedce9-1f3a-4a75-adc8-e475cbc47553'", - "type": "string", - "canDelete": false, - "show": true, - "label": "Url", - "name": "url", - "createdAt": "2022-09-07", - "updatedAt": "2022-09-07", - "tenantId": "fcd5b9cc-144b-4687-8fd9-34818f35e70d" - } - }, - "MemberAttributeSettings2": { - "value": { - "id": "13bb9e12-c371-44ad-8806-0678c2f53dd1", - "type": "boolean", - "canDelete": false, - "show": true, - "label": "is Hireable", - "name": "isHireable", - "createdAt": "2022-09-07", - "updatedAt": "2022-09-07", - "tenantId": "fcd5b9cc-144b-4687-8fd9-34818f35e70d" - } - }, - "MemberAttributeSettingsList": { - "value": { - "rows": [ - { "$ref": "#/components/examples/MemberAttributeSettings" }, - { "$ref": "#/components/examples/MemberAttributeSettings2" } - ], - "count": 2 - } - } - } - }, - "tags": [ - { "name": "Members", "description": "Everything about members" }, - { "name": "Member Attributes", "description": "Settings for member's attributes" }, - { "name": "Activities", "description": "Everything about activities" }, - { "name": "Organizations", "description": "Everything about organizations" }, - { "name": "Conversations", "description": "Everything about conversations" }, - { "name": "Tags", "description": "Everything about tags" }, - { "name": "Automations", "description": "Everything about automations" }, - { "name": "Notes", "description": "Everything about notes" } - ] -} diff --git a/backend/src/feature-flags/getFeatureFlagTenantContext.ts b/backend/src/feature-flags/getFeatureFlagTenantContext.ts deleted file mode 100644 index 7aa91b1d05..0000000000 --- a/backend/src/feature-flags/getFeatureFlagTenantContext.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Logger } from '@crowd/logging' -import { RedisCache, RedisClient } from '@crowd/redis' -import { FeatureFlagRedisKey } from '@crowd/types' - -import AutomationRepository from '../database/repositories/automationRepository' -import { getSecondsTillEndOfMonth } from '../utils/timing' - -export default async function getFeatureFlagTenantContext( - tenant: any, - database: any, - redis: RedisClient, - log: Logger, -) { - const automationCount = await AutomationRepository.countAllActive(database, tenant.id) - const csvExportCountCache = new RedisCache(FeatureFlagRedisKey.CSV_EXPORT_COUNT, redis, log) - const memberEnrichmentCountCache = new RedisCache( - FeatureFlagRedisKey.MEMBER_ENRICHMENT_COUNT, - redis, - log, - ) - - let csvExportCount = await csvExportCountCache.get(tenant.id) - let memberEnrichmentCount = await memberEnrichmentCountCache.get(tenant.id) - - const secondsRemainingUntilEndOfMonth = getSecondsTillEndOfMonth() - - if (!csvExportCount) { - await csvExportCountCache.set(tenant.id, '0', secondsRemainingUntilEndOfMonth) - csvExportCount = '0' - } - - if (!memberEnrichmentCount) { - await memberEnrichmentCountCache.set(tenant.id, '0', secondsRemainingUntilEndOfMonth) - memberEnrichmentCount = '0' - } - - return { - tenantId: tenant.id, - plan: tenant.plan, - automationCount: automationCount.toString(), - csvExportCount, - memberEnrichmentCount, - } -} diff --git a/backend/src/feature-flags/isFeatureEnabled.ts b/backend/src/feature-flags/isFeatureEnabled.ts deleted file mode 100644 index afa65fae82..0000000000 --- a/backend/src/feature-flags/isFeatureEnabled.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { isFeatureEnabled } from '@crowd/feature-flags' -import { FeatureFlag } from '@crowd/types' - -import getFeatureFlagTenantContext from './getFeatureFlagTenantContext' - -export default async (featureFlag: FeatureFlag, req: any): Promise => - isFeatureEnabled( - featureFlag, - async () => getFeatureFlagTenantContext(req.currentTenant, req.database, req.redis, req.log), - req.unleash, - ) diff --git a/backend/src/security/permissions.ts b/backend/src/security/permissions.ts index ef92c4fa68..e62104c88b 100644 --- a/backend/src/security/permissions.ts +++ b/backend/src/security/permissions.ts @@ -1,5 +1,3 @@ -import { TenantPlans } from '@crowd/types' - import Roles from './roles' import Storage from './storage' @@ -12,1073 +10,407 @@ class Permissions { tenantEdit: { id: 'tenantEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, tenantDestroy: { id: 'tenantDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, - planEdit: { - id: 'planEdit', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, - planRead: { - id: 'planRead', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userEdit: { id: 'userEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userDestroy: { id: 'userDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userCreate: { id: 'userCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userImport: { id: 'userImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userRead: { id: 'userRead', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, userAutocomplete: { id: 'userAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, auditLogRead: { id: 'auditLogRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, settingsRead: { id: 'settingsRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [storage.settingsBackgroundImages, storage.settingsLogos], }, settingsEdit: { id: 'settingsEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [storage.settingsBackgroundImages, storage.settingsLogos], }, memberAttributesRead: { id: 'memberAttributesRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberAttributesEdit: { id: 'memberAttributesEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberAttributesDestroy: { id: 'memberAttributesDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberAttributesCreate: { id: 'memberAttributesCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberImport: { id: 'memberImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, memberCreate: { id: 'memberCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberEdit: { id: 'memberEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberDestroy: { id: 'memberDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, memberRead: { id: 'memberRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, memberAutocomplete: { id: 'memberAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, activityImport: { id: 'activityImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, activityCreate: { id: 'activityCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, activityEdit: { id: 'activityEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, activityDestroy: { id: 'activityDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, activityRead: { id: 'activityRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, activityAutocomplete: { id: 'activityAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, automationCreate: { id: 'automationCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, automationUpdate: { id: 'automationUpdate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, automationDestroy: { id: 'automationDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, automationRead: { id: 'automationRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, tagImport: { id: 'tagImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, tagCreate: { id: 'tagCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, tagEdit: { id: 'tagEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, tagDestroy: { id: 'tagDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, tagRead: { id: 'tagRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, tagAutocomplete: { id: 'tagAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, organizationImport: { id: 'organizationImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, organizationCreate: { id: 'organizationCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, organizationEdit: { id: 'organizationEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, organizationDestroy: { id: 'organizationDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, organizationRead: { id: 'organizationRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, organizationAutocomplete: { id: 'organizationAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, integrationImport: { id: 'integrationImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, integrationControlLimit: { id: 'integrationControlLimit', allowedRoles: [], - allowedPlans: [], }, integrationCreate: { id: 'integrationCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, integrationEdit: { id: 'integrationEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, integrationDestroy: { id: 'integrationDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, integrationRead: { id: 'integrationRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, integrationAutocomplete: { id: 'integrationAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, microserviceImport: { id: 'microserviceImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, microserviceCreate: { id: 'microserviceCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, microserviceEdit: { id: 'microserviceEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, microserviceDestroy: { id: 'microserviceDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, microserviceRead: { id: 'microserviceRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, microserviceAutocomplete: { id: 'microserviceAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, microserviceVariantFree: { id: 'microserviceVariantFree', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, microserviceVariantPremium: { id: 'microserviceVariantPremium', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, conversationCreate: { id: 'conversationCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, conversationEdit: { id: 'conversationEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, conversationDestroy: { id: 'conversationDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, conversationRead: { id: 'conversationRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeActionCreate: { id: 'eagleEyeActionCreate', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeActionDestroy: { id: 'eagleEyeActionDestroy', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeContentCreate: { id: 'eagleEyeContentCreate', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeContentRead: { id: 'eagleEyeContentRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeContentSearch: { id: 'eagleEyeContentSearch', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, eagleEyeContentEdit: { id: 'eagleEyeContentEdit', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Growth, - TenantPlans.Essential, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, taskImport: { id: 'taskImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, taskCreate: { id: 'taskCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, taskEdit: { id: 'taskEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, taskDestroy: { id: 'taskDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, taskRead: { id: 'taskRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, taskAutocomplete: { id: 'taskAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, taskBatch: { id: 'taskBatch', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, noteImport: { id: 'noteImport', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, noteCreate: { id: 'noteCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, noteEdit: { id: 'noteEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, noteDestroy: { id: 'noteDestroy', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], allowedStorage: [], }, noteRead: { id: 'noteRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, noteAutocomplete: { id: 'noteAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, quickstartGuideRead: { id: 'quickstartGuideRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, quickstartGuideSettingsUpdate: { id: 'quickstartGuideSettingsUpdate', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, segmentRead: { id: 'segmentRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, segmentCreate: { id: 'segmentCreate', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, projectGroupCreate: { id: 'projectGroupCreate', allowedRoles: [roles.admin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, segmentEdit: { id: 'segmentEdit', allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, customViewCreate: { id: 'customViewCreate', allowedRoles: [roles.admin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, customViewEdit: { id: 'customViewEdit', allowedRoles: [roles.admin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, customViewDestroy: { id: 'customViewDestroy', allowedRoles: [roles.admin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, customViewRead: { id: 'customViewRead', allowedRoles: [roles.admin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, mergeActionRead: { id: 'mergeActionRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, dataIssueCreate: { id: 'dataIssueCreate', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], }, } } diff --git a/backend/src/security/plans.ts b/backend/src/security/plans.ts deleted file mode 100644 index 1d2338c571..0000000000 --- a/backend/src/security/plans.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TenantPlans } from '@crowd/types' - -import { PLANS_CONFIG } from '../conf' - -class Plans { - static selectPlanByStripePriceId(stripePriceId) { - const premiumStripePriceId = PLANS_CONFIG.stripePricePremium - - if (premiumStripePriceId === stripePriceId) { - return TenantPlans.Growth - } - - return TenantPlans.Essential - } - - static selectStripePriceIdByPlan(plan) { - if (plan === TenantPlans.Growth) { - return PLANS_CONFIG.stripePricePremium - } - - return null - } - - /** - * When the plan is: - * - active: The plan will be active. - * - cancel_at_period_end: The plan will remain active until the end of the period. - * - error: The plan will remain active, but a warning message will be displayed to the user. - * - canceled: The workspace plan will change to Free. - */ - static selectPlanStatus(stripePlan) { - if (!stripePlan) { - return 'canceled' - } - - const { status, cancelAtPeriodEnd } = stripePlan - - if (status === 'active') { - if (cancelAtPeriodEnd) { - return 'cancel_at_period_end' - } - - return 'active' - } - - if (status === 'canceled' || status === 'incomplete_expired') { - return 'canceled' - } - - return 'error' - } - - /** - * If the plan exists and it is not marked - * to cancel, the tenant can't be destroyed, - * because future charges might occur - */ - static allowTenantDestroy(plan, planStatus) { - if (plan === TenantPlans.Essential || plan === TenantPlans.Growth) { - return true - } - - return planStatus === 'cancel_at_period_end' - } -} - -export default Plans diff --git a/backend/src/serverless/integrations/workers/sendgridWebhookWorker.ts b/backend/src/serverless/integrations/workers/sendgridWebhookWorker.ts deleted file mode 100644 index c547516f48..0000000000 --- a/backend/src/serverless/integrations/workers/sendgridWebhookWorker.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { EventWebhook, EventWebhookHeader } from '@sendgrid/eventwebhook' - -import { getServiceChildLogger } from '@crowd/logging' -import { PlatformType } from '@crowd/types' - -import { IS_PROD_ENV, SENDGRID_CONFIG } from '../../../conf' -import SequelizeRepository from '../../../database/repositories/sequelizeRepository' -import UserRepository from '../../../database/repositories/userRepository' -import getUserContext from '../../../database/utils/getUserContext' -import EagleEyeContentService from '../../../services/eagleEyeContentService' -import { SendgridWebhookEvent, SendgridWebhookEventType } from '../../../types/webhooks' - -const log = getServiceChildLogger('sendgridWebhookWorker') - -export default async function sendgridWebhookWorker(req) { - if (!SENDGRID_CONFIG.webhookSigningSecret) { - log.error('Sendgrid webhook signing secret is not found.') - return { - status: 400, - } - } - - if (!IS_PROD_ENV) { - log.warn('Sendgrid events will be only sent for production.') - return { - status: 200, - } - } - - const events = req.body as SendgridWebhookEvent[] - - const signature = req.headers[EventWebhookHeader.SIGNATURE().toLowerCase()] - const timestamp = req.headers[EventWebhookHeader.TIMESTAMP().toLowerCase()] - - const eventWebhookVerifier = new EventWebhook() - - const ecdsaPublicKey = eventWebhookVerifier.convertPublicKeyToECDSA( - SENDGRID_CONFIG.webhookSigningSecret, - ) - - if (!eventWebhookVerifier.verifySignature(ecdsaPublicKey, req.rawBody, signature, timestamp)) { - log.error('Sendgrid webhook cannot be verified.') - return { - status: 400, - } - } - - for (const event of events) { - if (event.sg_template_id === SENDGRID_CONFIG.templateEagleEyeDigest) { - // TODO:: orphaned after removing nodejs-worker, process sendgrid webhook here - } - } - - return { - status: 200, - } -} - -const findPlatform = (str: string, arr: string[]): string => { - const match = arr.find((item) => str.includes(item)) - return match || null -} - -export const processSendgridWebhook = async (message: any) => { - log.info({ message }, 'Got event from sendgrid webhook!') - log.warn(message) - const options = await SequelizeRepository.getDefaultIRepositoryOptions() - const sendgridEvent = message.event as SendgridWebhookEvent - - const user = await UserRepository.findByEmail(sendgridEvent.email, options) - - const userContext = await getUserContext(sendgridEvent.tenantId, user.id) - - switch (sendgridEvent.event) { - case SendgridWebhookEventType.DIGEST_OPENED: { - EagleEyeContentService.trackDigestEmailOpened(userContext) - break - } - case SendgridWebhookEventType.POST_CLICKED: { - const platform = findPlatform( - new URL(sendgridEvent.url).hostname, - Object.values(PlatformType), - ) - EagleEyeContentService.trackPostClicked(sendgridEvent.url, platform, userContext, 'email') - break - } - default: - log.info({ event: message.event }, 'Unsupported event') - } -} diff --git a/backend/src/serverless/integrations/workers/stripeWebhookWorker.ts b/backend/src/serverless/integrations/workers/stripeWebhookWorker.ts deleted file mode 100644 index 8cbffe9fb5..0000000000 --- a/backend/src/serverless/integrations/workers/stripeWebhookWorker.ts +++ /dev/null @@ -1,146 +0,0 @@ -import moment from 'moment' -import { Stripe } from 'stripe' - -import { timeout } from '@crowd/common' -import { getServiceChildLogger } from '@crowd/logging' -import { RedisPubSubEmitter, getRedisClient } from '@crowd/redis' -import { ApiWebsocketMessage, TenantPlans } from '@crowd/types' - -import { PLANS_CONFIG, REDIS_CONFIG } from '../../../conf' -import SequelizeRepository from '../../../database/repositories/sequelizeRepository' - -const log = getServiceChildLogger('stripeWebhookWorker') - -const stripe = new Stripe(PLANS_CONFIG.stripeSecretKey, { - apiVersion: '2022-08-01', - typescript: true, -}) - -export default async function stripeWebhookWorker(req) { - const sig = req.headers['stripe-signature'] - let event - - try { - event = stripe.webhooks.constructEvent(req.rawBody, sig, PLANS_CONFIG.stripWebhookSigningSecret) - log.info({ event }, 'Stripe webhook event') - // TODO:: process event here - we were updating it from nodejs-worker before, now it's orphaned - } catch (err) { - log.error(`Webhook Error: ${err.message}`) - return { - status: 400, - } - } - - return { - status: 200, - } -} - -export const processStripeWebhook = async (message: any) => { - log.info({ message }, 'Got event from stripe webhook!') - log.warn(message) - - const options = await SequelizeRepository.getDefaultIRepositoryOptions() - const redis = await getRedisClient(REDIS_CONFIG, true) - - const apiPubSubEmitter = new RedisPubSubEmitter( - 'api-pubsub', - redis, - (err) => { - log.error({ err }, 'Error in api-ws emitter!') - }, - log, - ) - const stripeWebhookMessage = message.event - - switch (stripeWebhookMessage.type) { - case 'checkout.session.completed': { - log.info( - { tenant: stripeWebhookMessage.data.object.client_reference_id }, - 'Processing checkout.session.complete', - ) - - // get subscription information from checkout event - const subscription = await stripe.subscriptions.retrieve( - stripeWebhookMessage.data.object.subscription, - ) - - const subscriptionEndsAt = subscription.current_period_end - const tenantId = stripeWebhookMessage.data.object.client_reference_id - - const tenant = await options.database.tenant.findByPk(tenantId) - - let productPlan - - if ((subscription as any).plan.product === PLANS_CONFIG.stripeEagleEyePlanProductId) { - productPlan = TenantPlans.EagleEye - } else if ((subscription as any).plan.product === PLANS_CONFIG.stripeGrowthPlanProductId) { - productPlan = TenantPlans.Growth - } else { - log.error({ subscription }, `Unknown product in subscription`) - process.exit(1) - } - - if (!tenant) { - log.error({ tenantId }, 'Tenant not found!') - process.exit(1) - } else { - log.info({ tenantId }, `Tenant found - updating tenant plan to ${productPlan} plan!`) - await tenant.update({ - plan: productPlan, - isTrialPlan: false, - trialEndsAt: null, - stripeSubscriptionId: stripeWebhookMessage.data.object.subscription, - planSubscriptionEndsAt: moment(subscriptionEndsAt, 'X').toISOString(), - }) - - log.info('Emitting to redis pubsub for websocket forwarding from api..') - - // Wait few more seconds to ensure redirect is completed - await timeout(3000) - - // Send websocket message to frontend - apiPubSubEmitter.emit( - 'user', - new ApiWebsocketMessage( - 'tenant-plan-upgraded', - JSON.stringify({ - plan: productPlan, - stripeSubscriptionId: stripeWebhookMessage.data.object.subscription, - }), - undefined, - tenantId, - ), - ) - log.info('Done!') - } - - break - } - case 'invoice.payment_succeeded': { - // Since we're already updating the plan on session.completed event, - // we only need to process this event when billing_reason = `subscription_cycle` for the recurring payments. - // When subscription is newly created, billing_reason is `subscription_create` - log.info(stripeWebhookMessage.data.object.billing_reason, 'Invoice payment event') - - if (stripeWebhookMessage.data.object.billing_reason === 'subscription_cycle') { - // find tenant by stripeSubscriptionId - const tenant = await options.database.tenant.findOne({ - where: { stripeSubscriptionId: stripeWebhookMessage.data.object.subscription }, - }) - - const subscription = await stripe.subscriptions.retrieve( - stripeWebhookMessage.data.object.subscription, - ) - - await tenant.update({ - planSubscriptionEndsAt: moment(subscription.current_period_end, 'X').toISOString(), - }) - } - - break - } - default: - log.info({ event: message.event }, 'Unsupported event') - } -} diff --git a/backend/src/services/IServiceOptions.ts b/backend/src/services/IServiceOptions.ts index 460eda112b..d254d2d28c 100644 --- a/backend/src/services/IServiceOptions.ts +++ b/backend/src/services/IServiceOptions.ts @@ -1,5 +1,4 @@ import { DbConnection } from '@crowd/data-access-layer/src/database' -import { Unleash } from '@crowd/feature-flags' import { Logger } from '@crowd/logging' import { RedisClient } from '@crowd/redis' import { Client as TemporalClient } from '@crowd/temporal' @@ -15,7 +14,6 @@ export interface IServiceOptions { qdb?: DbConnection redis: RedisClient transaction?: any - unleash?: Unleash temporal: TemporalClient productDb: DbConnection profileSql?: boolean diff --git a/backend/src/services/__tests__/tenantService.test.ts b/backend/src/services/__tests__/tenantService.test.ts index 4ec01b7a2a..d689a757ae 100644 --- a/backend/src/services/__tests__/tenantService.test.ts +++ b/backend/src/services/__tests__/tenantService.test.ts @@ -1,5 +1,5 @@ import { getRedisClient } from '@crowd/redis' -import { MemberAttributeName, TenantPlans } from '@crowd/types' +import { MemberAttributeName } from '@crowd/types' import { REDIS_CONFIG } from '../../conf' import SequelizeTestUtils from '../../database/utils/sequelizeTestUtils' @@ -77,12 +77,8 @@ describe('TenantService tests', () => { id: tenantCreatedPlain.id, name: 'testName', url: 'testUrl', - plan: TenantPlans.Essential, - isTrialPlan: false, - trialEndsAt: null, onboardedAt: null, integrationsRequired: ['github', 'discord'], - hasSampleData: false, communitySize: '>25000', createdAt: SequelizeTestUtils.getNowWithoutTime(), updatedAt: SequelizeTestUtils.getNowWithoutTime(), @@ -91,8 +87,6 @@ describe('TenantService tests', () => { updatedById: options.currentUser.id, settings: [], conversationSettings: [], - planSubscriptionEndsAt: null, - stripeSubscriptionId: null, reasonForUsingCrowd: null, } diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index a27c130df0..77b55afda2 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -14,18 +14,15 @@ import { import { findMemberAffiliations } from '@crowd/data-access-layer/src/member_segment_affiliations' import { MemberField, - addMemberNotes, addMemberTags, addMemberTasks, fetchMemberIdentities, findMemberById, findMemberIdentityById, - findMemberNotes, findMemberTags, findMemberTasks, insertMemberSegments, queryMembersAdvanced, - removeMemberNotes, removeMemberTags, removeMemberTasks, } from '@crowd/data-access-layer/src/members' @@ -690,10 +687,9 @@ export default class MemberService extends LoggerBase { MemberField.ID, MemberField.DISPLAY_NAME, ]) - const [memberTasks, memberTags, memberNotes] = await Promise.all([ + const [memberTasks, memberTags] = await Promise.all([ (await findMemberTasks(qx, memberId)).map((t) => ({ id: t.taskId })), (await findMemberTags(qx, memberId)).map((t) => ({ id: t.tagId })), - (await findMemberNotes(qx, memberId)).map((t) => ({ id: t.noteId })), ]) captureOldState({ @@ -805,26 +801,6 @@ export default class MemberService extends LoggerBase { } } - // move notes - if (payload.secondary.notes.length > 0) { - await addMemberNotes( - txqx, - secondaryMember.id, - payload.secondary.notes.map((n) => n.id), - ) - // check if anything to delete in primary - const notesToDelete = memberNotes.filter( - (n) => !payload.primary.notes.some((pn) => pn.id === n.id), - ) - if (notesToDelete.length > 0) { - await removeMemberNotes( - txqx, - memberId, - notesToDelete.map((n) => n.id), - ) - } - } - // move memberOrganizations if (payload.secondary.memberOrganizations.length > 0) { const nonExistingOrganizationIds = await OrganizationRepository.findNonExistingIds( @@ -868,7 +844,6 @@ export default class MemberService extends LoggerBase { delete payload.primary.memberOrganizations delete payload.primary.organizations delete payload.primary.tags - delete payload.primary.notes delete payload.primary.tasks delete payload.primary.affiliations @@ -945,7 +920,7 @@ export default class MemberService extends LoggerBase { memberId: string, identityId: string, ): Promise> { - const relationships = ['tags', 'notes', 'tasks', 'identities', 'affiliations'] + const relationships = ['tags', 'tasks', 'identities', 'affiliations'] try { const qx = SequelizeRepository.getQueryExecutor(this.options) @@ -960,15 +935,14 @@ export default class MemberService extends LoggerBase { ]) this.options.log.info( - '[0] Getting member information (identities, tags, notes, tasks, affiliations)... ', + '[0] Getting member information (identities, tags, tasks, affiliations)... ', ) - const [memberOrganizations, identities, tags, notes, tasks, affiliations] = await Promise.all( + const [memberOrganizations, identities, tags, tasks, affiliations] = await Promise.all( [ MemberOrganizationRepository.findMemberRoles(memberId, this.options), fetchMemberIdentities(qx, memberId), findMemberTags(qx, memberId), - findMemberNotes(qx, memberId), findMemberTasks(qx, memberId), findMemberAffiliations(qx, memberId), ], @@ -982,7 +956,6 @@ export default class MemberService extends LoggerBase { identities, affiliations, tags: tags.map((t) => ({ id: t.tagId })), - notes: notes.map((n) => ({ id: n.noteId })), tasks: tasks.map((t) => ({ id: t.taskId })), } @@ -1128,15 +1101,6 @@ export default class MemberService extends LoggerBase { ), ) - // notes: Remove notes that exist in secondary backup, but not in primary backup - member.notes = member.notes.filter( - (note) => - !( - secondaryBackup.notes.some((n) => n.id === note.id) && - !primaryBackup.notes.some((n) => n.id === note.id) - ), - ) - // tasks: Remove tasks that exist in secondary backup, but not in primary backup member.tasks = member.tasks.filter( (task) => @@ -1259,7 +1223,6 @@ export default class MemberService extends LoggerBase { memberOrganizations: [], organizations: [], tags: [], - notes: [], tasks: [], attributes: {}, joinedAt: new Date().toISOString(), @@ -1281,7 +1244,6 @@ export default class MemberService extends LoggerBase { static MEMBER_MERGE_FIELDS = [ 'id', 'tags', - 'notes', 'reach', 'tasks', 'joinedAt', @@ -1332,9 +1294,8 @@ export default class MemberService extends LoggerBase { MemberField.MANUALLY_CHANGED_FIELDS, ]) - const [tags, notes, tasks, affiliations] = await Promise.all([ + const [tags, tasks, affiliations] = await Promise.all([ findMemberTags(qx, memberId), - findMemberNotes(qx, memberId), findMemberTasks(qx, memberId), findMemberAffiliations(qx, memberId), ]) @@ -1342,7 +1303,6 @@ export default class MemberService extends LoggerBase { return { ...member, tags: tags.map((t) => ({ id: t.tagId })), - notes: notes.map((n) => ({ id: n.noteId })), tasks: tasks.map((t) => ({ id: t.taskId })), affiliations, } @@ -1428,8 +1388,6 @@ export default class MemberService extends LoggerBase { identitiesToUpdate, repoOptions, ) - // Update notes to belong to the originalId member - await MemberRepository.moveNotesBetweenMembers(toMergeId, originalId, repoOptions) // Update tasks to belong to the originalId member await MemberRepository.moveTasksBetweenMembers(toMergeId, originalId, repoOptions) @@ -1857,7 +1815,6 @@ export default class MemberService extends LoggerBase { const relations = [ { relation: 'organizations', attributes: ['name'] }, - { relation: 'notes', attributes: ['body'] }, { relation: 'tags', attributes: ['name'] }, ] for (const relation of relations) { diff --git a/backend/src/services/noteService.ts b/backend/src/services/noteService.ts deleted file mode 100644 index d3d7f77f3e..0000000000 --- a/backend/src/services/noteService.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Error400 } from '@crowd/common' - -import MemberRepository from '../database/repositories/memberRepository' -import NoteRepository from '../database/repositories/noteRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' - -import { IServiceOptions } from './IServiceOptions' - -export default class NoteService { - options: IServiceOptions - - constructor(options) { - this.options = options - } - - async create(data) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - if (data.members) { - data.members = await MemberRepository.filterIdsInTenant(data.members, { - ...this.options, - transaction, - }) - } - - const record = await NoteRepository.create(data, { - ...this.options, - transaction, - }) - - await SequelizeRepository.commitTransaction(transaction) - - return record - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - - SequelizeRepository.handleUniqueFieldError(error, this.options.language, 'note') - - throw error - } - } - - async update(id, data) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - if (data.members) { - data.members = await MemberRepository.filterIdsInTenant(data.members, { - ...this.options, - transaction, - }) - } - - const record = await NoteRepository.update(id, data, { - ...this.options, - transaction, - }) - - await SequelizeRepository.commitTransaction(transaction) - - return record - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - - SequelizeRepository.handleUniqueFieldError(error, this.options.language, 'note') - - throw error - } - } - - async destroyAll(ids) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - for (const id of ids) { - await NoteRepository.destroy( - id, - { - ...this.options, - transaction, - }, - true, - ) - } - - await SequelizeRepository.commitTransaction(transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - async findById(id) { - return NoteRepository.findById(id, this.options) - } - - async findAllAutocomplete(search, limit) { - return NoteRepository.findAllAutocomplete(search, limit, this.options) - } - - async findAndCountAll(args) { - return NoteRepository.findAndCountAll(args, this.options) - } - - async query(data) { - const advancedFilter = data.filter - const orderBy = data.orderBy - const limit = data.limit - const offset = data.offset - return NoteRepository.findAndCountAll({ advancedFilter, orderBy, limit, offset }, this.options) - } - - async import(data, importHash) { - if (!importHash) { - throw new Error400(this.options.language, 'importer.errors.importHashRequired') - } - - if (await this._isImportHashExistent(importHash)) { - throw new Error400(this.options.language, 'importer.errors.importHashExistent') - } - - const dataToCreate = { - ...data, - importHash, - } - - return this.create(dataToCreate) - } - - async _isImportHashExistent(importHash) { - const count = await NoteRepository.count( - { - importHash, - }, - this.options, - ) - - return count > 0 - } -} diff --git a/backend/src/services/sampleDataService.ts b/backend/src/services/sampleDataService.ts deleted file mode 100644 index b9f4c53600..0000000000 --- a/backend/src/services/sampleDataService.ts +++ /dev/null @@ -1,323 +0,0 @@ -// import { membersScore } from './../database/utils/keys/microserviceTypes' -import lodash from 'lodash' -import moment from 'moment' - -import { - CROWD_MEMBER_ATTRIBUTES, - DEVTO_MEMBER_ATTRIBUTES, - DISCORD_MEMBER_ATTRIBUTES, - GITHUB_MEMBER_ATTRIBUTES, - LINKEDIN_MEMBER_ATTRIBUTES, - TWITTER_MEMBER_ATTRIBUTES, -} from '@crowd/integrations' -import { LoggerBase } from '@crowd/logging' -import { - MemberAttributeName, - MemberAttributeType, - MemberAttributes, - PlatformType, -} from '@crowd/types' - -import { API_CONFIG } from '../conf' -import MemberRepository from '../database/repositories/memberRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' - -import { IServiceOptions } from './IServiceOptions' -import ActivityService from './activityService' -import ConversationService from './conversationService' -import MemberAttributeSettingsService from './memberAttributeSettingsService' -import MemberService from './memberService' -import NoteService from './noteService' -import OrganizationService from './organizationService' -import TagService from './tagService' -import TenantService from './tenantService' - -export default class SampleDataService extends LoggerBase { - options: IServiceOptions - - constructor(options: IServiceOptions) { - super(options.log) - this.options = options - } - - /** - * Generates sample data from a json file for currentTenant - * For imported sample activities and members attributes.sample.crowd is set to true - * Sets currentTenant.hasSampleData to true - * @param sampleMembersActivities members array included from json by require(json) - * - */ - async generateSampleData(sampleMembersActivities): Promise { - const tenantService = new TenantService(this.options) - await tenantService.update(this.options.currentTenant.id, { - hasSampleData: true, - }) - if (API_CONFIG.edition !== 'crowd-hosted') { - try { - const activityService = new ActivityService(this.options) - const memberService = new MemberService(this.options) - const tagService = new TagService(this.options) - const noteService = new NoteService(this.options) - const memberAttributeSettingsService = new MemberAttributeSettingsService(this.options) - await memberAttributeSettingsService.createPredefined( - MemberAttributeSettingsService.pickAttributes( - [MemberAttributeName.SAMPLE], - CROWD_MEMBER_ATTRIBUTES, - ), - ) - await memberAttributeSettingsService.createPredefined(GITHUB_MEMBER_ATTRIBUTES) - await memberAttributeSettingsService.createPredefined(DISCORD_MEMBER_ATTRIBUTES) - await memberAttributeSettingsService.createPredefined(TWITTER_MEMBER_ATTRIBUTES) - await memberAttributeSettingsService.createPredefined(DEVTO_MEMBER_ATTRIBUTES) - await memberAttributeSettingsService.createPredefined(LINKEDIN_MEMBER_ATTRIBUTES) - - const MemberEnrichmentAttributeSettings = [ - { - name: MemberAttributeName.SKILLS, - label: MemberAttributes[MemberAttributeName.SKILLS].label, - type: MemberAttributeType.MULTI_SELECT, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.LANGUAGES, - label: MemberAttributes[MemberAttributeName.LANGUAGES].label, - type: MemberAttributeType.MULTI_SELECT, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.PROGRAMMING_LANGUAGES, - label: MemberAttributes[MemberAttributeName.PROGRAMMING_LANGUAGES].label, - type: MemberAttributeType.MULTI_SELECT, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.AWARDS, - label: MemberAttributes[MemberAttributeName.AWARDS].label, - type: MemberAttributeType.SPECIAL, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.SENIORITY_LEVEL, - label: MemberAttributes[MemberAttributeName.SENIORITY_LEVEL].label, - type: MemberAttributeType.STRING, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.EXPERTISE, - label: MemberAttributes[MemberAttributeName.EXPERTISE].label, - type: MemberAttributeType.MULTI_SELECT, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.COUNTRY, - label: MemberAttributes[MemberAttributeName.COUNTRY].label, - type: MemberAttributeType.STRING, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.YEARS_OF_EXPERIENCE, - label: MemberAttributes[MemberAttributeName.YEARS_OF_EXPERIENCE].label, - type: MemberAttributeType.NUMBER, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.EDUCATION, - label: MemberAttributes[MemberAttributeName.EDUCATION].label, - type: MemberAttributeType.SPECIAL, - canDelete: false, - show: true, - }, - { - name: MemberAttributeName.WORK_EXPERIENCES, - label: MemberAttributes[MemberAttributeName.WORK_EXPERIENCES].label, - type: MemberAttributeType.SPECIAL, - canDelete: false, - show: true, - }, - ] - - await memberAttributeSettingsService.createPredefined(MemberEnrichmentAttributeSettings) - - // we update this field first because api runs this endpoint asynchronously - // and frontend expects it to be true after 2 seconds - await tenantService.update(this.options.currentTenant.id, { - hasSampleData: true, - }) - - // 2022-03-16 is the most recent activity date in sample-data.json - // When importing, we pad that value in days so that most recent activity.timestamp = now() - const timestampPaddingInDays = - moment().utc().diff(moment('2022-09-30 21:52:28').utc(), 'days') - 1 - this.log.info(`timestampPaddingInDays: ${timestampPaddingInDays}`) - - const members = sampleMembersActivities.members - - for (const member of members) { - const tagList = [] - const noteList = [] - for (const tag of member.tags || []) { - const found = (await tagService.findAndCountAll({ advancedFilter: { name: tag } })) - .rows[0] - if (found) { - tagList.push(found.id) - } else { - const createdTag = await tagService.create({ - name: tag, - // Current date minus a random interval between 0 and 10 days - createdAt: moment() - .subtract(Math.floor(Math.random() * 10), 'days') - .toDate(), - }) - tagList.push(createdTag.id) - } - } - member.tags = tagList - - for (const note of member.notes || []) { - const createdNote = await noteService.create({ - body: note, - // Current date minus a random interval between 0 and 10 days - createdAt: moment() - .subtract(Math.floor(Math.random() * 10), 'days') - .toDate(), - }) - noteList.push(createdNote.id) - } - member.notes = noteList - - for (const key of Object.keys(member.attributes)) { - const attSettings = lodash.find(MemberEnrichmentAttributeSettings, { - name: key, - }) - if (attSettings?.type === MemberAttributeType.MULTI_SELECT) { - const newOptions = member.attributes[key].enrichment - const existingDbAttribute = ( - await memberAttributeSettingsService.findAndCountAll({ - filter: { name: key }, - }) - ).rows[0] - const existingOptions = existingDbAttribute.options - const allOptions = lodash.union(existingOptions, newOptions) - await memberAttributeSettingsService.update(existingDbAttribute.id, { - options: allOptions, - }) - } - } - member.contributions = member.openSourceContributions - member.platform = 'github' - await memberService.upsert(member) - } - - for (const conv of sampleMembersActivities.conversations) { - for (const act of conv) { - act.member = members.find((m) => m.displayName === act.member) - act.member.attributes[MemberAttributeName.SAMPLE] = { - [PlatformType.CROWD]: true, - } - act.timestamp = moment(act.timestamp).utc().add(timestampPaddingInDays, 'days').toDate() - if (act.attributes === undefined) { - act.attributes = {} - } - act.attributes.sample = true - act.sentiment.sentiment = Math.min(act.sentiment.sentiment + 40, 100) - await activityService.createWithMember(act) - } - } - this.log.info( - `Sample data for tenant ${this.options.currentTenant.id} created succesfully.`, - ) - } catch (err) { - this.log.error(err) - throw err - } - } - } - - /** - * Deletes sample data - * Sample data is defined for all members and activities where attributes.sample.crowd = true - * Sets currentTenant.hasSampleData to false - * Also removes settings for attributes.sample.crowd - */ - async deleteSampleData(): Promise { - const tx = await SequelizeRepository.createTransaction(this.options) - - const txOptions = { ...this.options, transaction: tx } - - try { - const tenantService = new TenantService(txOptions) - - const tenant = await tenantService.findById(this.options.currentTenant.id) - - if (tenant.hasSampleData) { - if (API_CONFIG.edition !== 'crowd-hosted') { - const memberService = new MemberService(txOptions) - const memberAttributeSettingsService = new MemberAttributeSettingsService(txOptions) - - const memberIds = await MemberRepository.findSampleDataMemberIds(txOptions) - - const organizationService = new OrganizationService(txOptions) - - const organizationIds = ( - await organizationService.findAndCountAll({ - advancedFilter: { - members: memberIds, - }, - }) - ).rows.map((org) => org.id) - - await organizationService.destroyBulk(organizationIds) - - // deleting sample members should cascade to their activities as well - await memberService.destroyBulk(memberIds) - - const conversationService = new ConversationService(txOptions) - const conversationIds = ( - await conversationService.findAndCountAll({ - advancedFilter: { - activityCount: 0, - }, - limit: 200, - }) - ).rows.map((conv) => conv.id) - - await conversationService.destroyBulk(conversationIds) - - // delete attribute settings for attributes.sample.crowd as well - const sampleAttributeSettings = ( - await memberAttributeSettingsService.findAndCountAll({ - filter: { name: MemberAttributeName.SAMPLE }, - }) - ).rows[0] - await memberAttributeSettingsService.destroyAll([sampleAttributeSettings.id]) - } - - await tenantService.update( - this.options.currentTenant.id, - { - hasSampleData: false, - }, - true, - ) - } - - await SequelizeRepository.commitTransaction(tx) - this.log.info(`Sample data for tenant ${this.options.currentTenant.id} deleted succesfully.`) - } catch (err) { - this.log.error(err, 'Error deleting sample data!') - if (tx) { - await SequelizeRepository.rollbackTransaction(tx) - } - - throw err - } - } -} diff --git a/backend/src/services/slackCommandService.ts b/backend/src/services/slackCommandService.ts index 9c5a8c71a5..2686dde6a5 100644 --- a/backend/src/services/slackCommandService.ts +++ b/backend/src/services/slackCommandService.ts @@ -3,7 +3,6 @@ import moment from 'moment' import { Divider, Message, Section, SlackMessageDto } from 'slack-block-builder' import { validateUUID as uuidValidate } from '@crowd/common' -import { TenantPlans } from '@crowd/types' import { IS_DEV_ENV, IS_PROD_ENV, IS_STAGING_ENV } from '../conf' import TenantRepository from '../database/repositories/tenantRepository' @@ -60,7 +59,6 @@ export default class SlackCommandService { required: true, description: 'Plan to set', type: SlackCommandParameterType.STRING, - allowedValues: [TenantPlans.Growth, TenantPlans.Essential], }, { name: 'trialEndsAt', diff --git a/backend/src/services/tenantService.ts b/backend/src/services/tenantService.ts index 6c67455c80..4e167fe037 100644 --- a/backend/src/services/tenantService.ts +++ b/backend/src/services/tenantService.ts @@ -1,7 +1,7 @@ import { Error400, Error404 } from '@crowd/common' import { queryConversations } from '@crowd/data-access-layer' import { DEFAULT_MEMBER_ATTRIBUTES } from '@crowd/integrations' -import { SegmentData, SegmentStatus, TenantPlans } from '@crowd/types' +import { SegmentData, SegmentStatus } from '@crowd/types' import CustomViewRepository from '@/database/repositories/customViewRepository' import { defaultCustomViews } from '@/types/customView' @@ -15,7 +15,6 @@ import TenantRepository from '../database/repositories/tenantRepository' import TenantUserRepository from '../database/repositories/tenantUserRepository' import * as microserviceTypes from '../database/utils/keys/microserviceTypes' import Permissions from '../security/permissions' -import Plans from '../security/plans' import Roles from '../security/roles' import { IServiceOptions } from './IServiceOptions' @@ -316,45 +315,6 @@ export default class TenantService { return SettingsService.save({ contactsViewed: true }, this.options) } - async updatePlanUser(id, planStripeCustomerId, planUserId) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - await TenantRepository.updatePlanUser(id, planStripeCustomerId, planUserId, { - ...this.options, - transaction, - currentTenant: { id }, - bypassPermissionValidation: true, - }) - - await SequelizeRepository.commitTransaction(transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - async updatePlanToFree(planStripeCustomerId) { - return this.updatePlanStatus(planStripeCustomerId, TenantPlans.Essential, 'active') - } - - async updatePlanStatus(planStripeCustomerId, plan, planStatus) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - await TenantRepository.updatePlanStatus(planStripeCustomerId, plan, planStatus, { - ...this.options, - transaction, - bypassPermissionValidation: true, - }) - - await SequelizeRepository.commitTransaction(transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - async destroyAll(ids) { const transaction = await SequelizeRepository.createTransaction(this.options) @@ -371,10 +331,6 @@ export default class TenantService { currentTenant: tenant, }).validateHas(Permissions.values.tenantDestroy) - if (!Plans.allowTenantDestroy(tenant.plan, tenant.planStatus)) { - throw new Error400(this.options.language, 'tenant.planActive') - } - await TenantRepository.destroy(id, { ...this.options, transaction, diff --git a/backend/src/services/user/__tests__/permissionChecker.test.ts b/backend/src/services/user/__tests__/permissionChecker.test.ts deleted file mode 100644 index f27c0766fe..0000000000 --- a/backend/src/services/user/__tests__/permissionChecker.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Error403 } from '@crowd/common' -import { PlatformType, TenantPlans } from '@crowd/types' - -import SequelizeTestUtils from '../../../database/utils/sequelizeTestUtils' -import Plans from '../../../security/plans' -import PermissionChecker from '../permissionChecker' - -const db = null - -describe('PermissionChecker tests', () => { - beforeEach(async () => { - await SequelizeTestUtils.wipeDatabase(db) - }) - - afterAll(async () => { - // Closing the DB connection allows Jest to exit successfully. - await SequelizeTestUtils.closeConnection(db) - }) - - describe('Integration protected fields', () => { - it('Should throw an error when limitCount is passed', async () => { - for (const plan of Object.values(TenantPlans)) { - const mockIServiceOptions = await SequelizeTestUtils.getTestIServiceOptions( - db, - plan as TenantPlans, - ) - const permissionChecker = new PermissionChecker(mockIServiceOptions) - const data = { - limitCount: 1, - status: 'in-progress', - platform: PlatformType.GITHUB, - } - expect(() => permissionChecker.validateIntegrationsProtectedFields(data)).toThrow(Error403) - } - }) - - it('Should throw an error when limitCount is passed as 0', async () => { - for (const plan of Object.values(TenantPlans)) { - const mockIServiceOptions = await SequelizeTestUtils.getTestIServiceOptions( - db, - plan as TenantPlans, - ) - const permissionChecker = new PermissionChecker(mockIServiceOptions) - const data = { - limitCount: 0, - status: 'in-progress', - platform: PlatformType.GITHUB, - } - expect(() => permissionChecker.validateIntegrationsProtectedFields(data)).toThrow(Error403) - } - }) - }) -}) diff --git a/backend/src/services/user/permissionChecker.ts b/backend/src/services/user/permissionChecker.ts index 88b8483205..3e149a7d02 100644 --- a/backend/src/services/user/permissionChecker.ts +++ b/backend/src/services/user/permissionChecker.ts @@ -2,7 +2,6 @@ import assert from 'assert' import lodash from 'lodash' import { Error400, Error403 } from '@crowd/common' -import { TenantPlans } from '@crowd/types' import Permissions from '../../security/permissions' import Roles from '../../security/roles' @@ -98,10 +97,6 @@ export default class PermissionChecker { throw new Error403(this.language, 'email not verified') } - if (!this.hasPlanPermission(permission)) { - throw new Error403(this.language, 'not allowed on this plan') - } - const allowedRoles = this.findAllowedRoles(permission) if (lodash.isEqual(allowedRoles, [roles.projectAdmin])) { this.validateSegmentPermission() @@ -148,14 +143,6 @@ export default class PermissionChecker { } } - /** - * Checks if the current company plan allows the permission. - */ - private hasPlanPermission(permission) { - assert(permission, 'permission is required') - - return permission.allowedPlans.includes(this.currentTenantPlan) - } private get isEmailVerified() { // Only checks if the email is verified @@ -191,18 +178,6 @@ export default class PermissionChecker { return userRoles } - /** - * Return the current tenant plan, - * check also if it's not expired. - */ - private get currentTenantPlan() { - if (!this.currentTenant || !this.currentTenant.plan) { - return TenantPlans.Essential - } - - return this.currentTenant.plan - } - /** * Returns the allowed storage ids for the user. */ diff --git a/backend/src/services/user/userDestroyer.ts b/backend/src/services/user/userDestroyer.ts index e5e527e8d4..fafe1325e9 100644 --- a/backend/src/services/user/userDestroyer.ts +++ b/backend/src/services/user/userDestroyer.ts @@ -1,7 +1,6 @@ import assert from 'assert' import { Error400 } from '@crowd/common' -import { TenantPlans } from '@crowd/types' import SequelizeRepository from '../../database/repositories/sequelizeRepository' import TenantUserRepository from '../../database/repositories/tenantUserRepository' @@ -61,22 +60,6 @@ export default class UserDestroyer { await TenantUserRepository.destroy(this.options.currentTenant.id, user.id, this.options) } - /** - * Checks if the user is removing the responsable for the plan - */ - async _isRemovingPlanUser() { - const { currentTenant } = this.options - - if (currentTenant.plan === TenantPlans.Essential) { - return false - } - - if (!currentTenant.planUserId) { - return false - } - - return this._ids.includes(String(currentTenant.planUserId)) - } /** * Checks if the user is removing himself @@ -92,10 +75,6 @@ export default class UserDestroyer { assert(this.options.currentUser.email, 'currentUser.email is required') assert(this._ids && this._ids.length, 'ids is required') - if (await this._isRemovingPlanUser()) { - throw new Error400(this.options.language, 'user.errors.destroyingPlanUser') - } - if (this._isRemovingHimself()) { throw new Error400(this.options.language, 'user.errors.destroyingHimself') } diff --git a/backend/src/services/user/userEditor.ts b/backend/src/services/user/userEditor.ts index e413b23086..aa00e8aab7 100644 --- a/backend/src/services/user/userEditor.ts +++ b/backend/src/services/user/userEditor.ts @@ -1,7 +1,6 @@ import assert from 'assert' import { Error400 } from '@crowd/common' -import { TenantPlans } from '@crowd/types' import SequelizeRepository from '../../database/repositories/sequelizeRepository' import TenantUserRepository from '../../database/repositories/tenantUserRepository' @@ -88,10 +87,6 @@ export default class UserEditor { const { currentTenant } = this.options - if (currentTenant.plan === TenantPlans.Essential) { - return false - } - if (!currentTenant.planUserId) { return false } diff --git a/backend/src/types/unleashContext.ts b/backend/src/types/unleashContext.ts deleted file mode 100644 index 343ee59c5b..0000000000 --- a/backend/src/types/unleashContext.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum UnleashContextField { - TENANT_ID = 'tenantId', - PLAN = 'plan', - AUTOMATION_COUNT = 'automationCount', - MEMBER_ENRICHMENT_COUNT = 'memberEnrichmentCount', - CSV_EXPORT_COUNT = 'csvExportCount', -} diff --git a/backend/src/types/webhooks.ts b/backend/src/types/webhooks.ts deleted file mode 100644 index c7549e5ad1..0000000000 --- a/backend/src/types/webhooks.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseError } from './baseError' - -export enum WebhookState { - PENDING = 'PENDING', - PROCESSED = 'PROCESSED', - PROCESSING = 'PROCESSING', - ERROR = 'ERROR', -} - -export enum WebhookType { - GITHUB = 'GITHUB', - DISCORD = 'DISCORD', - DISCOURSE = 'DISCOURSE', - GROUPSIO = 'GROUPSIO', -} - -export enum DiscordWebsocketEvent { - MEMBER_ADDED = 'member_added', - MEMBER_UPDATED = 'member_updated', - MESSAGE_CREATED = 'message_created', - MESSAGE_UPDATED = 'message_updated', -} - -export interface DiscordWebsocketPayload { - event: DiscordWebsocketEvent - data: any -} - -export interface SendgridWebhookEvent { - email: string - url: string - event: SendgridWebhookEventType - ip: string - sg_content_type: string - sg_event_id: string - sg_machine_open: boolean - sg_message_id: string - sg_template_id: string - sg_template_name: string - tenantId: string - timestamp: number - useragent: string -} - -export enum SendgridWebhookEventType { - DIGEST_OPENED = 'open', - POST_CLICKED = 'click', -} - -export interface GithubWebhookPayload { - signature: string - event: string - data: any -} - -export type IncomingWebhookPayload = GithubWebhookPayload - -export interface IncomingWebhookData { - id: string - tenantId: string - integrationId: string - state: WebhookState - type: WebhookType - payload: IncomingWebhookPayload - processedAt: string | null - error: any | null - createdAt: string -} - -export interface DbIncomingWebhookInsertData { - tenantId: string - integrationId: string - type: WebhookType - payload: any -} - -export interface PendingWebhook { - id: string - tenantId: string -} - -export interface ErrorWebhook extends PendingWebhook {} - -export class WebhookError extends BaseError { - public webhookId: string - - constructor(webhookId: string, message: string, origError?: any) { - super(message, origError) - this.webhookId = webhookId - } -} diff --git a/backend/tsconfig.json b/backend/tsconfig.json index b824ec96fa..fa9447bbe7 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -17,10 +17,6 @@ }, "skipLibCheck": true }, - "include": [ - "src", - "src/database/initializers/sample-data.json", - "src/database/initializers/suggested-tasks.json" - ], + "include": ["src"], "exclude": ["node_modules"] } diff --git a/backend/util/openapi.json b/backend/util/openapi.json deleted file mode 100644 index bc6b7a31bc..0000000000 --- a/backend/util/openapi.json +++ /dev/null @@ -1 +0,0 @@ -{ "openapi": "", "info": { "title": "", "version": "" }, "paths": {} } diff --git a/backend/util/publish-docs.sh b/backend/util/publish-docs.sh deleted file mode 100644 index 35bd9175ad..0000000000 --- a/backend/util/publish-docs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/bash -npx openapi-comment-parser . openapi.json -npx rdme openapi openapi.json --key=$1 --id=6299c11fcb740e002310bae1 \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7afc5d0ec1..2f40ae0a30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,9 +84,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../services/libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../services/libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../services/libs/integrations @@ -276,9 +273,6 @@ importers: omit-deep-by-values: specifier: ^1.0.2 version: 1.0.2 - openapi-comment-parser: - specifier: ^1.0.0 - version: 1.0.0 passport: specifier: 0.6.0 version: 0.6.0 @@ -321,9 +315,6 @@ importers: socket.io: specifier: ^4.5.4 version: 4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - stripe: - specifier: ^10.0.0 - version: 10.17.0 superagent: specifier: ^8.0.0 version: 8.1.2 @@ -421,9 +412,6 @@ importers: eslint-plugin-import: specifier: ^2.25.4 version: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) - eslint-plugin-openapi: - specifier: ^0.0.4 - version: 0.0.4 jest: specifier: ^29.5.0 version: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) @@ -588,9 +576,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/logging': specifier: workspace:* version: link:../../libs/logging @@ -637,9 +622,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../../libs/integrations @@ -884,9 +866,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../../libs/integrations @@ -939,9 +918,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../../libs/integrations @@ -1040,9 +1016,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../../libs/integrations @@ -1110,9 +1083,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/logging': specifier: workspace:* version: link:../../libs/logging @@ -1165,9 +1135,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/logging': specifier: workspace:* version: link:../../libs/logging @@ -1257,9 +1224,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/logging': specifier: workspace:* version: link:../../libs/logging @@ -1482,9 +1446,6 @@ importers: '@crowd/data-access-layer': specifier: workspace:* version: link:../../libs/data-access-layer - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/logging': specifier: workspace:* version: link:../../libs/logging @@ -1562,9 +1523,6 @@ importers: '@crowd/database': specifier: workspace:* version: link:../../libs/database - '@crowd/feature-flags': - specifier: workspace:* - version: link:../../libs/feature-flags '@crowd/integrations': specifier: workspace:* version: link:../../libs/integrations @@ -1698,9 +1656,6 @@ importers: '@crowd/database': specifier: workspace:* version: link:../database - '@crowd/feature-flags': - specifier: workspace:* - version: link:../feature-flags '@crowd/logging': specifier: workspace:* version: link:../logging @@ -1807,31 +1762,6 @@ importers: specifier: ^5.6.3 version: 5.6.3 - services/libs/feature-flags: - dependencies: - '@crowd/common': - specifier: workspace:* - version: link:../common - '@crowd/logging': - specifier: workspace:* - version: link:../logging - '@crowd/redis': - specifier: workspace:* - version: link:../redis - '@crowd/types': - specifier: workspace:* - version: link:../types - unleash-client: - specifier: ^3.18.1 - version: 3.21.0 - devDependencies: - '@types/node': - specifier: ^18.16.3 - version: 18.19.31 - typescript: - specifier: ^5.6.3 - version: 5.6.3 - services/libs/integrations: dependencies: '@crowd/common': @@ -1929,9 +1859,6 @@ importers: '@crowd/database': specifier: workspace:* version: link:../database - '@crowd/feature-flags': - specifier: workspace:* - version: link:../feature-flags '@crowd/integrations': specifier: workspace:* version: link:../integrations @@ -3434,9 +3361,6 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@gitbeaker/core@40.2.1': resolution: {integrity: sha512-4RPpip70/NPo/3fx5TDrF88AwQxqK4OxzsheZnadhFM5O7YBp0lfkIH2c6zeMEwIRn2M5PleNK5mAe3qr00RQg==} engines: {node: '>=18.20.0'} @@ -3649,15 +3573,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - '@octokit/auth-app@3.6.1': resolution: {integrity: sha512-6oa6CFphIYI7NxxHrdVOzhG7hkcKyGyYocg7lNDSJVauVOLtylg8hNJzoUyPAYKKK0yUeoZamE/lMs2tG+S+JA==} @@ -4928,14 +4843,6 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -5321,10 +5228,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - cacheable-request@6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} @@ -5385,10 +5288,6 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -5403,10 +5302,6 @@ packages: cjs-module-lexer@1.3.1: resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - clearbit@1.3.5: resolution: {integrity: sha512-tlzF6XzgrT22+9tobCPnlJ1575QIy/wuAoVLUe/7Y6/Y4ZCbXSmVms5l9lbcrGqwmaiTZmhB/EQnimkt/m5ViQ==} @@ -5522,10 +5417,6 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - comment-parser@0.7.6: - resolution: {integrity: sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==} - engines: {node: '>= 6.0.0'} - component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -5990,9 +5881,6 @@ packages: erlpack@0.1.4: resolution: {integrity: sha512-CJYbkEvsB5FqCCu2tLxF1eYKi28PvemC12oqzJ9oO6mDFrFO9G9G7nNJUHhiAyyL9zfXTOJx/tOcrQk+ncD65w==} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -6132,9 +6020,6 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-openapi@0.0.4: - resolution: {integrity: sha512-0b9lOsmAJByARrLAmX2PcAsF37nZM9BP7fSSccJ3xrDJk62Y0VqBiVz9u5TA4DQmMhSkzSU6wF89kA2bcjOoZw==} - eslint-plugin-prettier@5.1.3: resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6429,10 +6314,6 @@ packages: fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs-monkey@1.0.5: resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} @@ -6554,11 +6435,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - global-dirs@2.1.0: resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} engines: {node: '>=8'} @@ -6754,9 +6630,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -6805,13 +6678,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - inflection@1.13.4: resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} engines: {'0': node >= 0.4.0} @@ -6847,13 +6713,6 @@ packages: resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} engines: {node: '>=0.10.0'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ip@1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6953,9 +6812,6 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -7271,9 +7127,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -7563,10 +7416,6 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -7653,10 +7502,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} @@ -7672,37 +7517,9 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - minipass@2.9.0: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -7710,10 +7527,6 @@ packages: minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -7758,10 +7571,6 @@ packages: resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==} hasBin: true - murmurhash3js@3.0.1: - resolution: {integrity: sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow==} - engines: {node: '>=0.10.0'} - mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -8034,11 +7843,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openapi-comment-parser@1.0.0: - resolution: {integrity: sha512-MEDYxnkXCFCb2pZ/rA/PT35WXlGihGVOcLQ3HiRYD2RDhRD860t/dEDh0TlJIGn2rYwLnRHl2juadGNfnabJ2Q==} - engines: {node: '>=10.0.0'} - hasBin: true - openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -8102,10 +7906,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} @@ -8404,18 +8204,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -8659,10 +8447,6 @@ packages: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -8910,10 +8694,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - snakeize@0.1.0: resolution: {integrity: sha512-ot3bb6pQt6IVq5G/JQ640ceSYTPtriVrwNyfoUw1LmQQGzPMAGxE5F+ded2UwSUCyf2PW1fFAYUnVEX21PWbpQ==} @@ -8933,14 +8713,6 @@ packages: resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} engines: {node: '>=10.2.0'} - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -8992,13 +8764,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -9107,10 +8872,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stripe@10.17.0: - resolution: {integrity: sha512-JHV2KoL+nMQRXu3m9ervCZZvi4DDCJfzHUE6CmtJxR9TmizyYfrVuhGvnsZLLnheby9Qrnf4Hq6iOEcejGwnGQ==} - engines: {node: ^8.1 || >=10.*} - strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -9175,10 +8936,6 @@ packages: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - teeny-request@7.2.0: resolution: {integrity: sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==} engines: {node: '>=10'} @@ -9486,14 +9243,6 @@ packages: unionfs@4.5.4: resolution: {integrity: sha512-qI3RvJwwdFcWUdZz1dWgAyLSfGlY2fS2pstvwkZBUTnkxjcnIvzriBLtqJTKz9FtArAvJeiVCqHlxhOw8Syfyw==} - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -9511,10 +9260,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unleash-client@3.21.0: - resolution: {integrity: sha512-I7eYhRyOia3oBZ9Tu1v+IlNO+XJgsjcMEO2+j+e4A7LTTKZvGoV8WPfDGGxiMPKBPHNUACkERB3YhCQ9jzTGoQ==} - engines: {node: '>=10', npm: '>=4.0.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -9938,9 +9683,9 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10181,11 +9926,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)': + '@aws-sdk/client-sso-oidc@3.572.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/core': 3.572.0 '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -10223,6 +9968,51 @@ snapshots: '@smithy/util-retry': 2.2.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/core': 3.572.0 + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/middleware-host-header': 3.567.0 + '@aws-sdk/middleware-logger': 3.568.0 + '@aws-sdk/middleware-recursion-detection': 3.567.0 + '@aws-sdk/middleware-user-agent': 3.572.0 + '@aws-sdk/region-config-resolver': 3.572.0 + '@aws-sdk/types': 3.567.0 + '@aws-sdk/util-endpoints': 3.572.0 + '@aws-sdk/util-user-agent-browser': 3.567.0 + '@aws-sdk/util-user-agent-node': 3.568.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/client-sts' - aws-crt @@ -10445,13 +10235,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': + '@aws-sdk/client-sts@3.572.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10488,7 +10278,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/client-sts@3.687.0': @@ -10646,9 +10435,26 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt + '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0)': + dependencies: + '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/credential-provider-env': 3.568.0 + '@aws-sdk/credential-provider-process': 3.572.0 + '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/types': 3.567.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.572.0 '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) @@ -10699,6 +10505,25 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.568.0 + '@aws-sdk/credential-provider-http': 3.568.0 + '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-process': 3.572.0 + '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/types': 3.567.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 @@ -10775,6 +10600,19 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt + '@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))': + dependencies: + '@aws-sdk/client-sso': 3.572.0 + '@aws-sdk/token-providers': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) + '@aws-sdk/types': 3.567.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': dependencies: '@aws-sdk/client-sso': 3.572.0 @@ -10815,7 +10653,7 @@ snapshots: '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.572.0)': dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) + '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/types': 2.12.0 @@ -11082,7 +10920,7 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt - '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': + '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) '@aws-sdk/types': 3.567.0 @@ -11091,6 +10929,15 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.6.2 + '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': + dependencies: + '@aws-sdk/client-sso-oidc': 3.572.0 + '@aws-sdk/types': 3.567.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + '@aws-sdk/token-providers@3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) @@ -12235,8 +12082,6 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@gar/promisify@1.1.3': {} - '@gitbeaker/core@40.2.1': dependencies: '@gitbeaker/requester-utils': 40.2.1 @@ -12601,16 +12446,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.0 - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - '@octokit/auth-app@3.6.1(encoding@0.1.13)': dependencies: '@octokit/auth-oauth-app': 4.3.4(encoding@0.1.13) @@ -14434,15 +14269,6 @@ snapshots: transitivePeerDependencies: - supports-color - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ajv-draft-04@1.0.0(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 @@ -14933,29 +14759,6 @@ snapshots: bytes@3.1.2: {} - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - cacheable-request@6.1.0: dependencies: clone-response: 1.0.3 @@ -15022,8 +14825,6 @@ snapshots: chownr@1.1.4: {} - chownr@2.0.0: {} - chrome-trace-event@1.0.3: {} ci-info@2.0.0: {} @@ -15032,8 +14833,6 @@ snapshots: cjs-module-lexer@1.3.1: {} - clean-stack@2.2.0: {} - clearbit@1.3.5: dependencies: bluebird: 2.11.0 @@ -15164,8 +14963,6 @@ snapshots: commander@6.2.1: {} - comment-parser@0.7.6: {} - component-emitter@1.3.1: {} component-type@1.2.2: {} @@ -15677,8 +15474,6 @@ snapshots: bindings: 1.5.0 nan: 2.19.0 - err-code@2.0.3: {} - error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -15895,10 +15690,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-openapi@0.0.4: - dependencies: - comment-parser: 0.7.6 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 @@ -16303,10 +16094,6 @@ snapshots: dependencies: minipass: 2.9.0 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs-monkey@1.0.5: {} fs.realpath@1.0.0: {} @@ -16474,14 +16261,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-dirs@2.1.0: dependencies: ini: 1.3.7 @@ -16727,10 +16506,6 @@ snapshots: human-signals@2.1.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - hyperdyperid@1.2.0: {} iconv-lite@0.4.24: @@ -16774,10 +16549,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - - infer-owner@1.0.4: {} - inflection@1.13.4: {} inflight@1.0.6: @@ -16805,13 +16576,6 @@ snapshots: invert-kv@1.0.0: {} - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - - ip@1.1.9: {} - ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} @@ -16892,8 +16656,6 @@ snapshots: is-interactive@1.0.0: {} - is-lambda@1.0.1: {} - is-negative-zero@2.0.3: {} is-npm@4.0.0: {} @@ -17403,8 +17165,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - jsesc@0.5.0: {} jsesc@2.5.2: {} @@ -17681,28 +17441,6 @@ snapshots: make-error@1.3.6: {} - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.5.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -17780,10 +17518,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 @@ -17798,52 +17532,17 @@ snapshots: minimist@1.2.8: {} - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - minipass@2.9.0: dependencies: safe-buffer: 5.2.1 yallist: 3.1.1 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.0.4: {} minizlib@1.3.3: dependencies: minipass: 2.9.0 - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -17879,8 +17578,6 @@ snapshots: int64-buffer: 0.1.10 isarray: 1.0.0 - murmurhash3js@3.0.1: {} - mute-stream@0.0.8: {} mv@2.1.1: @@ -18217,8 +17914,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openapi-comment-parser@1.0.0: {} - openapi-types@12.1.3: {} opentracing@0.14.7: {} @@ -18287,10 +17982,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 @@ -18567,13 +18258,6 @@ snapshots: process@0.11.10: {} - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -18874,8 +18558,6 @@ snapshots: - encoding - supports-color - retry@0.12.0: {} - retry@0.13.1: {} reusify@1.0.4: {} @@ -19159,8 +18841,6 @@ snapshots: slash@3.0.0: {} - smart-buffer@4.2.0: {} - snakeize@0.1.0: {} snowflake-sdk@1.15.0(asn1.js@5.4.1)(encoding@0.1.13): @@ -19232,19 +18912,6 @@ snapshots: - supports-color - utf-8-validate - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - source-map-js@1.2.0: {} source-map-loader@4.0.2(webpack@5.91.0(@swc/core@1.4.17)): @@ -19289,12 +18956,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - stack-trace@0.0.10: {} stack-utils@2.0.6: @@ -19403,11 +19064,6 @@ snapshots: strip-json-comments@3.1.1: {} - stripe@10.17.0: - dependencies: - '@types/node': 20.12.7 - qs: 6.12.1 - strnum@1.0.5: {} stubs@3.0.0: {} @@ -19501,15 +19157,6 @@ snapshots: safe-buffer: 5.2.1 yallist: 3.1.1 - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - teeny-request@7.2.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0 @@ -19828,14 +19475,6 @@ snapshots: dependencies: fs-monkey: 1.0.5 - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 - unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -19851,16 +19490,6 @@ snapshots: universalify@0.1.2: {} - unleash-client@3.21.0: - dependencies: - ip: 1.1.9 - make-fetch-happen: 10.2.1 - murmurhash3js: 3.0.1 - semver: 7.6.0 - transitivePeerDependencies: - - bluebird - - supports-color - unpipe@1.0.0: {} untildify@4.0.0: {} diff --git a/scripts/builders/backend.env b/scripts/builders/backend.env index 0d25b68d51..6406d000da 100644 --- a/scripts/builders/backend.env +++ b/scripts/builders/backend.env @@ -1,4 +1,4 @@ DOCKERFILE="./services/docker/Dockerfile.backend" CONTEXT="../" REPO="crowddotdev/backend" -SERVICES="api job-generator discord-ws" \ No newline at end of file +SERVICES="api job-generator" \ No newline at end of file diff --git a/scripts/cli b/scripts/cli index 935d1119f9..a68ccee589 100755 --- a/scripts/cli +++ b/scripts/cli @@ -597,7 +597,6 @@ function check_init_premium() { source_edition if [ $__CROWD_EDITION == "crowd-hosted" ]; then $_DC --compatibility -p $PROJECT_NAME -f $CLI_HOME/premium-scaffold.yaml up -d --build - init_unleash fi } @@ -605,11 +604,6 @@ function install_libs() { (cd $CLI_HOME/.. && pnpm i --frozen-lockfile) } -function init_unleash() { - install_libs - (cd $CLI_HOME/../backend && source source-local.sh && pnpm run script:unleash-init) -} - function up_scaffold() { scaffold_set_up_network "$PROJECT_NAME-bridge" $DOCKER_NETWORK_SUBNET $DOCKER_NETWORK_GATEWAY @@ -757,17 +751,17 @@ while test $# -gt 0; do exit ;; start-e2e) - declare -a INGORED_SERVICES=("job-generator" "discord-ws" "data-sink-worker" "integration-run-worker" "integration-stream-worker") + declare -a INGORED_SERVICES=("job-generator" "data-sink-worker" "integration-run-worker" "integration-stream-worker") start exit ;; start-be) - declare -a INGORED_SERVICES=("frontend" "discord-ws") + declare -a INGORED_SERVICES=("frontend") start exit ;; start-dev) - INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") DEV=1 start exit @@ -778,7 +772,7 @@ while test $# -gt 0; do exit ;; clean-start-dev) - # INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + # INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") CLEAN_START=1 DEV=1 start @@ -863,14 +857,14 @@ while test $# -gt 0; do exit ;; service-restart-fe-dev) - IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") DEV=1 kill_all_containers service_start exit ;; clean-start-fe-dev) - INGORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") CLEAN_START=1 DEV=1 start diff --git a/scripts/deploy/kubernetes/.backend.env b/scripts/deploy/kubernetes/.backend.env index 351fcc54ef..54072a547c 100644 --- a/scripts/deploy/kubernetes/.backend.env +++ b/scripts/deploy/kubernetes/.backend.env @@ -34,12 +34,6 @@ CROWD_DB_USERNAME=postgres CROWD_DB_PASSWORD=example CROWD_DB_DATABASE=crowd-web -CROWD_UNLEASH_DB_HOST=unleash-db-svc -CROWD_UNLEASH_DB_PORT=5432 -CROWD_UNLEASH_DB_USERNAME=postgres -CROWD_UNLEASH_DB_PASSWORD=example -CROWD_UNLEASH_DB_NAME=crowd-unleash - # Segment settings CROWD_SEGMENT_WRITE_KEY=TdX3BLaZuHpHyzN2lcDiNiRHDSH9Piyl diff --git a/scripts/deploy/kubernetes/unleash-db.yaml b/scripts/deploy/kubernetes/unleash-db.yaml deleted file mode 100644 index a18a174c30..0000000000 --- a/scripts/deploy/kubernetes/unleash-db.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: unleash-db-dpl -spec: - selector: - matchLabels: - app: unleash-db - template: - metadata: - labels: - app: unleash-db - spec: - containers: - - name: unleash-db - image: crowddotdev/db:1666904672.59dad54 - env: - - name: POSTGRES_PASSWORD - value: example - - name: POSTGRES_DB - value: crowd-unleash - ports: - - containerPort: 5432 ---- -apiVersion: v1 -kind: Service -metadata: - name: unleash-db-svc -spec: - type: ClusterIP - selector: - app: unleash-db - ports: - - port: 5432 - targetPort: 5432 diff --git a/scripts/deploy/kubernetes/unleash.yaml b/scripts/deploy/kubernetes/unleash.yaml deleted file mode 100644 index e50f207599..0000000000 --- a/scripts/deploy/kubernetes/unleash.yaml +++ /dev/null @@ -1,58 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: unleash-dpl -spec: - selector: - matchLabels: - app: unleash - template: - metadata: - labels: - app: unleash - spec: - containers: - - name: unleash - image: unleashorg/unleash-server:latest - env: - - name: DATABASE_HOST - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_UNLEASH_DB_HOST - - name: DATABASE_PORT - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_UNLEASH_DB_PORT - - name: DATABASE_NAME - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_UNLEASH_DB_NAME - - name: DATABASE_USERNAME - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_UNLEASH_DB_USERNAME - - name: DATABASE_PASSWORD - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_UNLEASH_DB_PASSWORD - - ports: - - containerPort: 4242 ---- -apiVersion: v1 -kind: Service -metadata: - name: unleash-svc -spec: - type: ClusterIP - selector: - app: unleash - ports: - - port: 4242 - targetPort: 4242 diff --git a/scripts/deploy/pre-built/scaffold-services.yaml b/scripts/deploy/pre-built/scaffold-services.yaml index f070b8483d..d212781a8a 100644 --- a/scripts/deploy/pre-built/scaffold-services.yaml +++ b/scripts/deploy/pre-built/scaffold-services.yaml @@ -68,49 +68,10 @@ services: networks: - crowd-bridge - unleash-db: - image: postgres:13.6-alpine - restart: always - environment: - - POSTGRES_PASSWORD=example - - POSTGRES_DB=crowd-unleash - ports: - - 5431:5432 - volumes: - - pgdata-unleash-dev:/var/lib/postgresql/data - healthcheck: - test: ['CMD-SHELL', 'pg_isready', '-d', 'crowd-unleash'] - interval: 30s - timeout: 60s - retries: 5 - start_period: 80s - networks: - - crowd-bridge - - # default user credentials: admin:unleash4all - unleash: - image: unleashorg/unleash-server:latest - restart: always - depends_on: - unleash-db: - condition: service_healthy - environment: - - DATABASE_HOST=unleash-db - - DATABASE_PORT=5432 - - DATABASE_NAME=crowd-unleash - - DATABASE_USERNAME=postgres - - DATABASE_PASSWORD=example - - DATABASE_SSL=false - ports: - - '4242:4242' - networks: - - crowd-bridge - networks: crowd-bridge: volumes: pgdata-dev: - pgdata-unleash-dev: search-dev: s3-dev: diff --git a/scripts/premium-scaffold.yaml b/scripts/premium-scaffold.yaml deleted file mode 100644 index 6bbb523307..0000000000 --- a/scripts/premium-scaffold.yaml +++ /dev/null @@ -1,47 +0,0 @@ -version: '3.1' - -services: - unleash-db: - image: postgres:13.6-alpine - restart: unless-stopped - environment: - - POSTGRES_PASSWORD=example - - POSTGRES_DB=crowd-unleash - ports: - - 5431:5432 - volumes: - - pgdata-unleash-dev:/var/lib/postgresql/data - healthcheck: - test: ['CMD-SHELL', 'pg_isready', '-d', 'crowd-unleash'] - interval: 30s - timeout: 60s - retries: 5 - start_period: 80s - networks: - - crowd-bridge - - # default user credentials: admin:unleash4all - unleash: - image: unleashorg/unleash-server:latest - restart: unless-stopped - depends_on: - unleash-db: - condition: service_healthy - environment: - - DATABASE_HOST=unleash-db - - DATABASE_PORT=5432 - - DATABASE_NAME=crowd-unleash - - DATABASE_USERNAME=postgres - - DATABASE_PASSWORD=example - - DATABASE_SSL=false - ports: - - '4242:4242' - networks: - - crowd-bridge - -networks: - crowd-bridge: - external: true - -volumes: - pgdata-unleash-dev: diff --git a/scripts/services/discord-ws.yaml b/scripts/services/discord-ws.yaml deleted file mode 100644 index 3054d38c6e..0000000000 --- a/scripts/services/discord-ws.yaml +++ /dev/null @@ -1,64 +0,0 @@ -version: '3.1' - -x-env-args: &env-args - DOCKER_BUILDKIT: 1 - NODE_ENV: docker - SERVICE: discord-ws - SHELL: /bin/sh - -services: - discord-ws: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.backend - command: 'pnpm run start:discord-ws' - working_dir: /usr/crowd/app/backend - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - restart: always - networks: - - crowd-bridge - - discord-ws-dev: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.backend - command: 'pnpm run start:discord-ws:dev' - working_dir: /usr/crowd/app/backend - # user: '${USER_ID}:${GROUP_ID}' - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - networks: - - crowd-bridge - volumes: - - ../../services/libs/audit-logs/src:/usr/crowd/app/services/libs/audit-logs/src - - ../../services/libs/common/src:/usr/crowd/app/services/libs/common/src - - ../../services/libs/common_services/src:/usr/crowd/app/services/libs/common_services/src - - ../../services/libs/data-access-layer/src:/usr/crowd/app/services/libs/data-access-layer/src - - ../../services/libs/database/src:/usr/crowd/app/services/libs/database/src - - ../../services/libs/feature-flags/src:/usr/crowd/app/services/libs/feature-flags/src - - ../../services/libs/integrations/src:/usr/crowd/app/services/libs/integrations/src - - ../../services/libs/logging/src:/usr/crowd/app/services/libs/logging/src - - ../../services/libs/opensearch/src:/usr/crowd/app/services/libs/opensearch/src - - ../../services/libs/questdb/src:/usr/crowd/app/services/libs/questdb/src - - ../../services/libs/queue/src:/usr/crowd/app/services/libs/queue/src - - ../../services/libs/redis/src:/usr/crowd/app/services/libs/redis/src - - ../../services/libs/telemetry/src:/usr/crowd/app/services/libs/telemetry/src - - ../../services/libs/temporal/src:/usr/crowd/app/services/libs/temporal/src - - ../../services/libs/types/src:/usr/crowd/app/services/libs/types/src - - ../../backend/src:/usr/crowd/app/backend/src - - /usr/crowd/app/backend/node_modules - -networks: - crowd-bridge: - external: true diff --git a/services/apps/cache_worker/package.json b/services/apps/cache_worker/package.json index 7a87100b19..d42f3a6465 100644 --- a/services/apps/cache_worker/package.json +++ b/services/apps/cache_worker/package.json @@ -15,7 +15,6 @@ "@crowd/archetype-standard": "workspace:*", "@crowd/archetype-worker": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/opensearch": "workspace:*", "@crowd/redis": "workspace:*", diff --git a/services/apps/cache_worker/src/activities/getTenantSegmentInfo.ts b/services/apps/cache_worker/src/activities/getTenantSegmentInfo.ts index e6775ee64c..971c0b2334 100644 --- a/services/apps/cache_worker/src/activities/getTenantSegmentInfo.ts +++ b/services/apps/cache_worker/src/activities/getTenantSegmentInfo.ts @@ -1,8 +1,6 @@ import SegmentRepository from '@crowd/data-access-layer/src/old/apps/cache_worker/segment.repo' import TenantRepository from '@crowd/data-access-layer/src/old/apps/cache_worker/tenant.repo' import { ISegment, ITenant } from '@crowd/data-access-layer/src/old/apps/cache_worker/types' -import { isFeatureEnabled } from '@crowd/feature-flags' -import { FeatureFlag } from '@crowd/types' import { svc } from '../main' @@ -35,7 +33,3 @@ export async function getProjectGroupLeafSegments( const segmentRepository = new SegmentRepository(svc.postgres.writer.connection(), svc.log) return segmentRepository.getProjectGroupLeafSegments(grandparentSlug, tenantId) } - -export async function isSegmentsEnabled(): Promise { - return isFeatureEnabled(FeatureFlag.SEGMENTS, null) -} diff --git a/services/apps/data_sink_worker/config/custom-environment-variables.json b/services/apps/data_sink_worker/config/custom-environment-variables.json index a505467b39..7f0b6cd332 100644 --- a/services/apps/data_sink_worker/config/custom-environment-variables.json +++ b/services/apps/data_sink_worker/config/custom-environment-variables.json @@ -19,10 +19,6 @@ "host": "CROWD_REDIS_HOST", "port": "CROWD_REDIS_PORT" }, - "unleash": { - "url": "CROWD_UNLEASH_URL", - "apiKey": "CROWD_UNLEASH_BACKEND_API_KEY" - }, "temporal": { "serverUrl": "CROWD_TEMPORAL_SERVER_URL", "namespace": "CROWD_TEMPORAL_NAMESPACE", diff --git a/services/apps/data_sink_worker/config/default.json b/services/apps/data_sink_worker/config/default.json index a33f0334d8..2410d7096c 100644 --- a/services/apps/data_sink_worker/config/default.json +++ b/services/apps/data_sink_worker/config/default.json @@ -2,7 +2,6 @@ "db": {}, "queue": {}, "redis": {}, - "unleash": {}, "temporal": { "automationsTaskQueue": "automations" }, diff --git a/services/apps/data_sink_worker/package.json b/services/apps/data_sink_worker/package.json index 6645534eb5..b5dc66983c 100644 --- a/services/apps/data_sink_worker/package.json +++ b/services/apps/data_sink_worker/package.json @@ -26,7 +26,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/opensearch": "workspace:*", diff --git a/services/apps/data_sink_worker/src/bin/erase-member.ts b/services/apps/data_sink_worker/src/bin/erase-member.ts index cdb979c534..8110144cb3 100644 --- a/services/apps/data_sink_worker/src/bin/erase-member.ts +++ b/services/apps/data_sink_worker/src/bin/erase-member.ts @@ -335,7 +335,6 @@ export async function deleteMemberFromDb(store: DbStore, memberId: string): Prom const tablesToDelete: Map = new Map([ ['activities', ['memberId']], ['memberNoMerge', ['memberId', 'noMergeId']], - ['memberNotes', ['memberId']], ['memberOrganizations', ['memberId']], ['memberTags', ['memberId']], ['memberSegments', ['memberId']], diff --git a/services/apps/data_sink_worker/src/conf/index.ts b/services/apps/data_sink_worker/src/conf/index.ts index 014a91be2a..42962612c3 100644 --- a/services/apps/data_sink_worker/src/conf/index.ts +++ b/services/apps/data_sink_worker/src/conf/index.ts @@ -1,8 +1,6 @@ import config from 'config' -import { SERVICE } from '@crowd/common' import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' -import { IUnleashConfig } from '@crowd/feature-flags' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' @@ -58,15 +56,6 @@ export const SLACK_ALERTING_CONFIG = (): ISlackAlertingConfig => { return slackAlertingConfig } -let unleashConfig: IUnleashConfig | undefined -export const UNLEASH_CONFIG = (): IUnleashConfig | undefined => { - if (unleashConfig) return unleashConfig - - unleashConfig = Object.assign({ appName: SERVICE }, config.get('unleash')) - - return unleashConfig -} - export interface IDataSinkWorkerTemporalConfig extends ITemporalConfig { automationsTaskQueue: string } diff --git a/services/apps/exports_worker/src/activities/members.ts b/services/apps/exports_worker/src/activities/members.ts index 1000a905d4..d5ec87a2c4 100644 --- a/services/apps/exports_worker/src/activities/members.ts +++ b/services/apps/exports_worker/src/activities/members.ts @@ -47,7 +47,6 @@ export async function buildAndUploadMembersCSV(input: ITriggerCSVExport): Promis const relations = [ { relation: 'organizations', attributes: ['displayName', 'website', 'logo'] }, - { relation: 'notes', attributes: ['body'] }, { relation: 'tags', attributes: ['name'] }, ] for (const relation of relations) { @@ -74,7 +73,6 @@ export async function buildAndUploadMembersCSV(input: ITriggerCSVExport): Promis 'activeOn', 'identities', 'tags', - 'notes', 'organizations', 'activityCount', 'lastActive', diff --git a/services/apps/integration_run_worker/config/custom-environment-variables.json b/services/apps/integration_run_worker/config/custom-environment-variables.json index 48c431eea9..a36d299cf4 100644 --- a/services/apps/integration_run_worker/config/custom-environment-variables.json +++ b/services/apps/integration_run_worker/config/custom-environment-variables.json @@ -16,10 +16,6 @@ "host": "CROWD_REDIS_HOST", "port": "CROWD_REDIS_PORT" }, - "unleash": { - "url": "CROWD_UNLEASH_URL", - "apiKey": "CROWD_UNLEASH_BACKEND_API_KEY" - }, "nango": { "url": "CROWD_NANGO_URL", "secretKey": "CROWD_NANGO_SECRET_KEY" diff --git a/services/apps/integration_run_worker/config/default.json b/services/apps/integration_run_worker/config/default.json index e335380d32..59e78866f0 100644 --- a/services/apps/integration_run_worker/config/default.json +++ b/services/apps/integration_run_worker/config/default.json @@ -2,7 +2,6 @@ "db": {}, "queue": {}, "redis": {}, - "unleash": {}, "nango": {}, "worker": { "maxRetries": 5, diff --git a/services/apps/integration_run_worker/package.json b/services/apps/integration_run_worker/package.json index 03f3de3b41..e48d005e4e 100644 --- a/services/apps/integration_run_worker/package.json +++ b/services/apps/integration_run_worker/package.json @@ -20,7 +20,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/opensearch": "workspace:*", diff --git a/services/apps/integration_run_worker/src/conf/index.ts b/services/apps/integration_run_worker/src/conf/index.ts index 450b0dd879..c116304b5e 100644 --- a/services/apps/integration_run_worker/src/conf/index.ts +++ b/services/apps/integration_run_worker/src/conf/index.ts @@ -2,7 +2,6 @@ import config from 'config' import { SERVICE } from '@crowd/common' import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' -import { IUnleashConfig } from '@crowd/feature-flags' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' @@ -100,15 +99,6 @@ export const SEARCH_SYNC_API_CONFIG = (): ISearchSyncApiConfig => { return config.get('searchSyncApi') } -let unleashConfig: IUnleashConfig | undefined -export const UNLEASH_CONFIG = (): IUnleashConfig | undefined => { - if (unleashConfig) return unleashConfig - - unleashConfig = Object.assign({ appName: SERVICE }, config.get('unleash')) - - return unleashConfig -} - let lokiDbConfig: ILokiDbConfig export const LOKI_DB_CONFIG = (): ILokiDbConfig => { if (lokiDbConfig) return lokiDbConfig diff --git a/services/apps/integration_stream_worker/config/custom-environment-variables.json b/services/apps/integration_stream_worker/config/custom-environment-variables.json index ec47bf5fd1..4603601cbf 100644 --- a/services/apps/integration_stream_worker/config/custom-environment-variables.json +++ b/services/apps/integration_stream_worker/config/custom-environment-variables.json @@ -16,10 +16,6 @@ "host": "CROWD_REDIS_HOST", "port": "CROWD_REDIS_PORT" }, - "unleash": { - "url": "CROWD_UNLEASH_URL", - "apiKey": "CROWD_UNLEASH_BACKEND_API_KEY" - }, "nango": { "url": "CROWD_NANGO_URL", "secretKey": "CROWD_NANGO_SECRET_KEY" diff --git a/services/apps/integration_stream_worker/config/default.json b/services/apps/integration_stream_worker/config/default.json index 8b7e6b4e81..df4b31bc02 100644 --- a/services/apps/integration_stream_worker/config/default.json +++ b/services/apps/integration_stream_worker/config/default.json @@ -2,7 +2,6 @@ "db": {}, "queue": {}, "redis": {}, - "unleash": {}, "nango": {}, "worker": { "maxStreamRetries": 5, diff --git a/services/apps/integration_stream_worker/package.json b/services/apps/integration_stream_worker/package.json index c50a483940..23dd8920fd 100644 --- a/services/apps/integration_stream_worker/package.json +++ b/services/apps/integration_stream_worker/package.json @@ -24,7 +24,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/queue": "workspace:*", diff --git a/services/apps/integration_stream_worker/src/conf/index.ts b/services/apps/integration_stream_worker/src/conf/index.ts index b0dd426d36..37820ebbfe 100644 --- a/services/apps/integration_stream_worker/src/conf/index.ts +++ b/services/apps/integration_stream_worker/src/conf/index.ts @@ -1,8 +1,6 @@ import config from 'config' -import { SERVICE } from '@crowd/common' import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' -import { IUnleashConfig } from '@crowd/feature-flags' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' import { QueuePriorityLevel } from '@crowd/types' @@ -78,12 +76,3 @@ export const PLATFORM_CONFIG = (platform: string): unknown | undefined => { return undefined } } - -let unleashConfig: IUnleashConfig | undefined -export const UNLEASH_CONFIG = (): IUnleashConfig | undefined => { - if (unleashConfig) return unleashConfig - - unleashConfig = Object.assign({ appName: SERVICE }, config.get('unleash')) - - return unleashConfig -} diff --git a/services/apps/members_enrichment_worker/package.json b/services/apps/members_enrichment_worker/package.json index 9555616b72..f402eafb70 100644 --- a/services/apps/members_enrichment_worker/package.json +++ b/services/apps/members_enrichment_worker/package.json @@ -19,7 +19,6 @@ "@crowd/common": "workspace:*", "@crowd/data-access-layer": "workspace:*", "@crowd/common_services": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/opensearch": "workspace:*", "@crowd/redis": "workspace:*", diff --git a/services/apps/merge_suggestions_worker/package.json b/services/apps/merge_suggestions_worker/package.json index 94198d4ea4..f62d77035f 100644 --- a/services/apps/merge_suggestions_worker/package.json +++ b/services/apps/merge_suggestions_worker/package.json @@ -17,7 +17,6 @@ "@crowd/archetype-worker": "workspace:*", "@crowd/common": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/opensearch": "workspace:*", "@crowd/types": "workspace:*", diff --git a/services/apps/merge_suggestions_worker/src/activities/common.ts b/services/apps/merge_suggestions_worker/src/activities/common.ts index 6f10a56e24..5310ddc2b5 100644 --- a/services/apps/merge_suggestions_worker/src/activities/common.ts +++ b/services/apps/merge_suggestions_worker/src/activities/common.ts @@ -6,9 +6,7 @@ import { performance } from 'perf_hooks' import { ITenant } from '@crowd/data-access-layer/src/old/apps/merge_suggestions_worker//types' import LLMSuggestionVerdictsRepository from '@crowd/data-access-layer/src/old/apps/merge_suggestions_worker/llmSuggestionVerdicts.repo' import TenantRepository from '@crowd/data-access-layer/src/old/apps/merge_suggestions_worker/tenant.repo' -import { isFeatureEnabled } from '@crowd/feature-flags' import { - FeatureFlag, ILLMConsumableMember, ILLMConsumableOrganization, ILLMSuggestionVerdict, @@ -21,25 +19,7 @@ export async function getAllTenants(): Promise { const tenantRepository = new TenantRepository(svc.postgres.writer.connection(), svc.log) const tenants = await tenantRepository.getAllTenants() - // map through the tenants array and resolve all promises - const tenantPromises: Promise[] = tenants.map(async (tenant) => - isFeatureEnabled( - FeatureFlag.TEMPORAL_MEMBER_MERGE_SUGGESTIONS, - async () => { - return { - tenantId: tenant.tenantId, - plan: tenant.plan, - } - }, - svc.unleash, - ), - ) - - // Wait for all promises to get resolved - const tenantsEnabled = await Promise.all(tenantPromises) - - // Filter out tenants where the feature is not enabled - return tenants.filter((_, index) => tenantsEnabled[index]) + return tenants } export async function getLLMResult( diff --git a/services/apps/organizations_enrichment_worker/package.json b/services/apps/organizations_enrichment_worker/package.json index 2d578cd70c..8c358ee7cd 100644 --- a/services/apps/organizations_enrichment_worker/package.json +++ b/services/apps/organizations_enrichment_worker/package.json @@ -17,7 +17,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/redis": "workspace:*", "@crowd/types": "workspace:*", diff --git a/services/apps/script_executor_worker/package.json b/services/apps/script_executor_worker/package.json index 8d1806ac97..713abab5cb 100644 --- a/services/apps/script_executor_worker/package.json +++ b/services/apps/script_executor_worker/package.json @@ -15,7 +15,6 @@ "@crowd/archetype-standard": "workspace:*", "@crowd/archetype-worker": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/redis": "workspace:*", "@crowd/types": "workspace:*", diff --git a/services/apps/webhook_api/config/custom-environment-variables.json b/services/apps/webhook_api/config/custom-environment-variables.json index 63edab6ffc..73ccf78ed5 100644 --- a/services/apps/webhook_api/config/custom-environment-variables.json +++ b/services/apps/webhook_api/config/custom-environment-variables.json @@ -10,10 +10,6 @@ "brokers": "CROWD_KAFKA_BROKERS", "extra": "CROWD_KAFKA_EXTRA" }, - "unleash": { - "url": "CROWD_UNLEASH_URL", - "apiKey": "CROWD_UNLEASH_BACKEND_API_KEY" - }, "redis": { "username": "CROWD_REDIS_USERNAME", "password": "CROWD_REDIS_PASSWORD", diff --git a/services/apps/webhook_api/config/default.json b/services/apps/webhook_api/config/default.json index ec1757d75e..ed511c61cd 100644 --- a/services/apps/webhook_api/config/default.json +++ b/services/apps/webhook_api/config/default.json @@ -2,7 +2,6 @@ "service": { "port": 8082 }, - "unleash": {}, "redis": {}, "db": {}, "queue": {} diff --git a/services/apps/webhook_api/package.json b/services/apps/webhook_api/package.json index 7ce3a489da..734fff28d4 100644 --- a/services/apps/webhook_api/package.json +++ b/services/apps/webhook_api/package.json @@ -15,7 +15,6 @@ "@crowd/common": "workspace:*", "@crowd/common_services": "workspace:*", "@crowd/data-access-layer": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/queue": "workspace:*", "@crowd/redis": "workspace:*", diff --git a/services/apps/webhook_api/src/conf/index.ts b/services/apps/webhook_api/src/conf/index.ts index 1385db4869..2907f5a8f3 100644 --- a/services/apps/webhook_api/src/conf/index.ts +++ b/services/apps/webhook_api/src/conf/index.ts @@ -1,8 +1,6 @@ import config from 'config' -import { SERVICE } from '@crowd/common' import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' -import { IUnleashConfig } from '@crowd/feature-flags' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' import { IGithubIssueReporterConfiguration } from '@crowd/types' @@ -35,15 +33,6 @@ export const DB_CONFIG = (): IDatabaseConfig => { return dbConfig } -let unleashConfig: IUnleashConfig | undefined -export const UNLEASH_CONFIG = (): IUnleashConfig | undefined => { - if (unleashConfig) return unleashConfig - - unleashConfig = Object.assign({ appName: SERVICE }, config.get('unleash')) - - return unleashConfig -} - let redisConfig: IRedisConfiguration export const REDIS_CONFIG = (): IRedisConfiguration => { if (redisConfig) return redisConfig diff --git a/services/archetypes/standard/package.json b/services/archetypes/standard/package.json index 2c0ab92a0e..ec0a2ce8fe 100644 --- a/services/archetypes/standard/package.json +++ b/services/archetypes/standard/package.json @@ -10,7 +10,6 @@ "dependencies": { "@crowd/common": "workspace:*", "@crowd/database": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/questdb": "workspace:*", diff --git a/services/archetypes/standard/src/index.ts b/services/archetypes/standard/src/index.ts index ff564d9e0e..51254b53c3 100644 --- a/services/archetypes/standard/src/index.ts +++ b/services/archetypes/standard/src/index.ts @@ -3,7 +3,6 @@ import { Kafka, Producer as KafkaProducer } from 'kafkajs' import pgpromise from 'pg-promise' import { DbConnection } from '@crowd/database' -import { Unleash as UnleashClient, getUnleashClient } from '@crowd/feature-flags' import { IIntegrationDescriptor, INTEGRATION_SERVICES } from '@crowd/integrations' import { Logger, getServiceLogger } from '@crowd/logging' import { getClientILP, getClientSQL } from '@crowd/questdb' @@ -73,8 +72,6 @@ export class Service { readonly config: Config readonly integrations: IIntegrationDescriptor[] - protected _unleash?: UnleashClient - protected _kafka: Kafka | null protected _temporal: TemporalClient | null @@ -101,10 +98,6 @@ export class Service { } } - get unleash(): UnleashClient | undefined { - return this._unleash - } - get producer(): KafkaProducer | null { if (!this.config.producer.enabled) { return null @@ -233,18 +226,6 @@ export class Service { await this.stop() }) - if ( - process.env['CROWD_EDITION'] === 'crowd-hosted' && - process.env['CROWD_UNLEASH_URL'] && - process.env['CROWD_UNLEASH_BACKEND_API_KEY'] - ) { - this._unleash = await getUnleashClient({ - url: process.env['CROWD_UNLEASH_URL'], - appName: this.name, - apiKey: process.env['CROWD_UNLEASH_BACKEND_API_KEY'], - }) - } - if (this.config.producer.enabled) { try { await this.producer.connect() @@ -307,9 +288,5 @@ export class Service { await this._questdbILP.flush() await this._questdbILP.close() } - - if (this._unleash) { - this._unleash.destroy() - } } } diff --git a/services/libs/common/src/i18n/en.ts b/services/libs/common/src/i18n/en.ts index 4c83b7581b..fb6a2d85c4 100644 --- a/services/libs/common/src/i18n/en.ts +++ b/services/libs/common/src/i18n/en.ts @@ -78,10 +78,6 @@ const en = { invitation: { notSameEmail: `This invitation was sent to {0} but you're signed in as {1}.`, }, - planActive: `There is a plan active for this workspace. Please cancel the plan first.`, - stripeNotConfigured: 'Please configure stripe first', - sampleDataCreationStarted: 'Sample data generation started.', - sampleDataDeletionCompleted: 'Sample data deletion completed.', errors: { publishedConversationExists: 'Update failed. Tenant already has published conversations.', nameRequiredOnCreate: 'Name is required on tenant creation.', diff --git a/services/libs/common/src/i18n/es.ts b/services/libs/common/src/i18n/es.ts index d1885ad3c7..614c5939c2 100644 --- a/services/libs/common/src/i18n/es.ts +++ b/services/libs/common/src/i18n/es.ts @@ -40,9 +40,6 @@ const es = { invitation: { notSameEmail: 'Esta invitación se envió a {0} pero has iniciado sesión como {1}.', }, - planActive: - 'Hay un plan activo para este espacio de trabajo. Por favor, cancele el plan primero.', - stripeNotConfigured: 'Stripe no está configurado.', }, importer: { errors: { diff --git a/services/libs/common_services/package.json b/services/libs/common_services/package.json index 34b023ece5..bab1481f59 100644 --- a/services/libs/common_services/package.json +++ b/services/libs/common_services/package.json @@ -15,7 +15,6 @@ "@aws-sdk/client-bedrock-runtime": "^3.572.0", "@crowd/common": "workspace:*", "@crowd/database": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/queue": "workspace:*", "@crowd/redis": "workspace:*", diff --git a/services/libs/data-access-layer/src/members/others.ts b/services/libs/data-access-layer/src/members/others.ts index 2b3b5ad7df..0fd652cdae 100644 --- a/services/libs/data-access-layer/src/members/others.ts +++ b/services/libs/data-access-layer/src/members/others.ts @@ -16,13 +16,6 @@ export interface IMemberTag { tagId: string } -export interface IMemberNote { - createdAt: string - updatedAt: string - memberId: string - noteId: string -} - export async function findMemberTasks(qx: QueryExecutor, memberId: string): Promise { return qx.select( ` @@ -51,20 +44,6 @@ export async function findMemberTags(qx: QueryExecutor, memberId: string): Promi ) } -export async function findMemberNotes(qx: QueryExecutor, memberId: string): Promise { - return qx.select( - ` - SELECT - * - FROM "memberNotes" - WHERE "memberId" = $(memberId) - `, - { - memberId, - }, - ) -} - export async function addMemberTags( qx: QueryExecutor, memberId: string, @@ -103,25 +82,6 @@ export async function addMemberTasks( ) } -export async function addMemberNotes( - qx: QueryExecutor, - memberId: string, - noteIds: string[], -): Promise { - return qx.result( - ` - INSERT INTO "memberNotes" ("createdAt", "updatedAt", "memberId", "noteId") - SELECT NOW(), NOW(), $(memberId), id - FROM unnest($(noteIds)::UUID[]) id - RETURNING * - `, - { - memberId, - noteIds, - }, - ) -} - export async function removeMemberTags( qx: QueryExecutor, memberId: string, @@ -158,24 +118,6 @@ export async function removeMemberTasks( ) } -export async function removeMemberNotes( - qx: QueryExecutor, - memberId: string, - noteIds: string[], -): Promise { - await qx.result( - ` - DELETE FROM "memberNotes" - WHERE "memberId" = $(memberId) - AND "noteId" = ANY($(noteIds)::UUID[]) - `, - { - memberId, - noteIds, - }, - ) -} - export async function updateMemberReach( qx: QueryExecutor, memberId: string, diff --git a/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts b/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts index 0f7bf611da..6d2607fde2 100644 --- a/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts @@ -285,20 +285,6 @@ export class DataRepository extends RepositoryBase { }), ) - // load notes - promises.push( - this.getMemberNotes(memberIds).then((notes) => { - for (const member of results) { - member.notes = notes - .filter((n) => n.memberId === member.id) - .map((n) => { - delete n.memberId - return n - }) - } - }), - ) - // load no merge promises.push( this.getMemberNoMerge(memberIds).then((noMerges) => { @@ -433,23 +419,6 @@ export class DataRepository extends RepositoryBase { return results } - async getMemberNotes(memberIds: string[]): Promise { - const results = await this.db().any( - ` - select mn."memberId", n.* - from "memberNotes" mn - inner join notes n on mn."noteId" = n.id - where mn."memberId" in ($(memberIds:csv)) - and n."deletedAt" is null; - `, - { - memberIds, - }, - ) - - return results - } - async getMemberTags(memberIds: string[]): Promise { const results = await this.db().any( ` diff --git a/services/libs/data-access-layer/src/others/index.ts b/services/libs/data-access-layer/src/others/index.ts index f9b04767e0..8875f94c4b 100644 --- a/services/libs/data-access-layer/src/others/index.ts +++ b/services/libs/data-access-layer/src/others/index.ts @@ -1,4 +1,4 @@ -import { INote, ITag, ITask } from '@crowd/types' +import { ITag, ITask } from '@crowd/types' import { QueryExecutor } from '../queryExecutor' @@ -29,17 +29,3 @@ export async function findTags(qx: QueryExecutor, tagIds: string[]): Promise { - return qx.select( - ` - SELECT - * - FROM "notes" - WHERE "id" = ANY($(noteIds)::UUID[]) - `, - { - noteIds, - }, - ) -} diff --git a/services/libs/feature-flags/package.json b/services/libs/feature-flags/package.json deleted file mode 100644 index d63d4a6fbd..0000000000 --- a/services/libs/feature-flags/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@crowd/feature-flags", - "main": "src/index.ts", - "scripts": { - "lint": "npx eslint --ext .ts src --max-warnings=0", - "format": "npx prettier --write \"src/**/*.ts\"", - "format-check": "npx prettier --check .", - "tsc-check": "tsc --noEmit" - }, - "devDependencies": { - "@types/node": "^18.16.3", - "typescript": "^5.6.3" - }, - "dependencies": { - "@crowd/common": "workspace:*", - "@crowd/logging": "workspace:*", - "@crowd/redis": "workspace:*", - "@crowd/types": "workspace:*", - "unleash-client": "^3.18.1" - } -} diff --git a/services/libs/feature-flags/src/index.ts b/services/libs/feature-flags/src/index.ts deleted file mode 100644 index 9c760464c2..0000000000 --- a/services/libs/feature-flags/src/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import EventEmitter from 'events' -import { Context, Unleash } from 'unleash-client' - -import { EDITION } from '@crowd/common' -import { getServiceChildLogger } from '@crowd/logging' -import { RedisCache, RedisClient } from '@crowd/redis' -import { Edition, FeatureFlag } from '@crowd/types' - -export interface IUnleashConfig { - url: string - appName: string - apiKey: string -} - -const log = getServiceChildLogger('feature-flags') - -let unleash: Unleash | undefined -export const getUnleashClient = async (cfg: IUnleashConfig): Promise => { - if (EDITION !== Edition.CROWD_HOSTED) { - return undefined - } - - if (unleash) { - return unleash - } - - unleash = new Unleash({ - url: `${cfg.url}/api`, - appName: cfg.appName, - customHeaders: { - Authorization: cfg.apiKey, - }, - }) - ;(unleash as unknown as EventEmitter).on('error', (err) => { - log.error(err, 'Unleash client error! Feature flags might not work correctly!') - }) - - let isReady = false - - const interval = setInterval(async () => { - if (!isReady) { - log.error('Unleash client is not ready yet, exiting...') - process.exit(1) - } - }, 60 * 1000) - - await new Promise((resolve) => { - ;(unleash as unknown as EventEmitter).on('ready', () => { - clearInterval(interval) - log.info('Unleash client is ready!') - isReady = true - resolve() - }) - }) - - return unleash -} - -export const isFeatureEnabled = async ( - flag: FeatureFlag, - contextLoader: UnleashContextLoader, - client?: Unleash, - redis?: RedisClient, - redisTimeoutSeconds?: number, - cacheKey?: string, -): Promise => { - if (flag === FeatureFlag.SEGMENTS) { - return EDITION === Edition.LFX - } - - if ([Edition.LFX, Edition.COMMUNITY].includes(EDITION)) { - return true - } - - if (!client) { - throw new Error('Unleash client is not initialized!') - } - - let cache: RedisCache | undefined - - if (redis && redisTimeoutSeconds && cacheKey) { - cache = new RedisCache('feature-flags', redis, log) - const result = await cache.get(`${flag}-${cacheKey}`) - if (result) { - return result === 'true' - } - } - - const enabled = client.isEnabled(flag, await contextLoader()) - - if (cache) { - await cache.set(`${flag}-${cacheKey}`, enabled.toString(), redisTimeoutSeconds || 60) - } - - return enabled -} - -export * from 'unleash-client' - -export type UnleashClient = Unleash -export type UnleashContextLoader = () => Promise diff --git a/services/libs/feature-flags/tsconfig.json b/services/libs/feature-flags/tsconfig.json deleted file mode 100644 index bf7f183850..0000000000 --- a/services/libs/feature-flags/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../base.tsconfig.json", - "include": ["src/**/*"] -} diff --git a/services/libs/opensearch/package.json b/services/libs/opensearch/package.json index 9699cc0315..42b456c1d1 100644 --- a/services/libs/opensearch/package.json +++ b/services/libs/opensearch/package.json @@ -15,7 +15,6 @@ "@crowd/common": "workspace:*", "@crowd/data-access-layer": "workspace:*", "@crowd/database": "workspace:*", - "@crowd/feature-flags": "workspace:*", "@crowd/integrations": "workspace:*", "@crowd/logging": "workspace:*", "@crowd/redis": "workspace:*", diff --git a/services/libs/opensearch/src/models/members.ts b/services/libs/opensearch/src/models/members.ts index 92e8f0e283..0d6a2d2a84 100644 --- a/services/libs/opensearch/src/models/members.ts +++ b/services/libs/opensearch/src/models/members.ts @@ -116,13 +116,6 @@ export class MembersOpensearch extends OpensearchModelBase { fromOpensearch: 'nested_organizations', }, }, - notes: { - type: OpensearchFieldType.NESTED, - customTranslation: { - toOpensearch: 'nested_notes.uuid_id', - fromOpensearch: 'nested_notes', - }, - }, tasks: { type: OpensearchFieldType.NESTED, customTranslation: { diff --git a/services/libs/opensearch/src/repo/member.data.ts b/services/libs/opensearch/src/repo/member.data.ts index 7bb1bb3acb..a54ca66031 100644 --- a/services/libs/opensearch/src/repo/member.data.ts +++ b/services/libs/opensearch/src/repo/member.data.ts @@ -84,7 +84,6 @@ export interface IDbMemberSyncData { tags: IDbMemberTagData[] toMergeIds: string[] noMergeIds: string[] - notes: IDbMemberNoteData[] tasks: IDbMemberTaskData[] } diff --git a/services/libs/opensearch/src/repo/member.repo.ts b/services/libs/opensearch/src/repo/member.repo.ts index 25c0915acf..f74c84e1c8 100644 --- a/services/libs/opensearch/src/repo/member.repo.ts +++ b/services/libs/opensearch/src/repo/member.repo.ts @@ -184,20 +184,6 @@ export class MemberRepository extends RepositoryBase { inner join segments s on s.id = msa."segmentId" where msa."memberId" = $(memberId) group by msa."memberId"), - member_notes as ( - select mn."memberId", - json_agg( - json_build_object( - 'id', n.id, - 'body', n.body - ) - ) as all_notes, - jsonb_agg(n.id) as all_ids - from "memberNotes" mn - inner join notes n on mn."noteId" = n.id - where mn."memberId" = $(memberId) - and n."deletedAt" is null - group by mn."memberId"), member_tasks as ( select mtk."memberId", json_agg( @@ -233,7 +219,6 @@ export class MemberRepository extends RepositoryBase { coalesce(mo.all_organizations, json_build_array()) as organizations, coalesce(mt.all_tags, json_build_array()) as tags, coalesce(ma.all_affiliations, json_build_array()) as affiliations, - coalesce(mn.all_notes, json_build_array()) as notes, coalesce(mtk.all_tasks, json_build_array()) as tasks, coalesce(tmd.to_merge_ids, array []::text[]) as "toMergeIds", coalesce(nmd.no_merge_ids, array []::text[]) as "noMergeIds" @@ -243,7 +228,6 @@ export class MemberRepository extends RepositoryBase { left join no_merge_data nmd on m.id = nmd."memberId" left join member_tags mt on m.id = mt."memberId" left join member_affiliations ma on m.id = ma."memberId" - left join member_notes mn on m.id = mn."memberId" left join member_tasks mtk on m.id = mtk."memberId" left join member_organizations mo on m.id = mo."memberId" where m.id = $(memberId) diff --git a/services/libs/opensearch/src/service/member.search.service.ts b/services/libs/opensearch/src/service/member.search.service.ts index 081083a46c..bf70f681c6 100644 --- a/services/libs/opensearch/src/service/member.search.service.ts +++ b/services/libs/opensearch/src/service/member.search.service.ts @@ -1,13 +1,11 @@ import merge from 'lodash.merge' import { DbConnection, DbStore } from '@crowd/database' -import { isFeatureEnabled } from '@crowd/feature-flags' import { ActivityDisplayService, DEFAULT_ACTIVITY_TYPE_SETTINGS } from '@crowd/integrations' import { Logger, getChildLogger } from '@crowd/logging' import { RedisClient } from '@crowd/redis' import { ActivityDisplayVariant, - FeatureFlag, IMemberAttributeData, OpenSearchIndex, PageData, @@ -88,12 +86,7 @@ export class MemberSearchService { }, }) - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, async () => { - return { - tenantId, - } - }) - if (segmentsEnabled && segments) { + if (segments) { // add segment filter parsed.query.bool.must.push({ terms: { diff --git a/services/libs/opensearch/src/service/organization.search.service.ts b/services/libs/opensearch/src/service/organization.search.service.ts index eb0944b968..79e2b5ec66 100644 --- a/services/libs/opensearch/src/service/organization.search.service.ts +++ b/services/libs/opensearch/src/service/organization.search.service.ts @@ -1,7 +1,6 @@ import { DbStore } from '@crowd/database' -import { isFeatureEnabled } from '@crowd/feature-flags' import { Logger, getChildLogger } from '@crowd/logging' -import { FeatureFlag, OpenSearchIndex } from '@crowd/types' +import { OpenSearchIndex } from '@crowd/types' import { FieldTranslatorFactory } from '../fieldTranslatorFactory' import { OpensearchQueryParser } from '../opensearchQueryParser' @@ -55,12 +54,7 @@ export class OrganizationSearchService { }, }) - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, async () => { - return { - tenantId, - } - }) - if (segmentsEnabled && segments) { + if (segments) { // add segment filter parsed.query.bool.must.push({ terms: { diff --git a/services/libs/types/src/enums/priorities.ts b/services/libs/types/src/enums/priorities.ts index 20a4663bc3..48bb435e9b 100644 --- a/services/libs/types/src/enums/priorities.ts +++ b/services/libs/types/src/enums/priorities.ts @@ -1,5 +1,3 @@ -import { TenantPlans } from './tenants' - export enum QueuePriorityLevel { SYSTEM = 'system', NORMAL = 'normal', @@ -9,5 +7,4 @@ export enum QueuePriorityLevel { export interface IQueuePriorityCalculationContext { onboarding?: boolean dbPriority?: QueuePriorityLevel | null - plan: TenantPlans } diff --git a/services/libs/types/src/enums/tenants.ts b/services/libs/types/src/enums/tenants.ts deleted file mode 100644 index 9758d95821..0000000000 --- a/services/libs/types/src/enums/tenants.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { FeatureFlag } from './featureFlags' - -export enum TenantPlans { - Essential = 'Essential', - Growth = 'Growth', - EagleEye = 'Eagle Eye', - Scale = 'Scale', - Enterprise = 'Enterprise', -} - -export const PLAN_LIMITS = { - [TenantPlans.Essential]: { - [FeatureFlag.AUTOMATIONS]: 2, - [FeatureFlag.CSV_EXPORT]: 2, - }, - [TenantPlans.Growth]: { - [FeatureFlag.AUTOMATIONS]: 10, - [FeatureFlag.CSV_EXPORT]: 10, - [FeatureFlag.MEMBER_ENRICHMENT]: 1000, - [FeatureFlag.ORGANIZATION_ENRICHMENT]: 200, - }, - [TenantPlans.Scale]: { - [FeatureFlag.AUTOMATIONS]: 20, - [FeatureFlag.CSV_EXPORT]: 20, - [FeatureFlag.MEMBER_ENRICHMENT]: Infinity, - [FeatureFlag.ORGANIZATION_ENRICHMENT]: Infinity, - }, - [TenantPlans.Enterprise]: { - [FeatureFlag.AUTOMATIONS]: Infinity, - [FeatureFlag.CSV_EXPORT]: Infinity, - [FeatureFlag.MEMBER_ENRICHMENT]: Infinity, - [FeatureFlag.ORGANIZATION_ENRICHMENT]: Infinity, - }, -} diff --git a/services/libs/types/src/index.ts b/services/libs/types/src/index.ts index 80b18419ee..9afd72e835 100644 --- a/services/libs/types/src/index.ts +++ b/services/libs/types/src/index.ts @@ -33,8 +33,6 @@ export * from './tags' export * from './tasks' -export * from './notes' - export * from './attributes' export * from './automations' diff --git a/services/libs/types/src/merging.ts b/services/libs/types/src/merging.ts index 3a974caf75..0612b49ee2 100644 --- a/services/libs/types/src/merging.ts +++ b/services/libs/types/src/merging.ts @@ -8,7 +8,6 @@ import { IMemberRenderFriendlyRole, IMemberRoleWithOrganization, IMemberUsername, - INote, IOrganization, ITag, ITask, @@ -47,7 +46,6 @@ export interface IMemberUnmergeBackup { tags: ITag[] reach: IMemberReach tasks: ITask[] - notes: INote[] joinedAt: string tenantId: string username: IMemberUsername @@ -64,7 +62,6 @@ export interface IMemberUnmergeBackup { export interface IMemberUnmergePreviewResult { id: string tags: ITag[] - notes: INote[] reach: IMemberReach tasks: ITask[] joinedAt: string From 20a38488df37bbaf6a4819a609a433bfcc887211 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 6 Jan 2025 13:28:45 +0530 Subject: [PATCH 02/25] wip: rm tasks --- backend/package.json | 1 - backend/src/api/index.ts | 1 - backend/src/api/task/index.ts | 14 - backend/src/api/task/taskAutocomplete.ts | 11 - backend/src/api/task/taskBatchOperations.ts | 38 -- backend/src/api/task/taskCreate.ts | 33 -- backend/src/api/task/taskDestroy.ts | 26 - backend/src/api/task/taskFind.ts | 26 - backend/src/api/task/taskImport.ts | 13 - backend/src/api/task/taskList.ts | 11 - backend/src/api/task/taskQuery.ts | 31 -- backend/src/api/task/taskUpdate.ts | 60 -- backend/src/database/models/index.ts | 1 - backend/src/database/models/member.ts | 5 - backend/src/database/models/task.ts | 102 ---- .../repositories/activityRepository.ts | 29 +- .../filters/__tests__/queryParser.test.ts | 123 +---- .../database/repositories/memberRepository.ts | 60 +- .../database/repositories/taskRepository.ts | 520 ------------------ .../src/database/utils/sequelizeTestUtils.ts | 4 - backend/src/security/permissions.ts | 31 -- .../services/__tests__/taskService.test.ts | 301 ---------- .../services/__tests__/tenantService.test.ts | 14 +- backend/src/services/memberService.ts | 48 +- backend/src/services/taskService.ts | 224 -------- backend/src/services/tenantService.ts | 8 - pnpm-lock.yaml | 148 ++--- .../data_sink_worker/src/bin/erase-member.ts | 1 - services/libs/common/src/i18n/en.ts | 6 - .../data-access-layer/src/members/others.ts | 58 -- .../old/apps/automations_worker/data.repo.ts | 31 -- .../data-access-layer/src/others/index.ts | 16 +- .../libs/opensearch/src/models/members.ts | 7 - .../libs/opensearch/src/repo/member.data.ts | 10 - .../libs/opensearch/src/repo/member.repo.ts | 22 +- services/libs/types/src/index.ts | 2 - services/libs/types/src/merging.ts | 3 - services/libs/types/src/tasks.ts | 15 - 38 files changed, 75 insertions(+), 1979 deletions(-) delete mode 100644 backend/src/api/task/index.ts delete mode 100644 backend/src/api/task/taskAutocomplete.ts delete mode 100644 backend/src/api/task/taskBatchOperations.ts delete mode 100644 backend/src/api/task/taskCreate.ts delete mode 100644 backend/src/api/task/taskDestroy.ts delete mode 100644 backend/src/api/task/taskFind.ts delete mode 100644 backend/src/api/task/taskImport.ts delete mode 100644 backend/src/api/task/taskList.ts delete mode 100644 backend/src/api/task/taskQuery.ts delete mode 100644 backend/src/api/task/taskUpdate.ts delete mode 100644 backend/src/database/models/task.ts delete mode 100644 backend/src/database/repositories/taskRepository.ts delete mode 100644 backend/src/services/__tests__/taskService.test.ts delete mode 100644 backend/src/services/taskService.ts delete mode 100644 services/libs/types/src/tasks.ts diff --git a/backend/package.json b/backend/package.json index 23207e081c..be9fdfc2db 100644 --- a/backend/package.json +++ b/backend/package.json @@ -121,7 +121,6 @@ "slack-block-builder": "^2.7.2", "socket.io": "^4.5.4", "superagent": "^8.0.0", - "swagger-ui-dist": "4.1.3", "tsconfig-paths": "^4.2.0", "utf-8-validate": "^5.0.10", "uuid": "^9.0.0", diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 418c4bc110..8aa17915d6 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -194,7 +194,6 @@ setImmediate(async () => { require('./conversation').default(routes) require('./eagleEyeContent').default(routes) require('./automation').default(routes) - require('./task').default(routes) require('./organization').default(routes) require('./quickstart-guide').default(routes) require('./slack').default(routes) diff --git a/backend/src/api/task/index.ts b/backend/src/api/task/index.ts deleted file mode 100644 index 45cc7c6b5e..0000000000 --- a/backend/src/api/task/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - app.post(`/tenant/:tenantId/task/query`, safeWrap(require('./taskQuery').default)) - app.post(`/tenant/:tenantId/task`, safeWrap(require('./taskCreate').default)) - app.put(`/tenant/:tenantId/task/:id`, safeWrap(require('./taskUpdate').default)) - app.put(`/tenant/:tenantId/task/:id`, safeWrap(require('./taskUpdate').default)) - app.post(`/tenant/:tenantId/task/import`, safeWrap(require('./taskImport').default)) - app.delete(`/tenant/:tenantId/task`, safeWrap(require('./taskDestroy').default)) - app.get(`/tenant/:tenantId/task/autocomplete`, safeWrap(require('./taskAutocomplete').default)) - app.get(`/tenant/:tenantId/task`, safeWrap(require('./taskList').default)) - app.get(`/tenant/:tenantId/task/:id`, safeWrap(require('./taskFind').default)) - app.post(`/tenant/:tenantId/task/batch`, safeWrap(require('./taskBatchOperations').default)) -} diff --git a/backend/src/api/task/taskAutocomplete.ts b/backend/src/api/task/taskAutocomplete.ts deleted file mode 100644 index 17ff10de69..0000000000 --- a/backend/src/api/task/taskAutocomplete.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskAutocomplete) - - const payload = await new TaskService(req).findAllAutocomplete(req.query.query, req.query.limit) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskBatchOperations.ts b/backend/src/api/task/taskBatchOperations.ts deleted file mode 100644 index 339bcd457a..0000000000 --- a/backend/src/api/task/taskBatchOperations.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Error400 } from '@crowd/common' - -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/task/batch - * @summary Make batch operations on tasks - * @tag Tasks - * @security Bearer - * @description Make batch operations on tasks - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {TaskBatchInput} application/json - * @response 200 - Ok - * @responseContent {TaskFindAndUpdateAll} 200.application/json - * @responseExample {TaskFindAndUpdateAll} 200.application/json.Task - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskBatch) - - let payload - switch (req.body.operation) { - case 'findAndUpdateAll': - payload = await new TaskService(req).findAndUpdateAll(req.body.payload) - break - case 'findAndDeleteAll': - payload = await new TaskService(req).findAndDeleteAll(req.body.payload) - break - default: - throw new Error400('en', 'tasks.errors.unknownBatchOperation', req.body.operation) - } - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskCreate.ts b/backend/src/api/task/taskCreate.ts deleted file mode 100644 index dd5ac50d90..0000000000 --- a/backend/src/api/task/taskCreate.ts +++ /dev/null @@ -1,33 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/task - * @summary Create a task - * @tag Tasks - * @security Bearer - * @description Create a task - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {TaskInput} application/json - * @response 200 - Ok - * @responseContent {Task} 200.application/json - * @responseExample {Task} 200.application/json.Task - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskCreate) - - const payload = await new TaskService(req).create(req.body) - - track( - 'Task Created', - { id: payload.id, dueDate: payload.dueDate, members: payload.members }, - { ...req }, - ) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskDestroy.ts b/backend/src/api/task/taskDestroy.ts deleted file mode 100644 index 67be2d58dd..0000000000 --- a/backend/src/api/task/taskDestroy.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * DELETE /tenant/{tenantId}/task/{id} - * @summary Delete a task - * @tag Tasks - * @security Bearer - * @description Delete a task. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} id - The ID of the task - * @response 200 - Ok - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskDestroy) - - await new TaskService(req).destroyAll(req.query.ids) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskFind.ts b/backend/src/api/task/taskFind.ts deleted file mode 100644 index b66012d739..0000000000 --- a/backend/src/api/task/taskFind.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * GET /tenant/{tenantId}/task/{id} - * @summary Find a task - * @tag Tasks - * @security Bearer - * @description Find a task by ID - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} id - The ID of the task - * @response 200 - Ok - * @responseContent {TaskResponse} 200.application/json - * @responseExample {Task} 200.application/json.Task - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskRead) - - const payload = await new TaskService(req).findById(req.params.id) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskImport.ts b/backend/src/api/task/taskImport.ts deleted file mode 100644 index b2b9ec5f18..0000000000 --- a/backend/src/api/task/taskImport.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskImport) - - await new TaskService(req).import(req.body, req.body.importHash) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskList.ts b/backend/src/api/task/taskList.ts deleted file mode 100644 index 95daf332cf..0000000000 --- a/backend/src/api/task/taskList.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskRead) - - const payload = await new TaskService(req).findAndCountAll(req.query) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskQuery.ts b/backend/src/api/task/taskQuery.ts deleted file mode 100644 index 4354d48b65..0000000000 --- a/backend/src/api/task/taskQuery.ts +++ /dev/null @@ -1,31 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/task/query - * @summary Query tasks - * @tag Tasks - * @security Bearer - * @description Query tasks. It accepts filters, sorting options and pagination. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {TaskQuery} application/json - * @response 200 - Ok - * @responseContent {TaskList} 200.application/json - * @responseExample {TaskList} 200.application/json.Task - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskRead) - - const payload = await new TaskService(req).query(req.body) - - if (req.body?.filter && Object.keys(req.body.filter).length > 0) { - track('Tasks Advanced Filter', { ...req.body }, { ...req }) - } - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/task/taskUpdate.ts b/backend/src/api/task/taskUpdate.ts deleted file mode 100644 index 4ab2daf8a7..0000000000 --- a/backend/src/api/task/taskUpdate.ts +++ /dev/null @@ -1,60 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import TaskService from '../../services/taskService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * PUT /tenant/{tenantId}/task/{id} - * @summary Update an task - * @tag Tasks - * @security Bearer - * @description Update a task - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} id - The ID of the task - * @bodyContent {TaskInput} application/json - * @response 200 - Ok - * @responseContent {Task} 200.application/json - * @responseExample {Task} 200.application/json.Task - * @response 401 - Unauthorized - * @response 404 - Not found - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.taskEdit) - - const taskBeforeUpdate = await new TaskService(req).findById(req.params.id) - const payload = await new TaskService(req).update(req.params.id, req.body) - - if (taskBeforeUpdate.type === 'suggested') { - track( - 'Task Created (from suggestion)', - { id: payload.id, dueDate: payload.dueDate, members: payload.members }, - { ...req }, - ) - } - if (taskBeforeUpdate.status === 'in-progress' && payload.status === 'done') { - track( - 'Task Completed', - { - id: payload.id, - dueDate: payload.dueDate, - members: payload.members, - status: payload.status, - }, - { ...req }, - ) - } else { - track( - 'Task Updated', - { - id: payload.id, - dueDate: payload.dueDate, - members: payload.members, - status: payload.status, - }, - { ...req }, - ) - } - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/database/models/index.ts b/backend/src/database/models/index.ts index 9f67e637bb..30a6717e1a 100644 --- a/backend/src/database/models/index.ts +++ b/backend/src/database/models/index.ts @@ -135,7 +135,6 @@ async function models(queryTimeoutMilliseconds: number, databaseHostnameOverride require('./automationExecution').default, require('./organization').default, require('./memberAttributeSettings').default, - require('./task').default, require('./note').default, require('./segment').default, require('./customView').default, diff --git a/backend/src/database/models/member.ts b/backend/src/database/models/member.ts index 09618faa39..11b82d4af6 100644 --- a/backend/src/database/models/member.ts +++ b/backend/src/database/models/member.ts @@ -109,11 +109,6 @@ export default (sequelize) => { through: 'memberSegments', timestamps: false, }) - - models.member.belongsToMany(models.task, { - as: 'tasks', - through: 'memberTasks', - }) models.member.belongsToMany(models.tag, { as: 'tags', diff --git a/backend/src/database/models/task.ts b/backend/src/database/models/task.ts deleted file mode 100644 index efba666bfd..0000000000 --- a/backend/src/database/models/task.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { DataTypes } from 'sequelize' - -export default (sequelize) => { - const task = sequelize.define( - 'task', - { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, - }, - name: { - type: DataTypes.TEXT, - allowNull: false, - }, - body: { - type: DataTypes.TEXT, - }, - type: { - type: DataTypes.STRING(255), - validate: { - isIn: [['regular', 'suggested']], - }, - defaultValue: 'regular', - }, - status: { - type: DataTypes.STRING(255), - validate: { - isIn: [['in-progress', 'done', 'archived']], - }, - defaultValue: 'in-progress', - }, - dueDate: { - type: DataTypes.DATE, - }, - importHash: { - type: DataTypes.STRING(255), - allowNull: true, - validate: { - len: [0, 255], - }, - }, - }, - { - indexes: [ - { - unique: true, - fields: ['importHash', 'tenantId'], - where: { - deletedAt: null, - }, - }, - { - fields: ['name', 'tenantId'], - where: { - deletedAt: null, - }, - }, - ], - timestamps: true, - paranoid: true, - }, - ) - - task.associate = (models) => { - models.task.belongsToMany(models.member, { - as: 'members', - through: 'memberTasks', - foreignKey: 'taskId', - }) - - models.task.belongsTo(models.tenant, { - as: 'tenant', - foreignKey: { - allowNull: false, - }, - }) - - models.task.belongsTo(models.segment, { - as: 'segment', - foreignKey: { - allowNull: false, - }, - }) - - models.task.belongsToMany(models.user, { - as: 'assignees', - through: 'taskAssignees', - foreignKey: 'taskId', - }) - - models.task.belongsTo(models.user, { - as: 'createdBy', - }) - - models.task.belongsTo(models.user, { - as: 'updatedBy', - }) - } - - return task -} diff --git a/backend/src/database/repositories/activityRepository.ts b/backend/src/database/repositories/activityRepository.ts index 4982faef1d..c6d3192f85 100644 --- a/backend/src/database/repositories/activityRepository.ts +++ b/backend/src/database/repositories/activityRepository.ts @@ -87,11 +87,6 @@ class ActivityRepository { }, ]) - // TODO uros set tasks if any - // await record.setTasks(data.tasks || [], { - // transaction, - // }) - if (ids.length !== 1) { throw new Error('Activity was not created!') } @@ -205,10 +200,10 @@ class ActivityRepository { } if (loadChildren) { - return this._populateRelations(results.rows[0], true, options) + return this._populateRelations(results.rows[0], options) } - return this._populateRelations(results.rows[0], false, options) + return this._populateRelations(results.rows[0], options) } /** @@ -235,7 +230,7 @@ class ActivityRepository { return null } - return this._populateRelations(results.rows[0], true, options) + return this._populateRelations(results.rows[0], options) } static async filterIdInTenant(id, options: IRepositoryOptions) { @@ -453,7 +448,7 @@ class ActivityRepository { order, }) - rows = await this._populateRelationsForRows(rows, false, options) + rows = await this._populateRelationsForRows(rows, options) const organizationIds = uniq(rows.map((r) => r.organizationId)) const qx = SequelizeRepository.getQueryExecutor(options) @@ -850,7 +845,7 @@ class ActivityRepository { transaction: SequelizeRepository.getTransaction(options), }) - rows = await this._populateRelationsForRows(rows, true, options) + rows = await this._populateRelationsForRows(rows, options) return { rows, count, limit: parsed.limit, offset: parsed.offset } } @@ -935,19 +930,18 @@ class ActivityRepository { } } - static async _populateRelationsForRows(rows, loadTasks: boolean, options: IRepositoryOptions) { + static async _populateRelationsForRows(rows, options: IRepositoryOptions) { if (!rows) { return rows } - return Promise.all(rows.map((record) => this._populateRelations(record, loadTasks, options))) + return Promise.all(rows.map((record) => this._populateRelations(record, options))) } - static async _populateRelations(record, loadTasks: boolean, options: IRepositoryOptions) { + static async _populateRelations(record, options: IRepositoryOptions) { if (!record) { return record } - const transaction = SequelizeRepository.getTransaction(options) const output = record.get({ plain: true }) @@ -963,13 +957,6 @@ class ActivityRepository { ) } - if (loadTasks) { - output.tasks = await record.getTasks({ - transaction, - joinTableAttributes: [], - }) - } - return output } } diff --git a/backend/src/database/repositories/filters/__tests__/queryParser.test.ts b/backend/src/database/repositories/filters/__tests__/queryParser.test.ts index 86e6c8ccd5..0c2f232cd4 100644 --- a/backend/src/database/repositories/filters/__tests__/queryParser.test.ts +++ b/backend/src/database/repositories/filters/__tests__/queryParser.test.ts @@ -331,91 +331,7 @@ describe('QueryParser tests', () => { } expect(parsed).toStrictEqual(expected) }) - it('With many to many relations', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const parser = new QueryParser( - { - manyToMany: { - members: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'memberTasks', - from: 'taskId', - to: 'memberId', - }, - }, - activities: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'activityTasks', - from: 'taskId', - to: 'activityId', - }, - }, - }, - }, - mockIRepositoryOptions, - ) - - const aid1 = uuid() - const aid2 = uuid() - const mid1 = uuid() - - const parsed = parser.parse({ - filter: { - or: [ - { - members: [mid1], - activities: [aid1, aid2], - }, - { - status: { - eq: 'some-task-name', - }, - }, - ], - }, - orderBy: [], - }) - const expected = { - where: { - tenantId: mockIRepositoryOptions.currentTenant.id, - segmentId: mockIRepositoryOptions.currentSegments.map((s) => s.id), - [Op.or]: [ - { - [Op.and]: [ - Sequelize.where( - Sequelize.literal(`"task"."id"`), - Op.in, - Sequelize.literal( - `(SELECT "tasks"."id" FROM "tasks" INNER JOIN "memberTasks" ON "memberTasks"."taskId" = "tasks"."id" WHERE "memberTasks"."memberId" = '${mid1}')`, - ), - ), - Sequelize.where( - Sequelize.literal(`"task"."id"`), - Op.in, - Sequelize.literal( - `(SELECT "tasks"."id" FROM "tasks" INNER JOIN "activityTasks" ON "activityTasks"."taskId" = "tasks"."id" WHERE "activityTasks"."activityId" = '${aid1}' OR "activityTasks"."activityId" = '${aid2}')`, - ), - ), - ], - }, - { - status: { - [Op.eq]: 'some-task-name', - }, - }, - ], - }, - limit: 10, - offset: 0, - order: [], - } - expect(parsed).toStrictEqual(expected) - }) - it('With nested fields, complex operators, aggregators and many to many', async () => { + it('With nested fields, complex operators and aggregators', async () => { const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) const parser = new QueryParser( { @@ -430,33 +346,10 @@ describe('QueryParser tests', () => { ), platform: Sequelize.literal(`"activities"."platform"`), }, - manyToMany: { - members: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'memberTasks', - from: 'taskId', - to: 'memberId', - }, - }, - activities: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'activityTasks', - from: 'taskId', - to: 'activityId', - }, - }, - }, }, mockIRepositoryOptions, ) - const aid1 = uuid() - const aid2 = uuid() - const parsed = parser.parse({ filter: { sentiment: { @@ -482,9 +375,6 @@ describe('QueryParser tests', () => { }, ], }, - { - activities: [aid1, aid2], - }, ], }, orderBy: ['dueDate_DESC', 'createdAt_ASC'], @@ -531,17 +421,6 @@ describe('QueryParser tests', () => { }, ], }, - { - [Op.and]: [ - Sequelize.where( - Sequelize.literal(`"task"."id"`), - Op.in, - Sequelize.literal( - `(SELECT "tasks"."id" FROM "tasks" INNER JOIN "activityTasks" ON "activityTasks"."taskId" = "tasks"."id" WHERE "activityTasks"."activityId" = '${aid1}' OR "activityTasks"."activityId" = '${aid2}')`, - ), - ), - ], - }, ], }, limit: 101, diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index 90e16c9d95..507b48a6e0 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -53,7 +53,6 @@ import { FieldTranslatorFactory, OpensearchQueryParser } from '@crowd/opensearch import { ALL_PLATFORM_TYPES, ActivityDisplayVariant, - FeatureFlag, IMemberIdentity, IMemberOrganization, IMemberUsername, @@ -75,7 +74,6 @@ import { KUBE_MODE, SERVICE } from '@/conf' import { ServiceType } from '@/conf/configTypes' import { IFetchMemberMergeSuggestionArgs, SimilarityScoreRange } from '@/types/mergeSuggestionTypes' -import isFeatureEnabled from '../../feature-flags/isFeatureEnabled' import { PlatformIdentities } from '../../serverless/integrations/types/messageTypes' import { MemberSegmentAffiliation, @@ -198,10 +196,6 @@ class MemberRepository { await MemberRepository.updateMemberOrganizations(record, data.organizations, true, options) - await record.setTasks(data.tasks || [], { - transaction, - }) - await record.setNoMerge(data.noMerge || [], { transaction, }) @@ -1001,12 +995,6 @@ class MemberRepository { }) } - if (data.tasks) { - await record.setTasks(data.tasks || [], { - transaction, - }) - } - await MemberRepository.updateMemberOrganizations( record, data.organizations, @@ -1772,8 +1760,6 @@ class MemberRepository { ): Promise> { const tenant = SequelizeRepository.getCurrentTenant(options) - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, options) - const segment = segments[0] const translator = FieldTranslatorFactory.getTranslator( @@ -1803,7 +1789,7 @@ class MemberRepository { }, }) - if (segmentsEnabled && segment) { + if (segment) { // add segment filter parsed.query.bool.must.push({ term: { @@ -2655,12 +2641,6 @@ class MemberRepository { }) MemberRepository.sortOrganizations(output.organizations) - output.tasks = await record.getTasks({ - transaction, - order: [['createdAt', 'ASC']], - joinTableAttributes: [], - }) - output.noMerge = ( await record.getNoMerge({ transaction, @@ -3085,44 +3065,6 @@ class MemberRepository { }) } - static async moveTasksBetweenMembers( - fromMemberId: string, - toMemberId: string, - options: IRepositoryOptions, - ): Promise { - const transaction = SequelizeRepository.getTransaction(options) - - const seq = SequelizeRepository.getSequelize(options) - - const params: any = { - fromMemberId, - toMemberId, - } - - const deleteQuery = ` - delete from "memberTasks" using "memberTasks" as mt2 - where "memberTasks"."memberId" = :fromMemberId - and "memberTasks"."taskId" = mt2."taskId" - and mt2."memberId" = :toMemberId; - ` - - await seq.query(deleteQuery, { - replacements: params, - type: QueryTypes.DELETE, - transaction, - }) - - const updateQuery = ` - update "memberTasks" set "memberId" = :toMemberId where "memberId" = :fromMemberId; - ` - - await seq.query(updateQuery, { - replacements: params, - type: QueryTypes.UPDATE, - transaction, - }) - } - static async moveAffiliationsBetweenMembers( fromMemberId: string, toMemberId: string, diff --git a/backend/src/database/repositories/taskRepository.ts b/backend/src/database/repositories/taskRepository.ts deleted file mode 100644 index 350a3c3212..0000000000 --- a/backend/src/database/repositories/taskRepository.ts +++ /dev/null @@ -1,520 +0,0 @@ -import lodash from 'lodash' -import sanitizeHtml from 'sanitize-html' -import Sequelize from 'sequelize' - -import { Error404 } from '@crowd/common' -import { getActivitiesById } from '@crowd/data-access-layer' - -import SequelizeFilterUtils from '../utils/sequelizeFilterUtils' - -import { IRepositoryOptions } from './IRepositoryOptions' -import AuditLogRepository from './auditLogRepository' -import QueryParser from './filters/queryParser' -import { QueryOutput } from './filters/queryTypes' -import SequelizeRepository from './sequelizeRepository' - -const { Op } = Sequelize - -class TaskRepository { - static async create(data, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const tenant = SequelizeRepository.getCurrentTenant(options) - - const transaction = SequelizeRepository.getTransaction(options) - - const segment = SequelizeRepository.getStrictlySingleActiveSegment(options) - - if (data.body) { - data.body = sanitizeHtml(data.body).trim() - } - - const record = await options.database.task.create( - { - ...lodash.pick(data, ['name', 'body', 'type', 'status', 'dueDate', 'importHash']), - - tenantId: tenant.id, - segmentId: segment.id, - createdById: currentUser.id, - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - await record.setMembers(data.members || [], { - transaction, - }) - - await record.setAssignees(data.assignees || [], { - transaction, - }) - - await this._createAuditLog(AuditLogRepository.CREATE, record, data, options) - - return this.findById(record.id, options) - } - - static async createSuggestedTasks(options: IRepositoryOptions) { - const fs = require('fs') - const path = require('path') - - const suggestedTasks = JSON.parse( - fs.readFileSync(path.resolve(__dirname, '../initializers/suggested-tasks.json'), 'utf8'), - ) - - for (const suggestedTask of suggestedTasks) { - await TaskRepository.create({ ...suggestedTask, type: 'suggested' }, options) - } - } - - static async updateBulk(ids, data, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const transaction = SequelizeRepository.getTransaction(options) - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const records = await options.database.task.update( - { ...data, updatedById: currentUser.id }, - { - where: { - id: ids, - tenantId: currentTenant.id, - segmentId: SequelizeRepository.getSegmentIds(options), - }, - transaction, - }, - ) - - return { rowsUpdated: records[0] } - } - - static async update(id, data, options: IRepositoryOptions) { - const currentUser = SequelizeRepository.getCurrentUser(options) - - const transaction = SequelizeRepository.getTransaction(options) - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - let record = await options.database.task.findOne({ - where: { - id, - tenantId: currentTenant.id, - segmentId: SequelizeRepository.getSegmentIds(options), - }, - transaction, - }) - - if (!record) { - throw new Error404() - } - - if (data.body) { - data.body = sanitizeHtml(data.body).trim() - } - - record = await record.update( - { - ...lodash.pick(data, ['name', 'body', 'status', 'type', 'dueDate', 'importHash']), - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - if (data.members) { - await record.setMembers(data.members, { - transaction, - }) - } - - if (data.assignees) { - await record.setAssignees(data.assignees, { - transaction, - }) - } - - await this._createAuditLog(AuditLogRepository.UPDATE, record, data, options) - - return this.findById(record.id, options) - } - - static async destroy(id, options: IRepositoryOptions, force = false) { - const transaction = SequelizeRepository.getTransaction(options) - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const record = await options.database.task.findOne({ - where: { - id, - tenantId: currentTenant.id, - segmentId: SequelizeRepository.getSegmentIds(options), - }, - transaction, - }) - - if (!record) { - throw new Error404() - } - - await record.destroy({ - transaction, - force, - }) - - await this._createAuditLog(AuditLogRepository.DELETE, record, record, options) - } - - static async findById(id, options: IRepositoryOptions) { - const transaction = SequelizeRepository.getTransaction(options) - - const include = [] - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const record = await options.database.task.findOne({ - where: { - id, - tenantId: currentTenant.id, - segmentId: SequelizeRepository.getSegmentIds(options), - }, - include, - transaction, - }) - - if (!record) { - throw new Error404() - } - - return this._populateRelations(record, options) - } - - static async filterIdInTenant(id, options: IRepositoryOptions) { - return lodash.get(await this.filterIdsInTenant([id], options), '[0]', null) - } - - static async filterIdsInTenant(ids, options: IRepositoryOptions) { - if (!ids || !ids.length) { - return [] - } - - const currentTenant = SequelizeRepository.getCurrentTenant(options) - - const where = { - id: { - [Op.in]: ids, - }, - tenantId: currentTenant.id, - } - - const records = await options.database.task.findAll({ - attributes: ['id'], - where, - }) - - return records.map((record) => record.id) - } - - static async count(filter, options: IRepositoryOptions) { - const transaction = SequelizeRepository.getTransaction(options) - - const tenant = SequelizeRepository.getCurrentTenant(options) - - return options.database.task.count({ - where: { - ...filter, - tenantId: tenant.id, - segmentId: SequelizeRepository.getSegmentIds(options), - }, - transaction, - }) - } - - static async findAndCountAll( - { filter = {} as any, advancedFilter = null as any, limit = 0, offset = 0, orderBy = '' }, - options: IRepositoryOptions, - ) { - const include = [] - - // If the advanced filter is empty, we construct it from the query parameter filter - if (!advancedFilter) { - advancedFilter = { and: [] } - - if (filter.id) { - advancedFilter.and.push({ - id: filter.id, - }) - } - - if (filter.name) { - advancedFilter.and.push({ - name: { - textContains: filter.name, - }, - }) - } - - if (filter.body) { - advancedFilter.and.push({ - body: { - textContains: filter.body, - }, - }) - } - - if (filter.type) { - advancedFilter.and.push({ - type: { - textContains: filter.type, - }, - }) - } - - if (filter.status) { - advancedFilter.and.push({ - status: filter.status, - }) - } - - if (filter.dueDateRange) { - const [start, end] = filter.dueDateRange - - if (start !== undefined && start !== null && start !== '') { - advancedFilter.and.push({ - dueDate: { - gte: start, - }, - }) - } - - if (end !== undefined && end !== null && end !== '') { - advancedFilter.and.push({ - dueDate: { - lte: end, - }, - }) - } - } - - if (filter.assignees) { - advancedFilter.and.push({ - assignees: filter.assignees, - }) - } - - if (filter.members) { - advancedFilter.and.push({ - members: filter.members, - }) - } - - if (filter.activities) { - advancedFilter.and.push({ - activities: filter.activities, - }) - } - - if (filter.createdAtRange) { - const [start, end] = filter.createdAtRange - - if (start !== undefined && start !== null && start !== '') { - advancedFilter.and.push({ - createdAt: { - gte: start, - }, - }) - } - - if (end !== undefined && end !== null && end !== '') { - advancedFilter.and.push({ - createdAt: { - lte: end, - }, - }) - } - } - } - - const parser = new QueryParser( - { - manyToMany: { - members: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'memberTasks', - from: 'taskId', - to: 'memberId', - }, - }, - assignees: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'taskAssignees', - from: 'taskId', - to: 'userId', - }, - }, - activities: { - table: 'tasks', - model: 'task', - relationTable: { - name: 'activityTasks', - from: 'taskId', - to: 'activityId', - }, - }, - }, - }, - options, - ) - - const parsed: QueryOutput = parser.parse({ - filter: advancedFilter, - orderBy: orderBy || ['createdAt_DESC'], - limit, - offset, - }) - - let { - rows, - count, // eslint-disable-line prefer-const - } = await options.database.task.findAndCountAll({ - ...(parsed.where ? { where: parsed.where } : {}), - ...(parsed.having ? { having: parsed.having } : {}), - order: parsed.order, - limit: parsed.limit, - offset: parsed.offset, - include, - transaction: SequelizeRepository.getTransaction(options), - }) - - rows = await this._populateRelationsForRows(rows, options) - - return { rows, count, limit: parsed.limit, offset: parsed.offset } - } - - static async findAllAutocomplete(query, limit, options: IRepositoryOptions) { - const tenant = SequelizeRepository.getCurrentTenant(options) - - const whereAnd: Array = [ - { - tenantId: tenant.id, - }, - { - segmentId: SequelizeRepository.getSegmentIds(options), - }, - ] - - if (query) { - whereAnd.push({ - [Op.or]: [ - { id: SequelizeFilterUtils.uuid(query) }, - { - [Op.and]: SequelizeFilterUtils.ilikeIncludes('task', 'name', query), - }, - ], - }) - } - - const where = { [Op.and]: whereAnd } - - const records = await options.database.task.findAll({ - attributes: ['id', 'name'], - where, - limit: limit ? Number(limit) : undefined, - order: [['name', 'ASC']], - }) - - return records.map((record) => ({ - id: record.id, - label: record.name, - })) - } - - static async _createAuditLog(action, record, data, options: IRepositoryOptions) { - let values = {} - - if (data) { - values = { - ...record.get({ plain: true }), - memberIds: data.members, - } - } - - await AuditLogRepository.log( - { - entityName: 'task', - entityId: record.id, - action, - values, - }, - options, - ) - } - - static async _populateRelationsForRows(rows, options: IRepositoryOptions) { - if (!rows) { - return rows - } - - return Promise.all(rows.map((record) => this._populateRelations(record, options))) - } - - static async _populateRelations(record, options: IRepositoryOptions) { - if (!record) { - return record - } - - const output = record.get({ plain: true }) - - const transaction = SequelizeRepository.getTransaction(options) - const seq = SequelizeRepository.getSequelize(options) - - output.members = await record.getMembers({ - transaction, - joinTableAttributes: [], - }) - - const results = await seq.query( - ` - select distinct "activityId" from "activityTasks" where "taskId" = :taskId - `, - { - replacements: { - taskId: record.id, - }, - type: Sequelize.QueryTypes.SELECT, - transaction, - }, - ) - const activityIds = results.map((r) => (r as any).activityId) - if (activityIds.length > 0) { - const segmentIds = SequelizeRepository.getSegmentIds(options) - output.activities = await getActivitiesById( - options.qdb, - activityIds, - options.currentTenant.id, - segmentIds, - ) - } else { - output.activities = [] - } - - output.assignees = ( - await record.getAssignees({ - transaction, - joinTableAttributes: [], - raw: true, - }) - ).map((a) => ({ id: a.id, avatarUrl: null, fullName: a.fullName, email: a.email })) - - return output - } -} - -export default TaskRepository diff --git a/backend/src/database/utils/sequelizeTestUtils.ts b/backend/src/database/utils/sequelizeTestUtils.ts index 7c26097629..21278e0ed7 100644 --- a/backend/src/database/utils/sequelizeTestUtils.ts +++ b/backend/src/database/utils/sequelizeTestUtils.ts @@ -27,7 +27,6 @@ export default class SequelizeTestUtils { const tables = [ '"organizationIdentities"', - '"activityTasks"', '"automationExecutions"', '"conversationSettings"', '"auditLogs"', @@ -37,14 +36,11 @@ export default class SequelizeTestUtils { '"files"', '"memberNoMerge"', '"memberTags"', - '"memberTasks"', '"microservices"', '"memberToMerge"', - '"taskAssignees"', '"integrations"', '"eagleEyeContents"', '"eagleEyeActions"', - '"tasks"', '"tags"', '"memberAttributeSettings"', diff --git a/backend/src/security/permissions.ts b/backend/src/security/permissions.ts index e62104c88b..5664d26766 100644 --- a/backend/src/security/permissions.ts +++ b/backend/src/security/permissions.ts @@ -306,37 +306,6 @@ class Permissions { id: 'eagleEyeContentEdit', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], }, - taskImport: { - id: 'taskImport', - allowedRoles: [roles.admin, roles.projectAdmin], - }, - taskCreate: { - id: 'taskCreate', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedStorage: [], - }, - taskEdit: { - id: 'taskEdit', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedStorage: [], - }, - taskDestroy: { - id: 'taskDestroy', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedStorage: [], - }, - taskRead: { - id: 'taskRead', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - }, - taskAutocomplete: { - id: 'taskAutocomplete', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - }, - taskBatch: { - id: 'taskBatch', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - }, noteImport: { id: 'noteImport', allowedRoles: [roles.admin, roles.projectAdmin], diff --git a/backend/src/services/__tests__/taskService.test.ts b/backend/src/services/__tests__/taskService.test.ts deleted file mode 100644 index 24595833ca..0000000000 --- a/backend/src/services/__tests__/taskService.test.ts +++ /dev/null @@ -1,301 +0,0 @@ -import TaskRepository from '../../database/repositories/taskRepository' -import UserRepository from '../../database/repositories/userRepository' -import SequelizeTestUtils from '../../database/utils/sequelizeTestUtils' -import Roles from '../../security/roles' -import TaskService from '../taskService' - -const db = null - -describe('TaskService tests', () => { - beforeEach(async () => { - await SequelizeTestUtils.wipeDatabase(db) - }) - - afterAll(async () => { - // Closing the DB connection allows Jest to exit successfully. - await SequelizeTestUtils.closeConnection(db) - }) - - describe('Assign to user by ID', () => { - it('Should work when sending null or undefined', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const options2 = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - assignedTo: mockIRepositoryOptions.currentUser.id, - }) - - const task2 = await service.create({ - name: 'Task 2', - assignedTo: options2.currentUser.id, - }) - - const updated = await service.assignTo(task.id, null) - expect(updated.assignees).toStrictEqual([]) - - const updated2 = await service.assignTo(task2.id, undefined) - expect(updated2.assignees).toStrictEqual([]) - }) - - it('Should work when sending changing assignee user with another user', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const user2 = await UserRepository.create( - await SequelizeTestUtils.getRandomUser(), - mockIRepositoryOptions, - ) - - // add user to tenant - await mockIRepositoryOptions.database.tenantUser.create({ - roles: [Roles.values.admin], - status: 'active', - tenantId: mockIRepositoryOptions.currentTenant.id, - userId: user2.id, - }) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - assignedTo: mockIRepositoryOptions.currentUser.id, - }) - - const updated = await service.assignTo(task.id, [user2.id]) - expect(updated.assignees.map((i) => i.id)).toStrictEqual([user2.id]) - }) - }) - - describe('Assign to user by email', () => { - it('Should work when sending null or undefined', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const user2 = await UserRepository.create( - await SequelizeTestUtils.getRandomUser(), - mockIRepositoryOptions, - ) - - // add user to tenant - await mockIRepositoryOptions.database.tenantUser.create({ - roles: [Roles.values.admin], - status: 'active', - tenantId: mockIRepositoryOptions.currentTenant.id, - userId: user2.id, - }) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - assignees: [mockIRepositoryOptions.currentUser.id], - }) - - const task2 = await service.create({ - name: 'Task 2', - assignees: [user2.id], - }) - - const updated = await service.assignToByEmail(task.id, null) - expect(updated.assignees).toStrictEqual([]) - - const updated2 = await service.assignToByEmail(task2.id, undefined) - expect(updated2.assignees).toStrictEqual([]) - }) - - it('Should work when sending changing a user for another', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - const user2 = await UserRepository.create( - await SequelizeTestUtils.getRandomUser(), - mockIRepositoryOptions, - ) - - // add user to tenant - await mockIRepositoryOptions.database.tenantUser.create({ - roles: [Roles.values.admin], - status: 'active', - tenantId: mockIRepositoryOptions.currentTenant.id, - userId: user2.id, - }) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - assignedTo: mockIRepositoryOptions.currentUser.id, - }) - - const updated = await service.assignToByEmail(task.id, user2.email) - expect(updated.assignees.map((i) => i.id)).toStrictEqual([user2.id]) - }) - }) - - describe('Change status', () => { - it('Should work when sending an empty array', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - status: 'in-progress', - }) - - const task2 = await service.create({ - name: 'Task 2', - status: 'archived', - }) - - const updated = await service.updateStatus(task.id, null) - expect(updated.status).toBeNull() - - const updated2 = await service.updateStatus(task2.id, undefined) - expect(updated2.status).toBeNull() - }) - - it('Should work when sending a different status', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const service = new TaskService(mockIRepositoryOptions) - - const task = await service.create({ - name: 'Task 1', - status: 'in-progress', - }) - - const updated = await service.updateStatus(task.id, 'done') - expect(updated.status).toBe('done') - }) - }) - - describe('findAndUpdateAll', () => { - it('Should find all tasks with given filter, and update found tasks with given payload', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const service = new TaskService(mockIRepositoryOptions) - - let task1 = await service.create({ - name: 'Task 1', - status: 'in-progress', - }) - - let task2 = await service.create({ - name: 'Task 2', - status: 'in-progress', - }) - - let task3 = await service.create({ - name: 'Task 3', - status: 'archived', - }) - - let task4 = await service.create({ - name: 'Task 4', - status: 'in-progress', - }) - - // change all in-progress to done - let updated = await service.findAndUpdateAll({ - filter: { - status: 'in-progress', - }, - update: { - status: 'done', - }, - }) - - expect(updated.rowsUpdated).toStrictEqual(3) - - task1 = await service.findById(task1.id) - task2 = await service.findById(task2.id) - task3 = await service.findById(task3.id) - task4 = await service.findById(task4.id) - - expect(task1.status).toStrictEqual('done') - expect(task2.status).toStrictEqual('done') - expect(task3.status).toStrictEqual('archived') - expect(task4.status).toStrictEqual('done') - - // change all done to archived - updated = await service.findAndUpdateAll({ - filter: { - status: 'done', - }, - update: { - status: 'archived', - }, - }) - - task1 = await service.findById(task1.id) - task2 = await service.findById(task2.id) - task3 = await service.findById(task3.id) - task4 = await service.findById(task4.id) - - expect(task1.status).toStrictEqual('archived') - expect(task2.status).toStrictEqual('archived') - expect(task3.status).toStrictEqual('archived') - expect(task4.status).toStrictEqual('archived') - - // change all archived to in progress - updated = await service.findAndUpdateAll({ - filter: { - status: 'archived', - }, - update: { - status: 'in-progress', - }, - }) - - task1 = await service.findById(task1.id) - task2 = await service.findById(task2.id) - task3 = await service.findById(task3.id) - task4 = await service.findById(task4.id) - - expect(task1.status).toStrictEqual('in-progress') - expect(task2.status).toStrictEqual('in-progress') - expect(task3.status).toStrictEqual('in-progress') - expect(task4.status).toStrictEqual('in-progress') - }) - }) - describe('findAndUpdateAll', () => { - it('Should find all tasks with given filter, and delete found tasks', async () => { - const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) - - const service = new TaskService(mockIRepositoryOptions) - - await service.create({ - name: 'Task 1', - status: 'in-progress', - }) - - await service.create({ - name: 'Task 2', - status: 'in-progress', - }) - - const task3 = await service.create({ - name: 'Task 3', - status: 'archived', - }) - - await service.create({ - name: 'Task 4', - status: 'in-progress', - }) - - // change all in-progress to done - const deleted = await service.findAndDeleteAll({ - filter: { - status: 'in-progress', - }, - }) - - expect(deleted.rowsDeleted).toStrictEqual(3) - - // get all tasks and check count - const tasks = await TaskRepository.findAndCountAll({ filter: {} }, mockIRepositoryOptions) - - expect(tasks.count).toBe(1) - expect(tasks.rows[0].id).toStrictEqual(task3.id) - }) - }) -}) diff --git a/backend/src/services/__tests__/tenantService.test.ts b/backend/src/services/__tests__/tenantService.test.ts index d689a757ae..1d8d60aa54 100644 --- a/backend/src/services/__tests__/tenantService.test.ts +++ b/backend/src/services/__tests__/tenantService.test.ts @@ -6,7 +6,6 @@ import SequelizeTestUtils from '../../database/utils/sequelizeTestUtils' import { IServiceOptions } from '../IServiceOptions' import MemberAttributeSettingsService from '../memberAttributeSettingsService' import MicroserviceService from '../microserviceService' -import TaskService from '../taskService' import TenantService from '../tenantService' const db = null @@ -47,7 +46,7 @@ describe('TenantService tests', () => { }) describe('create method', () => { - it('Should succesfully create the tenant, related default microservices, settings and suggested tasks', async () => { + it('Should succesfully create the tenant, related default microservices, and settings', async () => { const randomUser = await SequelizeTestUtils.getRandomUser() let db = null db = await SequelizeTestUtils.getDatabase(db) @@ -115,17 +114,6 @@ describe('TenantService tests', () => { MemberAttributeName.LOCATION, MemberAttributeName.URL, ]) - - const taskService = new TaskService({ ...options, currentTenant: tenantCreated }) - const suggestedTasks = await taskService.findAndCountAll({ filter: {} }) - expect(suggestedTasks.rows.map((i) => i.name).sort()).toStrictEqual([ - 'Check for negative reactions', - 'Engage with relevant content', - 'Reach out to influential contacts', - 'Reach out to poorly engaged contacts', - 'Set up your team', - 'Set up your workspace integrations', - ]) }) }) }) diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index 77b55afda2..430f3f47ed 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -15,16 +15,13 @@ import { findMemberAffiliations } from '@crowd/data-access-layer/src/member_segm import { MemberField, addMemberTags, - addMemberTasks, fetchMemberIdentities, findMemberById, findMemberIdentityById, findMemberTags, - findMemberTasks, insertMemberSegments, queryMembersAdvanced, removeMemberTags, - removeMemberTasks, } from '@crowd/data-access-layer/src/members' import { QueryExecutor, optionsQx } from '@crowd/data-access-layer/src/queryExecutor' // import { getActivityCountOfMemberIdentities } from '@crowd/data-access-layer' @@ -687,8 +684,7 @@ export default class MemberService extends LoggerBase { MemberField.ID, MemberField.DISPLAY_NAME, ]) - const [memberTasks, memberTags] = await Promise.all([ - (await findMemberTasks(qx, memberId)).map((t) => ({ id: t.taskId })), + const [memberTags] = await Promise.all([ (await findMemberTags(qx, memberId)).map((t) => ({ id: t.tagId })), ]) @@ -781,26 +777,6 @@ export default class MemberService extends LoggerBase { } } - // move tasks - if (payload.secondary.tasks.length > 0) { - await addMemberTasks( - txqx, - secondaryMember.id, - payload.secondary.tasks.map((t) => t.id), - ) - // check if anything to delete in primary - const tasksToDelete = memberTasks.filter( - (t) => !payload.primary.tasks.some((pt) => pt.id === t.id), - ) - if (tasksToDelete.length > 0) { - await removeMemberTasks( - txqx, - memberId, - tasksToDelete.map((t) => t.id), - ) - } - } - // move memberOrganizations if (payload.secondary.memberOrganizations.length > 0) { const nonExistingOrganizationIds = await OrganizationRepository.findNonExistingIds( @@ -844,7 +820,6 @@ export default class MemberService extends LoggerBase { delete payload.primary.memberOrganizations delete payload.primary.organizations delete payload.primary.tags - delete payload.primary.tasks delete payload.primary.affiliations captureNewState({ @@ -938,12 +913,11 @@ export default class MemberService extends LoggerBase { '[0] Getting member information (identities, tags, tasks, affiliations)... ', ) - const [memberOrganizations, identities, tags, tasks, affiliations] = await Promise.all( + const [memberOrganizations, identities, tags, affiliations] = await Promise.all( [ MemberOrganizationRepository.findMemberRoles(memberId, this.options), fetchMemberIdentities(qx, memberId), findMemberTags(qx, memberId), - findMemberTasks(qx, memberId), findMemberAffiliations(qx, memberId), ], ) @@ -956,7 +930,6 @@ export default class MemberService extends LoggerBase { identities, affiliations, tags: tags.map((t) => ({ id: t.tagId })), - tasks: tasks.map((t) => ({ id: t.taskId })), } const identity = await findMemberIdentityById(qx, memberId, identityId) @@ -1101,15 +1074,6 @@ export default class MemberService extends LoggerBase { ), ) - // tasks: Remove tasks that exist in secondary backup, but not in primary backup - member.tasks = member.tasks.filter( - (task) => - !( - secondaryBackup.tasks.some((t) => t.id === task.id) && - !primaryBackup.tasks.some((t) => t.id === task.id) - ), - ) - // identities: Remove identities coming from secondary backup member.identities = member.identities.filter( (i) => @@ -1223,7 +1187,6 @@ export default class MemberService extends LoggerBase { memberOrganizations: [], organizations: [], tags: [], - tasks: [], attributes: {}, joinedAt: new Date().toISOString(), tenantId: member.tenantId, @@ -1294,16 +1257,14 @@ export default class MemberService extends LoggerBase { MemberField.MANUALLY_CHANGED_FIELDS, ]) - const [tags, tasks, affiliations] = await Promise.all([ + const [tags, affiliations] = await Promise.all([ findMemberTags(qx, memberId), - findMemberTasks(qx, memberId), findMemberAffiliations(qx, memberId), ]) return { ...member, tags: tags.map((t) => ({ id: t.tagId })), - tasks: tasks.map((t) => ({ id: t.taskId })), affiliations, } } @@ -1389,9 +1350,6 @@ export default class MemberService extends LoggerBase { repoOptions, ) - // Update tasks to belong to the originalId member - await MemberRepository.moveTasksBetweenMembers(toMergeId, originalId, repoOptions) - // Update member affiliations await MemberRepository.moveAffiliationsBetweenMembers(toMergeId, originalId, repoOptions) diff --git a/backend/src/services/taskService.ts b/backend/src/services/taskService.ts deleted file mode 100644 index 5182dbb5ba..0000000000 --- a/backend/src/services/taskService.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { Error400 } from '@crowd/common' - -import MemberRepository from '../database/repositories/memberRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' -import TaskRepository from '../database/repositories/taskRepository' -import UserRepository from '../database/repositories/userRepository' - -import { IServiceOptions } from './IServiceOptions' - -export default class TaskService { - options: IServiceOptions - - constructor(options) { - this.options = options - } - - async create(data) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - if (data.members) { - data.members = await MemberRepository.filterIdsInTenant(data.members, { - ...this.options, - transaction, - }) - } - - const record = await TaskRepository.create(data, { - ...this.options, - transaction, - }) - - await SequelizeRepository.commitTransaction(transaction) - - return record - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - - SequelizeRepository.handleUniqueFieldError(error, this.options.language, 'task') - - throw error - } - } - - /** - * Assign a task to a user - * @param id Id of the task to assign - * @param userId Id of the user to assign the task to. Send null for unassigning the task. - */ - async assignTo(id: string, userIds: string[]) { - if (userIds === null || userIds === undefined) { - userIds = [] - } - const users = await UserRepository.filterIdsInTenant(userIds, this.options) - return this.update(id, { - assignees: users, - }) - } - - /** - * Assign a task to a user by email - * @param id Id of the task to assign - * @param email Email of the user to assign the task to. - */ - async assignToByEmail(id, email) { - let userIds - if (email === null || email === undefined) { - userIds = [] - } else { - userIds = [(await UserRepository.findByEmail(email, this.options)).id] - } - - return this.update(id, { - assignees: userIds, - }) - } - - /** - * Update status of a task - * @param id Id of the task to update - * @param status New status of the task - */ - async updateStatus(id, status) { - if (status === null || status === undefined) { - status = null - } - return this.update(id, { - status, - }) - } - - async update(id, data) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - if (data.members) { - data.members = await MemberRepository.filterIdsInTenant(data.members, { - ...this.options, - transaction, - }) - } - - const record = await TaskRepository.update(id, data, { - ...this.options, - transaction, - }) - - await SequelizeRepository.commitTransaction(transaction) - - return record - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - - SequelizeRepository.handleUniqueFieldError(error, this.options.language, 'task') - - throw error - } - } - - async destroyAll(ids) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - for (const id of ids) { - await TaskRepository.destroy( - id, - { - ...this.options, - transaction, - }, - true, - ) - } - - await SequelizeRepository.commitTransaction(transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - async findById(id) { - return TaskRepository.findById(id, this.options) - } - - async findAllAutocomplete(search, limit) { - return TaskRepository.findAllAutocomplete(search, limit, this.options) - } - - async findAndUpdateAll(args) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - const tasks = await TaskRepository.findAndCountAll({ filter: args.filter }, this.options) - const bulkResult = await TaskRepository.updateBulk( - tasks.rows.map((i) => i.id), - args.update, - { ...this.options, transaction }, - ) - await SequelizeRepository.commitTransaction(transaction) - return bulkResult - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - async findAndDeleteAll(args) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - const tasks = await TaskRepository.findAndCountAll({ filter: args.filter }, this.options) - - for (const task of tasks.rows) { - await TaskRepository.destroy(task.id, this.options, true) - } - await SequelizeRepository.commitTransaction(transaction) - return { rowsDeleted: tasks.count } - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - async findAndCountAll(args) { - return TaskRepository.findAndCountAll(args, this.options) - } - - async query(data) { - const advancedFilter = data.filter - const orderBy = data.orderBy - const limit = data.limit - const offset = data.offset - return TaskRepository.findAndCountAll({ advancedFilter, orderBy, limit, offset }, this.options) - } - - async import(data, importHash) { - if (!importHash) { - throw new Error400(this.options.language, 'importer.errors.importHashRequired') - } - - if (await this._isImportHashExistent(importHash)) { - throw new Error400(this.options.language, 'importer.errors.importHashExistent') - } - - const dataToCreate = { - ...data, - importHash, - } - - return this.create(dataToCreate) - } - - async _isImportHashExistent(importHash) { - const count = await TaskRepository.count( - { - importHash, - }, - this.options, - ) - - return count > 0 - } -} diff --git a/backend/src/services/tenantService.ts b/backend/src/services/tenantService.ts index 4e167fe037..6dc103a1da 100644 --- a/backend/src/services/tenantService.ts +++ b/backend/src/services/tenantService.ts @@ -10,7 +10,6 @@ import { TenantMode } from '../conf/configTypes' import { TENANT_MODE } from '../conf/index' import MicroserviceRepository from '../database/repositories/microserviceRepository' import SequelizeRepository from '../database/repositories/sequelizeRepository' -import TaskRepository from '../database/repositories/taskRepository' import TenantRepository from '../database/repositories/tenantRepository' import TenantUserRepository from '../database/repositories/tenantUserRepository' import * as microserviceTypes from '../database/utils/keys/microserviceTypes' @@ -221,13 +220,6 @@ export default class TenantService { { ...this.options, transaction, currentTenant: record }, ) - // create suggested tasks - await TaskRepository.createSuggestedTasks({ - ...this.options, - transaction, - currentTenant: record, - }) - // create default custom views for (const entity of Object.values(defaultCustomViews)) { for (const customView of entity) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f40ae0a30..32203e98eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -318,9 +318,6 @@ importers: superagent: specifier: ^8.0.0 version: 8.1.2 - swagger-ui-dist: - specifier: 4.1.3 - version: 4.1.3 tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -8903,9 +8900,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swagger-ui-dist@4.1.3: - resolution: {integrity: sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ==} - swagger2openapi@7.0.8: resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} hasBin: true @@ -9682,10 +9676,10 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/client-sso-oidc': 3.572.0 + '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -9932,7 +9926,7 @@ snapshots: '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sts': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -9971,52 +9965,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.572.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sts' - - aws-crt - '@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -10241,7 +10189,7 @@ snapshots: '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10280,6 +10228,52 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.572.0 + '@aws-sdk/core': 3.572.0 + '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) + '@aws-sdk/middleware-host-header': 3.567.0 + '@aws-sdk/middleware-logger': 3.568.0 + '@aws-sdk/middleware-recursion-detection': 3.567.0 + '@aws-sdk/middleware-user-agent': 3.572.0 + '@aws-sdk/region-config-resolver': 3.572.0 + '@aws-sdk/types': 3.567.0 + '@aws-sdk/util-endpoints': 3.572.0 + '@aws-sdk/util-user-agent-browser': 3.567.0 + '@aws-sdk/util-user-agent-node': 3.568.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/client-sts@3.687.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -10435,12 +10429,12 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt - '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0)': + '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': dependencies: - '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) + '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 @@ -10454,7 +10448,7 @@ snapshots: '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': dependencies: - '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.572.0 '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) @@ -10505,13 +10499,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0)': + '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) + '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 @@ -10600,19 +10594,6 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt - '@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))': - dependencies: - '@aws-sdk/client-sso': 3.572.0 - '@aws-sdk/token-providers': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)) - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': dependencies: '@aws-sdk/client-sso': 3.572.0 @@ -10653,7 +10634,7 @@ snapshots: '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.572.0)': dependencies: - '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/types': 2.12.0 @@ -10920,15 +10901,6 @@ snapshots: - '@aws-sdk/credential-provider-node' - aws-crt - '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': dependencies: '@aws-sdk/client-sso-oidc': 3.572.0 @@ -19104,8 +19076,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swagger-ui-dist@4.1.3: {} - swagger2openapi@7.0.8(encoding@0.1.13): dependencies: call-me-maybe: 1.0.2 diff --git a/services/apps/data_sink_worker/src/bin/erase-member.ts b/services/apps/data_sink_worker/src/bin/erase-member.ts index 8110144cb3..dc2511ba94 100644 --- a/services/apps/data_sink_worker/src/bin/erase-member.ts +++ b/services/apps/data_sink_worker/src/bin/erase-member.ts @@ -339,7 +339,6 @@ export async function deleteMemberFromDb(store: DbStore, memberId: string): Prom ['memberTags', ['memberId']], ['memberSegments', ['memberId']], ['memberSegmentsAgg', ['memberId']], - ['memberTasks', ['memberId']], ['memberEnrichmentCache', ['memberId']], ['memberIdentities', ['memberId']], ['memberSegmentAffiliations', ['memberId']], diff --git a/services/libs/common/src/i18n/en.ts b/services/libs/common/src/i18n/en.ts index fb6a2d85c4..1964e032cb 100644 --- a/services/libs/common/src/i18n/en.ts +++ b/services/libs/common/src/i18n/en.ts @@ -64,12 +64,6 @@ const en = { }, }, - task: { - errors: { - unknownBatchOperation: 'Sent batch operation {0} is unknown.', - }, - }, - tenant: { exists: 'There is already a workspace on this application.', url: { diff --git a/services/libs/data-access-layer/src/members/others.ts b/services/libs/data-access-layer/src/members/others.ts index 0fd652cdae..fd2f74f0ef 100644 --- a/services/libs/data-access-layer/src/members/others.ts +++ b/services/libs/data-access-layer/src/members/others.ts @@ -2,13 +2,6 @@ import { IMemberReach } from '@crowd/types' import { QueryExecutor } from '../queryExecutor' -export interface IMemberTask { - createdAt: string - updatedAt: string - memberId: string - taskId: string -} - export interface IMemberTag { createdAt: string updatedAt: string @@ -16,20 +9,6 @@ export interface IMemberTag { tagId: string } -export async function findMemberTasks(qx: QueryExecutor, memberId: string): Promise { - return qx.select( - ` - SELECT - * - FROM "memberTasks" - WHERE "memberId" = $(memberId) - `, - { - memberId, - }, - ) -} - export async function findMemberTags(qx: QueryExecutor, memberId: string): Promise { return qx.select( ` @@ -63,25 +42,6 @@ export async function addMemberTags( ) } -export async function addMemberTasks( - qx: QueryExecutor, - memberId: string, - taskIds: string[], -): Promise { - return qx.result( - ` - INSERT INTO "memberTasks" ("createdAt", "updatedAt", "memberId", "taskId") - SELECT NOW(), NOW(), $(memberId), id - FROM unnest($(taskIds)::UUID[]) id - RETURNING * - `, - { - memberId, - taskIds, - }, - ) -} - export async function removeMemberTags( qx: QueryExecutor, memberId: string, @@ -100,24 +60,6 @@ export async function removeMemberTags( ) } -export async function removeMemberTasks( - qx: QueryExecutor, - memberId: string, - taskIds: string[], -): Promise { - await qx.result( - ` - DELETE FROM "memberTasks" - WHERE "memberId" = $(memberId) - AND "taskId" = ANY($(taskIds)::UUID[]) - `, - { - memberId, - taskIds, - }, - ) -} - export async function updateMemberReach( qx: QueryExecutor, memberId: string, diff --git a/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts b/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts index 6d2607fde2..20caee2bbd 100644 --- a/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/automations_worker/data.repo.ts @@ -111,20 +111,6 @@ export class DataRepository extends RepositoryBase { ) } - // load activity tasks - promises.push( - this.getActivityTasks(activityIds).then((allTasks) => { - for (const activity of results) { - activity.tasks = allTasks - .filter((t) => t.activityId === activity.id) - .map((t) => { - delete t.activityId - return t - }) - } - }), - ) - await Promise.all(promises) } @@ -138,23 +124,6 @@ export class DataRepository extends RepositoryBase { return results } - public async getActivityTasks(activityIds: string[]): Promise { - const results = await this.db().any( - ` - select at."activityId", t.* - from "activityTasks" at - inner join tasks t on t.id = at."taskId" - where at."activityId" in ($(activityIds:csv)) - and t."deletedAt" is null; - `, - { - activityIds, - }, - ) - - return results - } - public async getOrganizations(organizationIds: string[]): Promise { const results = await this.db().any( ` diff --git a/services/libs/data-access-layer/src/others/index.ts b/services/libs/data-access-layer/src/others/index.ts index 8875f94c4b..0d5b7e212f 100644 --- a/services/libs/data-access-layer/src/others/index.ts +++ b/services/libs/data-access-layer/src/others/index.ts @@ -1,21 +1,7 @@ -import { ITag, ITask } from '@crowd/types' +import { ITag } from '@crowd/types' import { QueryExecutor } from '../queryExecutor' -export async function findTasks(qx: QueryExecutor, taskIds: string[]): Promise { - return qx.select( - ` - SELECT - * - FROM "tasks" - WHERE "id" = ANY($(taskIds)::UUID[]) - `, - { - taskIds, - }, - ) -} - export async function findTags(qx: QueryExecutor, tagIds: string[]): Promise { return qx.select( ` diff --git a/services/libs/opensearch/src/models/members.ts b/services/libs/opensearch/src/models/members.ts index 0d6a2d2a84..76185ec488 100644 --- a/services/libs/opensearch/src/models/members.ts +++ b/services/libs/opensearch/src/models/members.ts @@ -116,12 +116,5 @@ export class MembersOpensearch extends OpensearchModelBase { fromOpensearch: 'nested_organizations', }, }, - tasks: { - type: OpensearchFieldType.NESTED, - customTranslation: { - toOpensearch: 'nested_tasks.uuid_id', - fromOpensearch: 'nested_tasks', - }, - }, } } diff --git a/services/libs/opensearch/src/repo/member.data.ts b/services/libs/opensearch/src/repo/member.data.ts index a54ca66031..d7addaa9d4 100644 --- a/services/libs/opensearch/src/repo/member.data.ts +++ b/services/libs/opensearch/src/repo/member.data.ts @@ -20,15 +20,6 @@ export interface IDbMemberNoteData { body: string } -export interface IDbMemberTaskData { - id: string - name: string - body: string - status: string - dueDate: string - type: string -} - export interface IDbMemberOrganization { id: string logo: string | null @@ -84,7 +75,6 @@ export interface IDbMemberSyncData { tags: IDbMemberTagData[] toMergeIds: string[] noMergeIds: string[] - tasks: IDbMemberTaskData[] } export interface IMemberSegmentMatrixItem { diff --git a/services/libs/opensearch/src/repo/member.repo.ts b/services/libs/opensearch/src/repo/member.repo.ts index f74c84e1c8..3109cc2f6d 100644 --- a/services/libs/opensearch/src/repo/member.repo.ts +++ b/services/libs/opensearch/src/repo/member.repo.ts @@ -183,25 +183,7 @@ export class MemberRepository extends RepositoryBase { left join organizations o on o.id = msa."organizationId" inner join segments s on s.id = msa."segmentId" where msa."memberId" = $(memberId) - group by msa."memberId"), - member_tasks as ( - select mtk."memberId", - json_agg( - json_build_object( - 'id', tk.id, - 'name', tk.name, - 'body', tk.body, - 'status', tk.status, - 'dueDate', tk."dueDate", - 'type', tk.type - ) - ) as all_tasks, - jsonb_agg(tk.id) as all_ids - from "memberTasks" mtk - inner join tasks tk on mtk."taskId" = tk.id - where mtk."memberId" = $(memberId) - and tk."deletedAt" is null - group by mtk."memberId") + group by msa."memberId") select m.id, m."tenantId", @@ -219,7 +201,6 @@ export class MemberRepository extends RepositoryBase { coalesce(mo.all_organizations, json_build_array()) as organizations, coalesce(mt.all_tags, json_build_array()) as tags, coalesce(ma.all_affiliations, json_build_array()) as affiliations, - coalesce(mtk.all_tasks, json_build_array()) as tasks, coalesce(tmd.to_merge_ids, array []::text[]) as "toMergeIds", coalesce(nmd.no_merge_ids, array []::text[]) as "noMergeIds" from members m @@ -228,7 +209,6 @@ export class MemberRepository extends RepositoryBase { left join no_merge_data nmd on m.id = nmd."memberId" left join member_tags mt on m.id = mt."memberId" left join member_affiliations ma on m.id = ma."memberId" - left join member_tasks mtk on m.id = mtk."memberId" left join member_organizations mo on m.id = mo."memberId" where m.id = $(memberId) and m."deletedAt" is null;`, diff --git a/services/libs/types/src/index.ts b/services/libs/types/src/index.ts index 9afd72e835..3a15bcd8fc 100644 --- a/services/libs/types/src/index.ts +++ b/services/libs/types/src/index.ts @@ -31,8 +31,6 @@ export * from './graphql' export * from './tags' -export * from './tasks' - export * from './attributes' export * from './automations' diff --git a/services/libs/types/src/merging.ts b/services/libs/types/src/merging.ts index 0612b49ee2..a55f947612 100644 --- a/services/libs/types/src/merging.ts +++ b/services/libs/types/src/merging.ts @@ -10,7 +10,6 @@ import { IMemberUsername, IOrganization, ITag, - ITask, LLMSuggestionVerdictType, MergeActionState, MergeActionStep, @@ -45,7 +44,6 @@ export interface IMemberUnmergeBackup { id: string tags: ITag[] reach: IMemberReach - tasks: ITask[] joinedAt: string tenantId: string username: IMemberUsername @@ -63,7 +61,6 @@ export interface IMemberUnmergePreviewResult { id: string tags: ITag[] reach: IMemberReach - tasks: ITask[] joinedAt: string tenantId: string username: IMemberUsername diff --git a/services/libs/types/src/tasks.ts b/services/libs/types/src/tasks.ts deleted file mode 100644 index f869bccb12..0000000000 --- a/services/libs/types/src/tasks.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface ITask { - id: string - body: string - name: string - type: string - status: string - dueDate: string - tenantId: string - createdAt: string - deletedAt: string - segmentId: string - updatedAt: string - createdById: string - updatedById: string -} From 9e17eaecc203ce3e68468039aaaade4cfea3ca96 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 7 Jan 2025 14:50:52 +0530 Subject: [PATCH 03/25] rm feature-flag related code and fix tests --- backend/.eslintrc.js | 2 +- .../server-config/nginx/anton-prod.crowd.dev | 20 - backend/server-config/nginx/anton.crowd.dev | 20 - backend/server-config/nginx/default | 100 - backend/server-config/nginx/setup.sh | 14 - backend/server-config/pm2.config.js | 28 - backend/src/api/auth/authMe.ts | 17 - .../src/api/dataQuality/dataQualityMember.ts | 16 +- .../dataQuality/dataQualityOrganization.ts | 16 +- backend/src/api/eagleEyeContent/index.ts | 12 - backend/src/api/index.ts | 7 +- backend/src/api/integration/index.ts | 12 - backend/src/api/member/index.ts | 15 +- backend/src/api/member/memberExport.ts | 23 +- backend/src/api/member/memberFind.ts | 16 +- backend/src/api/organization/index.ts | 4 - .../api/organization/organizationExport.ts | 23 +- backend/src/api/tenant/tenantFind.ts | 16 - .../repositories/automationRepository.ts | 27 +- .../repositories/githubReposRepository.ts | 13 +- .../repositories/organizationRepository.ts | 6 +- .../src/database/utils/sequelizeTestUtils.ts | 10 +- .../src/middlewares/featureFlagMiddleware.ts | 14 - backend/src/middlewares/segmentMiddleware.ts | 8 +- backend/src/services/dashboardService.ts | 15 +- backend/src/services/memberService.ts | 14 +- backend/src/services/searchSyncService.ts | 11 +- .../src/services/user/permissionChecker.ts | 1 - backend/src/services/user/userDestroyer.ts | 1 - backend/src/types/webhooks.ts | 57 + pnpm-lock.yaml | 10131 +++++++--------- .../Dockerfile.activities_worker.dockerignore | 2 - ...Dockerfile.automations_worker.dockerignore | 2 - .../docker/Dockerfile.backend.dockerignore | 2 - .../Dockerfile.cache_worker.dockerignore | 2 - .../Dockerfile.data_sink_worker.dockerignore | 2 - .../Dockerfile.emails_worker.dockerignore | 2 - ...kerfile.entity_merging_worker.dockerignore | 2 - .../Dockerfile.exports_worker.dockerignore | 2 - ...erfile.integration_run_worker.dockerignore | 2 - ...ile.integration_stream_worker.dockerignore | 2 - ...rfile.integration_sync_worker.dockerignore | 2 - ...ile.members_enrichment_worker.dockerignore | 2 - ...file.merge_suggestions_worker.dockerignore | 2 - ...ganizations_enrichment_worker.dockerignore | 2 - .../Dockerfile.profiles_worker.dockerignore | 2 - .../Dockerfile.script_executor.dockerignore | 2 - ...erfile.script_executor_worker.dockerignore | 2 - .../Dockerfile.search_sync_api.dockerignore | 2 - ...Dockerfile.search_sync_worker.dockerignore | 2 - .../Dockerfile.webhook_api.dockerignore | 2 - services/apps/cache_worker/src/activities.ts | 2 - ...spawnDashboardCacheRefreshForAllTenants.ts | 161 +- .../apps/exports_worker/src/activities.ts | 2 - .../exports_worker/src/activities/usage.ts | 18 - .../exports_worker/src/workflows/members.ts | 12 - .../src/workflows/organizations.ts | 12 - .../integration_run_worker/src/conf/index.ts | 1 - services/libs/common/src/i18n/en.ts | 3 - services/libs/types/src/enums/featureFlags.ts | 27 - services/libs/types/src/enums/index.ts | 2 - 61 files changed, 4679 insertions(+), 6270 deletions(-) delete mode 100644 backend/server-config/nginx/anton-prod.crowd.dev delete mode 100644 backend/server-config/nginx/anton.crowd.dev delete mode 100644 backend/server-config/nginx/default delete mode 100755 backend/server-config/nginx/setup.sh delete mode 100644 backend/server-config/pm2.config.js delete mode 100644 backend/src/middlewares/featureFlagMiddleware.ts create mode 100644 backend/src/types/webhooks.ts delete mode 100644 services/apps/exports_worker/src/activities/usage.ts delete mode 100644 services/libs/types/src/enums/featureFlags.ts diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 9a38b602a7..96a501aaa7 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { node: true, es2021: true, }, - extends: ['airbnb-base', 'prettier', 'plugin:openapi/recommended'], + extends: ['airbnb-base', 'prettier'], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], ignorePatterns: ['dist/*', '**/*.test.ts'], diff --git a/backend/server-config/nginx/anton-prod.crowd.dev b/backend/server-config/nginx/anton-prod.crowd.dev deleted file mode 100644 index f72800b627..0000000000 --- a/backend/server-config/nginx/anton-prod.crowd.dev +++ /dev/null @@ -1,20 +0,0 @@ -server { - listen 80; - server_name anton-prod.crowd.dev; - - client_max_body_size 200M; - access_log /var/log/nginx/anton-prod.access.log; - error_log /var/log/nginx/anton-prod.error.log; - - location / { - proxy_pass http://localhost:8080; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - # kill cache - expires -1; - } -} - diff --git a/backend/server-config/nginx/anton.crowd.dev b/backend/server-config/nginx/anton.crowd.dev deleted file mode 100644 index ffe0cf66d7..0000000000 --- a/backend/server-config/nginx/anton.crowd.dev +++ /dev/null @@ -1,20 +0,0 @@ -server { - listen 80; - server_name anton.crowd.dev; - - client_max_body_size 200M; - access_log /var/log/nginx/anton.access.log; - error_log /var/log/nginx/anton.error.log; - - location / { - proxy_pass http://localhost:8081; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - # kill cache - expires -1; - } -} - diff --git a/backend/server-config/nginx/default b/backend/server-config/nginx/default deleted file mode 100644 index 0527f8e154..0000000000 --- a/backend/server-config/nginx/default +++ /dev/null @@ -1,100 +0,0 @@ -## -# You should look at the following URL's in order to grasp a solid understanding -# of Nginx configuration files in order to fully unleash the power of Nginx. -# https://www.nginx.com/resources/wiki/start/ -# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ -# https://wiki.debian.org/Nginx/DirectoryStructure -# -# In most cases, administrators will remove this file from sites-enabled/ and -# leave it as reference inside of sites-available where it will continue to be -# updated by the nginx packaging team. -# -# This file will automatically load configuration files provided by other -# applications, such as Drupal or Wordpress. These applications will be made -# available underneath a path with that package name, such as /drupal8. -# -# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. -## - -# Default server configuration -# -server { - listen 80 default_server; - listen [::]:80 default_server; - - # SSL configuration - # - # listen 443 ssl default_server; - # listen [::]:443 ssl default_server; - # - # Note: You should disable gzip for SSL traffic. - # See: https://bugs.debian.org/773332 - # - # Read up on ssl_ciphers to ensure a secure configuration. - # See: https://bugs.debian.org/765782 - # - # Self signed certs generated by the ssl-cert package - # Don't use them in a production server! - # - # include snippets/snakeoil.conf; - - root /var/www/html; - - # Add index.php to the list if you are using PHP - index index.html index.htm index.nginx-debian.html; - - server_name _; - - location /health { - try_files $uri $uri/ =404; - } - location / { - ## First attempt to serve request as file, then - ## as directory, then fall back to displaying a 404. - #try_files $uri $uri/ =404; - #proxy_pass http://localhost:8080; - #proxy_http_version 1.1; - #proxy_set_header Upgrade $http_upgrade; - #proxy_set_header Connection 'upgrade'; - #proxy_set_header Host $host; - #proxy_cache_bypass $http_upgrade; - } - - # pass PHP scripts to FastCGI server - # - #location ~ \.php$ { - # include snippets/fastcgi-php.conf; - # - # # With php-fpm (or other unix sockets): - # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; - # # With php-cgi (or other tcp sockets): - # fastcgi_pass 127.0.0.1:9000; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} -} - - -# Virtual Host configuration for example.com -# -# You can move that to a different file under sites-available/ and symlink that -# to sites-enabled/ to enable it. -# -#server { -# listen 80; -# listen [::]:80; -# -# server_name example.com; -# -# root /var/www/example.com; -# index index.html; -# -# location / { -# try_files $uri $uri/ =404; -# } -#} diff --git a/backend/server-config/nginx/setup.sh b/backend/server-config/nginx/setup.sh deleted file mode 100755 index 047b69a88d..0000000000 --- a/backend/server-config/nginx/setup.sh +++ /dev/null @@ -1,14 +0,0 @@ -# Install nginx configuration and restart the service if test passes - -cp anton* default /etc/nginx/sites-available/ - -nginx -t -if [ $? -eq 0 ]; then - echo "Passed nginx test, restarting" -else - echo "Failed nginx test, not restarting" - exit 1 -fi - -systemctl restart nginx - diff --git a/backend/server-config/pm2.config.js b/backend/server-config/pm2.config.js deleted file mode 100644 index 8c740ae690..0000000000 --- a/backend/server-config/pm2.config.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - apps: [ - { - name: 'anton-prod', - script: 'server.js', - watch: true, - env: { - PORT: 8080, - NODE_ENV: 'production', - }, - merge_logs: true, - cwd: '/home/ubuntu/deploy/dist-prod/', - interpreter: 'node@16.13.1', - }, - { - name: 'anton', - script: 'server.js', - watch: true, - env: { - PORT: 8081, - NODE_ENV: 'staging', - }, - merge_logs: true, - cwd: '/home/ubuntu/deploy/dist/', - interpreter: 'node@16.13.1', - }, - ], -} diff --git a/backend/src/api/auth/authMe.ts b/backend/src/api/auth/authMe.ts index 6ca15d9b41..2844b54f37 100644 --- a/backend/src/api/auth/authMe.ts +++ b/backend/src/api/auth/authMe.ts @@ -1,6 +1,4 @@ import { Error403 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey } from '@crowd/types' import AutomationRepository from '@/database/repositories/automationRepository' @@ -12,28 +10,13 @@ export default async (req, res) => { const payload = req.currentUser - const csvExportCountCache = new RedisCache( - FeatureFlagRedisKey.CSV_EXPORT_COUNT, - req.redis, - req.log, - ) - - const memberEnrichmentCountCache = new RedisCache( - FeatureFlagRedisKey.MEMBER_ENRICHMENT_COUNT, - req.redis, - req.log, - ) - payload.tenants = await Promise.all( payload.tenants.map(async (tenantUser) => { tenantUser.tenant.dataValues = { ...tenantUser.tenant.dataValues, - csvExportCount: Number(await csvExportCountCache.get(tenantUser.tenant.id)) || 0, automationCount: Number(await AutomationRepository.countAllActive(req.database, tenantUser.tenant.id)) || 0, - memberEnrichmentCount: - Number(await memberEnrichmentCountCache.get(tenantUser.tenant.id)) || 0, } return tenantUser }), diff --git a/backend/src/api/dataQuality/dataQualityMember.ts b/backend/src/api/dataQuality/dataQualityMember.ts index 7973c7dace..1806c6273a 100644 --- a/backend/src/api/dataQuality/dataQualityMember.ts +++ b/backend/src/api/dataQuality/dataQualityMember.ts @@ -1,8 +1,5 @@ -import { FeatureFlag } from '@crowd/types' - import DataQualityService from '@/services/dataQualityService' -import isFeatureEnabled from '../../feature-flags/isFeatureEnabled' import Permissions from '../../security/permissions' import PermissionChecker from '../../services/user/permissionChecker' @@ -24,14 +21,11 @@ export default async (req, res) => { const segmentId = req.query.segments?.length > 0 ? req.query.segments[0] : null if (!segmentId) { - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, req) - if (segmentsEnabled) { - await req.responseHandler.error(req, res, { - code: 400, - message: 'Segment ID is required', - }) - return - } + await req.responseHandler.error(req, res, { + code: 400, + message: 'Segment ID is required', + }) + return } const payload = await new DataQualityService(req).findMemberIssues( diff --git a/backend/src/api/dataQuality/dataQualityOrganization.ts b/backend/src/api/dataQuality/dataQualityOrganization.ts index fe251bc9a4..caac871ece 100644 --- a/backend/src/api/dataQuality/dataQualityOrganization.ts +++ b/backend/src/api/dataQuality/dataQualityOrganization.ts @@ -1,8 +1,5 @@ -import { FeatureFlag } from '@crowd/types' - import DataQualityService from '@/services/dataQualityService' -import isFeatureEnabled from '../../feature-flags/isFeatureEnabled' import Permissions from '../../security/permissions' import PermissionChecker from '../../services/user/permissionChecker' @@ -24,14 +21,11 @@ export default async (req, res) => { const segmentId = req.query.segments?.length > 0 ? req.query.segments[0] : null if (!segmentId) { - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, req) - if (segmentsEnabled) { - await req.responseHandler.error(req, res, { - code: 400, - message: 'Segment ID is required', - }) - return - } + await req.responseHandler.error(req, res, { + code: 400, + message: 'Segment ID is required', + }) + return } const payload = await new DataQualityService(req).findOrganizationIssues() diff --git a/backend/src/api/eagleEyeContent/index.ts b/backend/src/api/eagleEyeContent/index.ts index ec8f33d987..9e177e9c19 100644 --- a/backend/src/api/eagleEyeContent/index.ts +++ b/backend/src/api/eagleEyeContent/index.ts @@ -1,60 +1,48 @@ -import { FeatureFlag } from '@crowd/types' - import { safeWrap } from '../../middlewares/errorMiddleware' -import { featureFlagMiddleware } from '../../middlewares/featureFlagMiddleware' export default (app) => { app.post( `/tenant/:tenantId/eagleEyeContent/query`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentQuery').default), ) app.post( `/tenant/:tenantId/eagleEyeContent`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentUpsert').default), ) app.post( `/tenant/:tenantId/eagleEyeContent/track`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentTrack').default), ) app.get( `/tenant/:tenantId/eagleEyeContent/reply`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentReply').default), ) app.get( `/tenant/:tenantId/eagleEyeContent/search`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentSearch').default), ) app.get( `/tenant/:tenantId/eagleEyeContent/:id`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeContentFind').default), ) app.post( `/tenant/:tenantId/eagleEyeContent/:contentId/action`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeActionCreate').default), ) app.put( `/tenant/:tenantId/eagleEyeContent/settings`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeSettingsUpdate').default), ) app.delete( `/tenant/:tenantId/eagleEyeContent/:contentId/action/:actionId`, - featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'), safeWrap(require('./eagleEyeActionDestroy').default), ) } diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 8aa17915d6..6348aecfce 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -18,12 +18,7 @@ import { ApiWebsocketMessage } from '@crowd/types' import SequelizeRepository from '@/database/repositories/sequelizeRepository' import { productDatabaseMiddleware } from '@/middlewares/productDbMiddleware' -import { - OPENSEARCH_CONFIG, - PRODUCT_DB_CONFIG, - REDIS_CONFIG, - TEMPORAL_CONFIG, -} from '../conf' +import { OPENSEARCH_CONFIG, PRODUCT_DB_CONFIG, REDIS_CONFIG, TEMPORAL_CONFIG } from '../conf' import { authMiddleware } from '../middlewares/authMiddleware' import { databaseMiddleware } from '../middlewares/databaseMiddleware' import { errorMiddleware } from '../middlewares/errorMiddleware' diff --git a/backend/src/api/integration/index.ts b/backend/src/api/integration/index.ts index 23ae1cdffe..85c7b12d22 100644 --- a/backend/src/api/integration/index.ts +++ b/backend/src/api/integration/index.ts @@ -1,9 +1,6 @@ import passport from 'passport' import { RedisCache } from '@crowd/redis' -import { FeatureFlag } from '@crowd/types' - -import { featureFlagMiddleware } from '@/middlewares/featureFlagMiddleware' import { API_CONFIG, SLACK_CONFIG, TWITTER_CONFIG } from '../../conf' import SegmentRepository from '../../database/repositories/segmentRepository' @@ -133,55 +130,46 @@ export default (app) => { app.post( '/tenant/:tenantId/hubspot-connect', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotConnect').default), ) app.post( '/tenant/:tenantId/hubspot-onboard', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotOnboard').default), ) app.post( '/tenant/:tenantId/hubspot-update-properties', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotUpdateProperties').default), ) app.get( '/tenant/:tenantId/hubspot-mappable-fields', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotGetMappableFields').default), ) app.get( '/tenant/:tenantId/hubspot-get-lists', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotGetLists').default), ) app.post( '/tenant/:tenantId/hubspot-sync-member', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotSyncMember').default), ) app.post( '/tenant/:tenantId/hubspot-stop-sync-member', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotStopSyncMember').default), ) app.post( '/tenant/:tenantId/hubspot-sync-organization', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotSyncOrganization').default), ) app.post( '/tenant/:tenantId/hubspot-stop-sync-organization', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), safeWrap(require('./helpers/hubspotStopSyncOrganization').default), ) diff --git a/backend/src/api/member/index.ts b/backend/src/api/member/index.ts index d613ad2c8a..6f79c8a308 100644 --- a/backend/src/api/member/index.ts +++ b/backend/src/api/member/index.ts @@ -1,16 +1,9 @@ -import { FeatureFlag } from '@crowd/types' - import { safeWrap } from '../../middlewares/errorMiddleware' -import { featureFlagMiddleware } from '../../middlewares/featureFlagMiddleware' export default (app) => { app.post(`/tenant/:tenantId/member/query`, safeWrap(require('./memberQuery').default)) - app.post( - `/tenant/:tenantId/member/export`, - featureFlagMiddleware(FeatureFlag.CSV_EXPORT, 'errors.csvExport.planLimitExceeded'), - safeWrap(require('./memberExport').default), - ) + app.post(`/tenant/:tenantId/member/export`, safeWrap(require('./memberExport').default)) app.post(`/tenant/:tenantId/member`, safeWrap(require('./memberCreate').default)) app.put(`/tenant/:tenantId/member/:id`, safeWrap(require('./memberUpdate').default)) @@ -22,11 +15,7 @@ export default (app) => { ) app.get(`/tenant/:tenantId/member/active`, safeWrap(require('./memberActiveList').default)) app.get(`/tenant/:tenantId/member/:id`, safeWrap(require('./memberFind').default)) - app.get( - `/tenant/:tenantId/member/github/:id`, - featureFlagMiddleware(FeatureFlag.FIND_GITHUB, 'errors.featureFlag.notEnabled'), - safeWrap(require('./memberFindGithub').default), - ) + app.get(`/tenant/:tenantId/member/github/:id`, safeWrap(require('./memberFindGithub').default)) app.put(`/tenant/:tenantId/member/:memberId/merge`, safeWrap(require('./memberMerge').default)) app.post( diff --git a/backend/src/api/member/memberExport.ts b/backend/src/api/member/memberExport.ts index b02ce7bd3e..194de3d9c6 100644 --- a/backend/src/api/member/memberExport.ts +++ b/backend/src/api/member/memberExport.ts @@ -1,12 +1,10 @@ import { generateUUIDv4 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey, ITriggerCSVExport, TemporalWorkflowId } from '@crowd/types' +import { ITriggerCSVExport, TemporalWorkflowId } from '@crowd/types' import Permissions from '../../security/permissions' import identifyTenant from '../../segment/identifyTenant' import track from '../../segment/track' import PermissionChecker from '../../services/user/permissionChecker' -import { getSecondsTillEndOfMonth } from '../../utils/timing' /** * POST /tenant/{tenantId}/member/export @@ -24,25 +22,6 @@ import { getSecondsTillEndOfMonth } from '../../utils/timing' export default async (req, res) => { new PermissionChecker(req).validateHas(Permissions.values.memberRead) - const csvCountCache = new RedisCache(FeatureFlagRedisKey.CSV_EXPORT_COUNT, req.redis, req.log) - - const csvCount = await csvCountCache.get(req.currentTenant.id) - - const secondsRemainingUntilEndOfMonth = getSecondsTillEndOfMonth() - - // Increment the count in realtime to give user feedback as early as possible - // regarding their usage. The usage will be decremented in the workflow if the - // export fails. - if (!csvCount) { - await csvCountCache.set(req.currentTenant.id, '0', secondsRemainingUntilEndOfMonth) - } else { - await csvCountCache.set( - req.currentTenant.id, - (parseInt(csvCount, 10) + 1).toString(), - secondsRemainingUntilEndOfMonth, - ) - } - await req.temporal.workflow.start('exportMembersToCSV', { taskQueue: 'exports', workflowId: `${TemporalWorkflowId.MEMBERS_CSV_EXPORTS}/${ diff --git a/backend/src/api/member/memberFind.ts b/backend/src/api/member/memberFind.ts index 6bc982ad96..157aceea98 100644 --- a/backend/src/api/member/memberFind.ts +++ b/backend/src/api/member/memberFind.ts @@ -1,6 +1,3 @@ -import { FeatureFlag } from '@crowd/types' - -import isFeatureEnabled from '../../feature-flags/isFeatureEnabled' import Permissions from '../../security/permissions' import MemberService from '../../services/memberService' import PermissionChecker from '../../services/user/permissionChecker' @@ -25,14 +22,11 @@ export default async (req, res) => { const segmentId = req.query.segments?.length > 0 ? req.query.segments[0] : null if (!segmentId) { - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, req) - if (segmentsEnabled) { - await req.responseHandler.error(req, res, { - code: 400, - message: 'Segment ID is required', - }) - return - } + await req.responseHandler.error(req, res, { + code: 400, + message: 'Segment ID is required', + }) + return } const payload = await new MemberService(req).findById(req.params.id, segmentId, req.query.include) diff --git a/backend/src/api/organization/index.ts b/backend/src/api/organization/index.ts index bebdbed1dc..6a2dbe24b6 100644 --- a/backend/src/api/organization/index.ts +++ b/backend/src/api/organization/index.ts @@ -1,7 +1,4 @@ -import { FeatureFlag } from '@crowd/types' - import { safeWrap } from '../../middlewares/errorMiddleware' -import { featureFlagMiddleware } from '../../middlewares/featureFlagMiddleware' export default (app) => { app.post(`/tenant/:tenantId/organization`, safeWrap(require('./organizationCreate').default)) @@ -44,7 +41,6 @@ export default (app) => { app.post( `/tenant/:tenantId/organization/export`, - featureFlagMiddleware(FeatureFlag.CSV_EXPORT, 'errors.csvExport.planLimitExceeded'), safeWrap(require('./organizationExport').default), ) diff --git a/backend/src/api/organization/organizationExport.ts b/backend/src/api/organization/organizationExport.ts index f1c431153d..6cdffc8492 100644 --- a/backend/src/api/organization/organizationExport.ts +++ b/backend/src/api/organization/organizationExport.ts @@ -1,12 +1,10 @@ import { generateUUIDv4 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey, ITriggerCSVExport, TemporalWorkflowId } from '@crowd/types' +import { ITriggerCSVExport, TemporalWorkflowId } from '@crowd/types' import Permissions from '../../security/permissions' import identifyTenant from '../../segment/identifyTenant' import track from '../../segment/track' import PermissionChecker from '../../services/user/permissionChecker' -import { getSecondsTillEndOfMonth } from '../../utils/timing' /** * POST /tenant/{tenantId}/organization/export @@ -24,25 +22,6 @@ import { getSecondsTillEndOfMonth } from '../../utils/timing' export default async (req, res) => { new PermissionChecker(req).validateHas(Permissions.values.organizationRead) - const csvCountCache = new RedisCache(FeatureFlagRedisKey.CSV_EXPORT_COUNT, req.redis, req.log) - - const csvCount = await csvCountCache.get(req.currentTenant.id) - - const secondsRemainingUntilEndOfMonth = getSecondsTillEndOfMonth() - - // Increment the count in realtime to give user feedback as early as possible - // regarding their usage. The usage will be decremented in the workflow if the - // export fails. - if (!csvCount) { - await csvCountCache.set(req.currentTenant.id, '0', secondsRemainingUntilEndOfMonth) - } else { - await csvCountCache.set( - req.currentTenant.id, - (parseInt(csvCount, 10) + 1).toString(), - secondsRemainingUntilEndOfMonth, - ) - } - await req.temporal.workflow.start('exportOrganizationsToCSV', { taskQueue: 'exports', workflowId: `${TemporalWorkflowId.ORGANIZATIONS_CSV_EXPORTS}/${ diff --git a/backend/src/api/tenant/tenantFind.ts b/backend/src/api/tenant/tenantFind.ts index 90e4ffd2fd..b9ffaf07b4 100644 --- a/backend/src/api/tenant/tenantFind.ts +++ b/backend/src/api/tenant/tenantFind.ts @@ -1,6 +1,4 @@ import { Error404 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey } from '@crowd/types' import AutomationRepository from '@/database/repositories/automationRepository' @@ -19,24 +17,10 @@ export default async (req, res) => { payload = await new TenantService(req).findByUrl(req.query.url) } - const csvExportCountCache = new RedisCache( - FeatureFlagRedisKey.CSV_EXPORT_COUNT, - req.redis, - req.log, - ) - - const memberEnrichmentCountCache = new RedisCache( - FeatureFlagRedisKey.MEMBER_ENRICHMENT_COUNT, - req.redis, - req.log, - ) - payload.dataValues = { ...payload.dataValues, - csvExportCount: Number(await csvExportCountCache.get(payload.id)) || 0, automationCount: Number(await AutomationRepository.countAllActive(req.database, payload.id)) || 0, - memberEnrichmentCount: Number(await memberEnrichmentCountCache.get(payload.id)) || 0, } payload.dataValues.settings[0].dataValues = { diff --git a/backend/src/database/repositories/automationRepository.ts b/backend/src/database/repositories/automationRepository.ts index 6e896d72c7..f79f9f6b7c 100644 --- a/backend/src/database/repositories/automationRepository.ts +++ b/backend/src/database/repositories/automationRepository.ts @@ -1,14 +1,7 @@ import Sequelize, { QueryTypes } from 'sequelize' import { Error404 } from '@crowd/common' -import { - AutomationState, - AutomationSyncTrigger, - FeatureFlag, - IAutomationData, - PLAN_LIMITS, - PageData, -} from '@crowd/types' +import { AutomationState, AutomationSyncTrigger, IAutomationData, PageData } from '@crowd/types' import { AutomationCriteria } from '../../types/automationTypes' @@ -37,20 +30,13 @@ export default class AutomationRepository extends RepositoryBase< const transaction = this.transaction - const existingActiveAutomations = await this.findAndCountAll({ - state: AutomationState.ACTIVE, - }) - const record = await this.database.automation.create( { name: data.name, type: data.type, trigger: data.trigger, settings: data.settings, - state: - existingActiveAutomations.count >= PLAN_LIMITS[tenant.plan][FeatureFlag.AUTOMATIONS] - ? AutomationState.DISABLED - : data.state, + state: data.state, tenantId: tenant.id, createdById: currentUser.id, updatedById: currentUser.id, @@ -72,14 +58,7 @@ export default class AutomationRepository extends RepositoryBase< const transaction = this.transaction - const existingActiveAutomations = await this.findAndCountAll({ - state: AutomationState.ACTIVE, - }) - - if ( - data.state === AutomationState.ACTIVE && - existingActiveAutomations.count >= PLAN_LIMITS[currentTenant.plan][FeatureFlag.AUTOMATIONS] - ) { + if (data.state === AutomationState.ACTIVE) { throw new Error(`Maximum number of active automations reached for the plan!`) } diff --git a/backend/src/database/repositories/githubReposRepository.ts b/backend/src/database/repositories/githubReposRepository.ts index 73c16007ee..c53971ac9e 100644 --- a/backend/src/database/repositories/githubReposRepository.ts +++ b/backend/src/database/repositories/githubReposRepository.ts @@ -54,9 +54,6 @@ export default class GithubReposRepository { const transaction = SequelizeRepository.getTransaction(options) const seq = SequelizeRepository.getSequelize(options) - console.log('Old mapping:', oldMapping) - console.log('New mapping:', newMapping) - // Create maps for efficient lookup const oldMappingMap = new Map(oldMapping.map((m) => [m.url, m.segment.id])) const newMappingEntries = Object.entries(newMapping) @@ -67,10 +64,8 @@ export default class GithubReposRepository { return !oldSegmentId || oldSegmentId !== segmentId }) - console.log('Repos to upsert:', reposToUpsert) - if (reposToUpsert.length > 0) { - const result = await GithubReposRepository.bulkInsert( + await GithubReposRepository.bulkInsert( 'githubRepos', ['tenantId', 'integrationId', 'segmentId', 'url'], (idx) => `(:tenantId_${idx}, :integrationId_${idx}, :segmentId_${idx}, :url_${idx})`, @@ -82,17 +77,14 @@ export default class GithubReposRepository { })), options, ) - console.log('Bulk insert result:', result) } // Find repos that were removed (exist in old but not in new) const newUrlSet = new Set(Object.keys(newMapping)) const urlsToRemove = oldMapping.filter((m) => !newUrlSet.has(m.url)).map((m) => m.url) - console.log('URLs to remove:', urlsToRemove) - if (urlsToRemove.length > 0) { - const result = await seq.query( + await seq.query( ` UPDATE "githubRepos" SET "deletedAt" = NOW() @@ -110,7 +102,6 @@ export default class GithubReposRepository { transaction, }, ) - console.log('Delete result:', result) } } diff --git a/backend/src/database/repositories/organizationRepository.ts b/backend/src/database/repositories/organizationRepository.ts index 0920e2c17c..e3dd50f07d 100644 --- a/backend/src/database/repositories/organizationRepository.ts +++ b/backend/src/database/repositories/organizationRepository.ts @@ -43,7 +43,6 @@ import { } from '@crowd/data-access-layer/src/segments' import { FieldTranslatorFactory, OpensearchQueryParser } from '@crowd/opensearch' import { - FeatureFlag, IMemberRenderFriendlyRole, IMemberRoleWithOrganization, IOrganizationIdentity, @@ -56,7 +55,6 @@ import { SegmentProjectNestedData, } from '@crowd/types' -import isFeatureEnabled from '@/feature-flags/isFeatureEnabled' import { IFetchOrganizationMergeSuggestionArgs, SimilarityScoreRange, @@ -1350,8 +1348,6 @@ class OrganizationRepository { const tenant = SequelizeRepository.getCurrentTenant(options) - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, options) - const segment = segments[0] const translator = FieldTranslatorFactory.getTranslator(OpenSearchIndex.ORGANIZATIONS) @@ -1386,7 +1382,7 @@ class OrganizationRepository { }, }) - if (segmentsEnabled && segment) { + if (segment) { // add segment filter parsed.query.bool.must.push({ term: { diff --git a/backend/src/database/utils/sequelizeTestUtils.ts b/backend/src/database/utils/sequelizeTestUtils.ts index 21278e0ed7..15a041442d 100644 --- a/backend/src/database/utils/sequelizeTestUtils.ts +++ b/backend/src/database/utils/sequelizeTestUtils.ts @@ -89,17 +89,11 @@ export default class SequelizeTestUtils { return db } - static async getTestIServiceOptions( - db, - tenantName?, - tenantUrl?, - ) { + static async getTestIServiceOptions(db, tenantName?, tenantUrl?) { db = await this.getDatabase(db) const randomTenant = - tenantName && tenantUrl - ? this.getTenant(tenantName, tenantUrl) - : this.getRandomTestTenant() + tenantName && tenantUrl ? this.getTenant(tenantName, tenantUrl) : this.getRandomTestTenant() const randomUser = await this.getRandomUser() diff --git a/backend/src/middlewares/featureFlagMiddleware.ts b/backend/src/middlewares/featureFlagMiddleware.ts deleted file mode 100644 index e9cd56e8a1..0000000000 --- a/backend/src/middlewares/featureFlagMiddleware.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Error403 } from '@crowd/common' -import { FeatureFlag } from '@crowd/types' - -import isFeatureEnabled from '../feature-flags/isFeatureEnabled' - -export function featureFlagMiddleware(featureFlag: FeatureFlag, errorMessage: string) { - return async (req, res, next) => { - if (!(await isFeatureEnabled(featureFlag, req))) { - await req.responseHandler.error(req, res, new Error403(req.language, errorMessage)) - return - } - next() - } -} diff --git a/backend/src/middlewares/segmentMiddleware.ts b/backend/src/middlewares/segmentMiddleware.ts index 24d6d03f49..9d302dcd0c 100644 --- a/backend/src/middlewares/segmentMiddleware.ts +++ b/backend/src/middlewares/segmentMiddleware.ts @@ -1,17 +1,11 @@ -import { FeatureFlag } from '@crowd/types' - import SegmentRepository from '../database/repositories/segmentRepository' -import isFeatureEnabled from '../feature-flags/isFeatureEnabled' export async function segmentMiddleware(req, res, next) { try { let segments: any = null const segmentRepository = new SegmentRepository(req) - if (!(await isFeatureEnabled(FeatureFlag.SEGMENTS, req))) { - // return default segment - segments = await segmentRepository.querySubprojects({ limit: 1, offset: 0 }) - } else if (req.params.segmentId) { + if (req.params.segmentId) { // for param requests, segments will be in the url segments = { rows: await segmentRepository.findInIds([req.params.segmentId]) } } else if (req.query.segments) { diff --git a/backend/src/services/dashboardService.ts b/backend/src/services/dashboardService.ts index 4a1c239723..789d3f9603 100644 --- a/backend/src/services/dashboardService.ts +++ b/backend/src/services/dashboardService.ts @@ -1,7 +1,5 @@ import { RedisCache } from '@crowd/redis' -import { DashboardTimeframe, FeatureFlag } from '@crowd/types' - -import isFeatureEnabled from '@/feature-flags/isFeatureEnabled' +import { DashboardTimeframe } from '@crowd/types' import { IServiceOptions } from './IServiceOptions' @@ -27,15 +25,12 @@ export default class DashboardService { throw new Error(`Unsupported timeframe ${params.timeframe}!`) } - const segmentsEnabled = await isFeatureEnabled(FeatureFlag.SEGMENTS, this.options) - - if (segmentsEnabled && !params.segment) { - throw new Error(`SegmentId is required in segment enabled deployments!`) + if (!params.segment) { + params.segment = this.options.currentSegments[0]?.id } - // get default segment - if (!segmentsEnabled) { - params.segment = this.options.currentSegments[0].id + if (!params.segment) { + throw new Error('Valid segment ID is required') } let key = `${this.options.currentTenant.id}:${params.segment}:${params.timeframe}` diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index 430f3f47ed..4e9c1c1a70 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -913,14 +913,12 @@ export default class MemberService extends LoggerBase { '[0] Getting member information (identities, tags, tasks, affiliations)... ', ) - const [memberOrganizations, identities, tags, affiliations] = await Promise.all( - [ - MemberOrganizationRepository.findMemberRoles(memberId, this.options), - fetchMemberIdentities(qx, memberId), - findMemberTags(qx, memberId), - findMemberAffiliations(qx, memberId), - ], - ) + const [memberOrganizations, identities, tags, affiliations] = await Promise.all([ + MemberOrganizationRepository.findMemberRoles(memberId, this.options), + fetchMemberIdentities(qx, memberId), + findMemberTags(qx, memberId), + findMemberAffiliations(qx, memberId), + ]) this.options.log.info('[0] Done!') diff --git a/backend/src/services/searchSyncService.ts b/backend/src/services/searchSyncService.ts index 30a06eba0c..b30f9ee3e4 100644 --- a/backend/src/services/searchSyncService.ts +++ b/backend/src/services/searchSyncService.ts @@ -1,10 +1,9 @@ import { SearchSyncWorkerEmitter } from '@crowd/common_services' import { LoggerBase, logExecutionTimeV2 } from '@crowd/logging' import { SearchSyncApiClient } from '@crowd/opensearch' -import { FeatureFlag, SyncMode } from '@crowd/types' +import { SyncMode } from '@crowd/types' import { IS_TEST_ENV } from '@/conf' -import isFeatureEnabled from '@/feature-flags/isFeatureEnabled' import { getSearchSyncWorkerEmitter } from '@/serverless/utils/queueService' import { getSearchSyncApiClient } from '../utils/apiClients' @@ -38,14 +37,6 @@ export default class SearchSyncService extends LoggerBase { return getSearchSyncWorkerEmitter() } - if (this.mode === SyncMode.USE_FEATURE_FLAG) { - if (await isFeatureEnabled(FeatureFlag.SYNCHRONOUS_OPENSEARCH_UPDATES, this.options)) { - return getSearchSyncApiClient() - } - - return getSearchSyncWorkerEmitter() - } - throw new Error(`Unknown mode ${this.mode} !`) } diff --git a/backend/src/services/user/permissionChecker.ts b/backend/src/services/user/permissionChecker.ts index 3e149a7d02..05e42d47a0 100644 --- a/backend/src/services/user/permissionChecker.ts +++ b/backend/src/services/user/permissionChecker.ts @@ -143,7 +143,6 @@ export default class PermissionChecker { } } - private get isEmailVerified() { // Only checks if the email is verified // if the email system is on diff --git a/backend/src/services/user/userDestroyer.ts b/backend/src/services/user/userDestroyer.ts index fafe1325e9..312ad3280e 100644 --- a/backend/src/services/user/userDestroyer.ts +++ b/backend/src/services/user/userDestroyer.ts @@ -60,7 +60,6 @@ export default class UserDestroyer { await TenantUserRepository.destroy(this.options.currentTenant.id, user.id, this.options) } - /** * Checks if the user is removing himself */ diff --git a/backend/src/types/webhooks.ts b/backend/src/types/webhooks.ts new file mode 100644 index 0000000000..17bf364f6a --- /dev/null +++ b/backend/src/types/webhooks.ts @@ -0,0 +1,57 @@ +import { BaseError } from './baseError' + +export enum WebhookState { + PENDING = 'PENDING', + PROCESSED = 'PROCESSED', + PROCESSING = 'PROCESSING', + ERROR = 'ERROR', +} + +export enum WebhookType { + GITHUB = 'GITHUB', + DISCOURSE = 'DISCOURSE', + GROUPSIO = 'GROUPSIO', +} + +export interface GithubWebhookPayload { + signature: string + event: string + data: any +} + +export type IncomingWebhookPayload = GithubWebhookPayload + +export interface IncomingWebhookData { + id: string + tenantId: string + integrationId: string + state: WebhookState + type: WebhookType + payload: IncomingWebhookPayload + processedAt: string | null + error: any | null + createdAt: string +} + +export interface DbIncomingWebhookInsertData { + tenantId: string + integrationId: string + type: WebhookType + payload: any +} + +export interface PendingWebhook { + id: string + tenantId: string +} + +export interface ErrorWebhook extends PendingWebhook {} + +export class WebhookError extends BaseError { + public webhookId: string + + constructor(webhookId: string, message: string, origError?: any) { + super(message, origError) + this.webhookId = webhookId + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32203e98eb..f41455cb3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@actions/core': specifier: ^1.10.1 - version: 1.10.1 + version: 1.11.1 '@actions/exec': specifier: ^1.1.1 version: 1.1.1 @@ -23,40 +23,40 @@ importers: devDependencies: '@types/node': specifier: ^20.10.6 - version: 20.12.7 + version: 20.17.12 '@typescript-eslint/eslint-plugin': specifier: ^6.7.4 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^6.7.4 - version: 6.21.0(eslint@8.57.0)(typescript@5.6.3) + version: 6.21.0(eslint@8.57.1)(typescript@5.7.2) '@vercel/ncc': specifier: ^0.38.1 - version: 0.38.1 + version: 0.38.3 eslint: specifier: ^8.50.0 - version: 8.57.0 + version: 8.57.1 eslint-config-prettier: specifier: ^9.0.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.0.0 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2) prettier: specifier: ^3.0.3 - version: 3.2.5 + version: 3.4.2 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.4.17)(@types/node@20.12.7)(typescript@5.6.3) + version: 10.9.2(@types/node@20.17.12)(typescript@5.7.2) typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 backend: dependencies: '@aws-sdk/client-comprehend': specifier: ^3.159.0 - version: 3.564.0 + version: 3.723.0 '@aws-sdk/hash-node': specifier: ^3.226.0 version: 3.374.0 @@ -65,13 +65,13 @@ importers: version: 3.374.0 '@aws-sdk/s3-request-presigner': specifier: ^3.229.0 - version: 3.564.0 + version: 3.723.0 '@aws-sdk/url-parser': specifier: ^3.226.0 version: 3.374.0 '@aws-sdk/util-format-url': specifier: ^3.226.0 - version: 3.535.0 + version: 3.723.0 '@crowd/audit-logs': specifier: workspace:* version: link:../services/libs/audit-logs @@ -116,22 +116,22 @@ importers: version: link:../services/libs/types '@google-cloud/storage': specifier: 5.3.0 - version: 5.3.0(encoding@0.1.13) + version: 5.3.0 '@octokit/auth-app': specifier: ^3.6.1 - version: 3.6.1(encoding@0.1.13) + version: 3.6.1 '@octokit/core': specifier: ^6.1.2 - version: 6.1.2 + version: 6.1.3 '@octokit/graphql': specifier: ^4.8.0 - version: 4.8.0(encoding@0.1.13) + version: 4.8.0 '@octokit/request': specifier: ^5.6.3 - version: 5.6.3(encoding@0.1.13) + version: 5.6.3 '@opensearch-project/opensearch': specifier: ^2.11.0 - version: 2.11.0 + version: 2.13.0 '@sendgrid/eventwebhook': specifier: ^7.7.0 version: 7.7.0 @@ -140,10 +140,10 @@ importers: version: 7.2.6 '@slack/web-api': specifier: ^6.7.2 - version: 6.12.0 + version: 6.13.0 '@superfaceai/one-sdk': specifier: ^1.3.0 - version: 1.5.2(encoding@0.1.13) + version: 1.5.2 '@superfaceai/passport-twitter-oauth2': specifier: ^1.0.0 version: 1.2.4 @@ -161,10 +161,10 @@ importers: version: 5.0.0 body-parser: specifier: ^1.20.1 - version: 1.20.2 + version: 1.20.3 bufferutil: specifier: ^4.0.7 - version: 4.0.8 + version: 4.0.9 bunyan: specifier: ^1.8.15 version: 1.8.15 @@ -188,7 +188,7 @@ importers: version: 6.1.3 config: specifier: ^3.3.8 - version: 3.3.11 + version: 3.3.12 cors: specifier: 2.8.5 version: 2.8.5 @@ -206,10 +206,10 @@ importers: version: 4.2.0 csv-parse: specifier: ^5.5.6 - version: 5.5.6 + version: 5.6.0 discord.js: specifier: ^14.7.1 - version: 14.14.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 14.17.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) dotenv: specifier: 8.2.0 version: 8.2.0 @@ -263,13 +263,13 @@ importers: version: 2.29.4 moment-timezone: specifier: ^0.5.34 - version: 0.5.45 + version: 0.5.46 mv: specifier: 2.1.1 version: 2.1.1 node-fetch: specifier: ^2.6.7 - version: 2.7.0(encoding@0.1.13) + version: 2.7.0 omit-deep-by-values: specifier: ^1.0.2 version: 1.0.2 @@ -296,16 +296,16 @@ importers: version: 6.1.5 pg: specifier: ^8.7.3 - version: 8.11.5 + version: 8.13.1 pg-promise: specifier: ^11.4.3 - version: 11.6.0 + version: 11.10.2(pg-query-stream@4.7.1) sanitize-html: specifier: ^2.7.1 - version: 2.13.0 + version: 2.14.0 sequelize: specifier: 6.21.2 - version: 6.21.2(pg@8.11.5) + version: 6.21.2(pg@8.13.1) sequelize-cli-typescript: specifier: ^3.2.0-c version: 3.2.0-c @@ -314,7 +314,7 @@ importers: version: 2.8.0 socket.io: specifier: ^4.5.4 - version: 4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) superagent: specifier: ^8.0.0 version: 8.1.2 @@ -329,7 +329,7 @@ importers: version: 9.0.1 validator: specifier: ^13.7.0 - version: 13.11.0 + version: 13.12.0 verify-github-webhook: specifier: ^1.0.1 version: 1.0.1 @@ -339,16 +339,16 @@ importers: devDependencies: '@babel/core': specifier: ^7.21.8 - version: 7.24.4 + version: 7.26.0 '@babel/preset-env': specifier: ^7.21.5 - version: 7.24.4(@babel/core@7.24.4) + version: 7.26.0(@babel/core@7.26.0) '@babel/preset-typescript': specifier: ^7.21.5 - version: 7.24.1(@babel/core@7.24.4) + version: 7.26.0(@babel/core@7.26.0) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 - version: 4.3.0(prettier@3.3.3) + version: 4.3.0(prettier@3.4.2) '@types/bunyan': specifier: ^1.8.8 version: 1.8.11 @@ -357,22 +357,22 @@ importers: version: 0.2.9 '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/cron': specifier: ^2.0.0 - version: 2.4.0 + version: 2.4.3 '@types/html-to-text': specifier: ^8.1.1 version: 8.1.1 '@types/jest': specifier: ^29.5.1 - version: 29.5.12 + version: 29.5.14 '@types/node': specifier: ~18.0.4 version: 18.0.6 '@types/sanitize-html': specifier: ^2.6.2 - version: 2.11.0 + version: 2.13.0 '@types/superagent': specifier: ^4.1.15 version: 4.1.24 @@ -381,10 +381,10 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^5.17.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^5.17.0 - version: 5.62.0(eslint@8.57.0)(typescript@5.6.3) + version: 5.62.0(eslint@8.57.1)(typescript@5.7.2) copyfiles: specifier: 2.4.1 version: 2.4.1 @@ -396,22 +396,22 @@ importers: version: 1.1.9 eslint: specifier: ^8.12.0 - version: 8.57.0 + version: 8.57.1 eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0))(eslint@8.57.0) + version: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: ^16.1.4 - version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0))(eslint@8.57.0) + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-config-prettier: specifier: ^8.5.0 - version: 8.10.0(eslint@8.57.0) + version: 8.10.0(eslint@8.57.1) eslint-plugin-import: specifier: ^2.25.4 - version: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) + version: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.0.6) node-mocks-http: specifier: 1.9.0 version: 1.9.0 @@ -420,46 +420,46 @@ importers: version: 2.0.4 prettier: specifier: ^3.3.3 - version: 3.3.3 + version: 3.4.2 rdme: specifier: ^7.2.0 - version: 7.5.0(encoding@0.1.13)(openapi-types@12.1.3) + version: 7.5.0(openapi-types@12.1.3) supertest: specifier: ^6.2.2 version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.1.2(@babel/core@7.24.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.4))(jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.2) tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services: devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 - version: 4.3.0(prettier@3.3.3) + version: 4.3.0(prettier@3.4.2) '@typescript-eslint/eslint-plugin': specifier: ^5.59.2 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^5.59.2 - version: 5.62.0(eslint@8.57.0)(typescript@5.6.3) + version: 5.62.0(eslint@8.57.1)(typescript@5.7.2) eslint: specifier: ^8.39.0 - version: 8.57.0 + version: 8.57.1 eslint-config-prettier: specifier: ^8.8.0 - version: 8.10.0(eslint@8.57.0) + version: 8.10.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.1 - version: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) + version: 5.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2) prettier: specifier: ^3.3.3 - version: 3.3.3 + version: 3.4.2 services/apps/activities_worker: dependencies: @@ -480,29 +480,29 @@ importers: version: link:../../libs/types '@temporalio/activity': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 html-to-text: specifier: ^9.0.5 version: 9.0.5 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/automations_worker: dependencies: @@ -532,7 +532,7 @@ importers: version: link:../../libs/types '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 html-to-mrkdwn-ts: specifier: ^1.1.0 version: 1.1.0 @@ -547,20 +547,20 @@ importers: version: 8.1.2 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/superagent': specifier: ^4.1.20 version: 4.1.24 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/cache_worker: dependencies: @@ -587,26 +587,26 @@ importers: version: link:../../libs/types '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 moment: specifier: ~2.29.4 version: 2.29.4 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/data_sink_worker: dependencies: @@ -648,13 +648,13 @@ importers: version: link:../../libs/types '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 crowd-sentiment: specifier: ^1.1.7 version: 1.1.7 @@ -669,13 +669,13 @@ importers: version: 4.7.0 moment-timezone: specifier: ^0.5.34 - version: 0.5.45 + version: 0.5.46 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: nodemon: specifier: ^2.0.22 @@ -706,10 +706,10 @@ importers: version: 7.7.0 '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 axios: specifier: ~1.5.1 version: 1.5.1 @@ -724,23 +724,23 @@ importers: version: 2.29.4 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 uuid: specifier: ~9.0.1 version: 9.0.1 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/uuid': specifier: ~9.0.6 version: 9.0.8 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/entity_merging_worker: dependencies: @@ -764,20 +764,20 @@ importers: version: link:../../libs/types '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/exports_worker: dependencies: @@ -789,13 +789,13 @@ importers: version: 3.374.0 '@aws-sdk/s3-request-presigner': specifier: ^3.229.0 - version: 3.564.0 + version: 3.723.0 '@aws-sdk/url-parser': specifier: ^3.226.0 version: 3.374.0 '@aws-sdk/util-format-url': specifier: ^3.226.0 - version: 3.535.0 + version: 3.723.0 '@crowd/archetype-standard': specifier: workspace:* version: link:../../archetypes/standard @@ -819,10 +819,10 @@ importers: version: link:../../libs/types '@sendgrid/mail': specifier: ~8.1.0 - version: 8.1.3 + version: 8.1.4 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 aws-sdk: specifier: 2.814.0 version: 2.814.0 @@ -837,20 +837,20 @@ importers: version: 2.30.1 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/uuid': specifier: ~9.0.6 version: 9.0.8 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/integration_run_worker: dependencies: @@ -886,20 +886,20 @@ importers: version: 1.6.8 config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -932,20 +932,20 @@ importers: version: link:../../libs/types config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -975,23 +975,23 @@ importers: version: link:../../libs/types '@opensearch-project/opensearch': specifier: ^2.11.0 - version: 2.11.0 + version: 2.13.0 config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -1030,13 +1030,13 @@ importers: version: link:../../libs/types '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 auth0: specifier: ^4.3.1 - version: 4.3.1 + version: 4.15.0 axios: specifier: ~1.6.2 version: 1.6.8 @@ -1048,26 +1048,26 @@ importers: version: 2.29.4 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/uuid': specifier: ~9.0.6 version: 9.0.8 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/merge_suggestions_worker: dependencies: '@aws-sdk/client-bedrock-runtime': specifier: ^3.572.0 - version: 3.572.0 + version: 3.723.0 '@crowd/archetype-standard': specifier: workspace:* version: link:../../archetypes/standard @@ -1091,10 +1091,10 @@ importers: version: link:../../libs/types '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 axios: specifier: ^1.6.8 version: 1.6.8 @@ -1103,17 +1103,17 @@ importers: version: 3.0.0 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/organizations_enrichment_worker: dependencies: @@ -1143,29 +1143,29 @@ importers: version: link:../../libs/types '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 peopledatalabs: specifier: ~6.1.5 version: 6.1.5 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/uuid': specifier: ~9.0.6 version: 9.0.8 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/profiles_worker: dependencies: @@ -1189,26 +1189,26 @@ importers: version: link:../../libs/types '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 '@types/uuid': specifier: ~9.0.6 version: 9.0.8 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/script_executor_worker: dependencies: @@ -1232,7 +1232,7 @@ importers: version: link:../../libs/types '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 axios: specifier: ^1.6.8 version: 1.6.8 @@ -1241,17 +1241,17 @@ importers: version: 2.29.4 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/search_sync_api: dependencies: @@ -1281,7 +1281,7 @@ importers: version: 1.0.2 config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 cors: specifier: ^2.8.5 version: 2.8.5 @@ -1290,20 +1290,20 @@ importers: version: 4.18.3 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/express': specifier: ^4.17.17 version: 4.17.21 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -1336,20 +1336,20 @@ importers: version: link:../../libs/types config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -1364,17 +1364,17 @@ importers: version: link:../../archetypes/standard tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/template_worker: dependencies: @@ -1386,20 +1386,20 @@ importers: version: link:../../archetypes/worker '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/temporal_codec_server: dependencies: @@ -1411,7 +1411,7 @@ importers: version: link:../../libs/temporal '@temporalio/proto': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 cors: specifier: ~2.8.5 version: 2.8.5 @@ -1420,17 +1420,17 @@ importers: version: 4.18.3 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 devDependencies: '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 nodemon: specifier: ^3.0.1 - version: 3.1.0 + version: 3.1.9 services/apps/webhook_api: dependencies: @@ -1460,19 +1460,19 @@ importers: version: link:../../libs/types '@types/config': specifier: ^3.3.0 - version: 3.3.4 + version: 3.3.5 '@types/express': specifier: ^4.17.17 version: 4.17.21 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 bunyan-middleware: specifier: ^1.0.2 version: 1.0.2 config: specifier: ^3.3.9 - version: 3.3.11 + version: 3.3.12 cors: specifier: ^2.8.5 version: 2.8.5 @@ -1481,10 +1481,10 @@ importers: version: 4.18.3 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 verify-github-webhook: specifier: ^1.0.1 version: 1.0.1 @@ -1504,13 +1504,13 @@ importers: devDependencies: '@types/config': specifier: ^3.3.1 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/archetypes/standard: dependencies: @@ -1543,17 +1543,17 @@ importers: version: 2.2.4 pg-promise: specifier: ^11.4.3 - version: 11.6.0 + version: 11.10.2(pg-query-stream@4.7.1) devDependencies: '@types/config': specifier: ^3.3.1 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/archetypes/worker: dependencies: @@ -1583,23 +1583,23 @@ importers: version: link:../../libs/temporal '@temporalio/activity': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/worker': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/workflow': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 devDependencies: '@types/config': specifier: ^3.3.1 - version: 3.3.4 + version: 3.3.5 '@types/node': specifier: ^20.8.2 - version: 20.12.7 + version: 20.17.12 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/audit-logs: dependencies: @@ -1612,10 +1612,10 @@ importers: devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/common: dependencies: @@ -1627,26 +1627,26 @@ importers: version: 4.4.2 moment-timezone: specifier: ^0.5.34 - version: 0.5.45 + version: 0.5.46 tldts: specifier: ^6.1.11 - version: 6.1.18 + version: 6.1.71 uuid: specifier: ^9.0.0 version: 9.0.1 devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/common_services: dependencies: '@aws-sdk/client-bedrock-runtime': specifier: ^3.572.0 - version: 3.572.0 + version: 3.723.0 '@crowd/common': specifier: workspace:* version: link:../common @@ -1668,10 +1668,10 @@ importers: devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/data-access-layer: dependencies: @@ -1719,26 +1719,26 @@ importers: version: 2.29.4 pg-promise: specifier: ^11.4.3 - version: 11.6.0 + version: 11.10.2(pg-query-stream@4.7.1) pg-query-stream: specifier: ^4.7.0 - version: 4.7.0(pg@8.11.5) + version: 4.7.1(pg@8.13.1) uuid: specifier: ^9.0.1 version: 9.0.1 validator: specifier: ^13.7.0 - version: 13.11.0 + version: 13.12.0 devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 sequelize: specifier: 6.21.2 - version: 6.21.2(pg@8.11.5) + version: 6.21.2(pg@8.13.1) typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/database: dependencies: @@ -1750,14 +1750,14 @@ importers: version: link:../logging pg-promise: specifier: ^11.4.3 - version: 11.6.0 + version: 11.10.2(pg-query-stream@4.7.1) devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/integrations: dependencies: @@ -1781,13 +1781,13 @@ importers: version: link:../types '@gitbeaker/rest': specifier: ^40.1.2 - version: 40.2.1 + version: 40.6.0 '@octokit/auth-app': specifier: ^4.0.13 - version: 4.0.13(encoding@0.1.13) + version: 4.0.13 '@octokit/graphql': specifier: ^5.0.6 - version: 5.0.6(encoding@0.1.13) + version: 5.0.6 axios: specifier: ^1.4.0 version: 1.6.8 @@ -1802,7 +1802,7 @@ importers: version: 4.6.2 sanitize-html: specifier: ^2.10.0 - version: 2.13.0 + version: 2.14.0 verify-github-webhook: specifier: ^1.0.1 version: 1.0.1 @@ -1812,13 +1812,13 @@ importers: version: 1.2.3 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 '@types/sanitize-html': specifier: ^2.9.0 - version: 2.11.0 + version: 2.13.0 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/logging: dependencies: @@ -1840,10 +1840,10 @@ importers: version: 0.2.9 '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/opensearch: dependencies: @@ -1873,7 +1873,7 @@ importers: version: link:../types '@opensearch-project/opensearch': specifier: ^2.11.0 - version: 2.11.0 + version: 2.13.0 axios: specifier: ^1.6.0 version: 1.6.8 @@ -1883,10 +1883,10 @@ importers: devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/questdb: dependencies: @@ -1904,20 +1904,20 @@ importers: version: 3.0.0 pg-promise: specifier: ^11.4.3 - version: 11.6.0 + version: 11.10.2(pg-query-stream@4.7.1) devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/queue: dependencies: '@aws-sdk/client-sqs': specifier: ^3.332.0 - version: 3.564.0 + version: 3.723.0 '@crowd/common': specifier: workspace:* version: link:../common @@ -1933,10 +1933,10 @@ importers: devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/redis: dependencies: @@ -1951,30 +1951,30 @@ importers: version: link:../types redis: specifier: ^4.6.6 - version: 4.6.13 + version: 4.7.0 devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/snowflake: dependencies: snowflake-sdk: specifier: ^1.14.0 - version: 1.15.0(asn1.js@5.4.1)(encoding@0.1.13) + version: 1.15.0(asn1.js@5.4.1) devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 tsx: specifier: ^4.7.1 - version: 4.7.3 + version: 4.19.2 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/telemetry: dependencies: @@ -1983,14 +1983,14 @@ importers: version: link:../logging dd-trace: specifier: ^4.38.0 - version: 4.38.0 + version: 4.54.0 devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/temporal: dependencies: @@ -1999,40 +1999,40 @@ importers: version: link:../logging '@temporalio/client': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/common': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 '@temporalio/proto': specifier: ~1.11.1 - version: 1.11.1 + version: 1.11.5 devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 services/libs/types: devDependencies: '@types/node': specifier: ^18.16.3 - version: 18.19.31 + version: 18.19.70 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.7.2 packages: - '@actions/core@1.10.1': - resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} + '@actions/core@1.11.1': + resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} '@actions/exec@1.1.1': resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} - '@actions/http-client@2.2.1': - resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} @@ -2041,16 +2041,9 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@apidevtools/openapi-schemas@2.1.0': - resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} - engines: {node: '>=10'} - '@apidevtools/swagger-methods@3.0.2': resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - '@aws-crypto/crc32@3.0.0': - resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -2058,618 +2051,396 @@ packages: '@aws-crypto/crc32c@5.2.0': resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - '@aws-crypto/ie11-detection@3.0.0': - resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} - '@aws-crypto/sha1-browser@5.2.0': resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - '@aws-crypto/sha256-browser@3.0.0': - resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - '@aws-crypto/sha256-js@3.0.0': - resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} - '@aws-crypto/sha256-js@5.2.0': resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} engines: {node: '>=16.0.0'} - '@aws-crypto/supports-web-crypto@3.0.0': - resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} - '@aws-crypto/supports-web-crypto@5.2.0': resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - '@aws-crypto/util@3.0.0': - resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-runtime@3.572.0': - resolution: {integrity: sha512-wEMlBSZIsy1tesdyGeKCIZlhtW6CPl6Jzuj30MFAliSo98bqENPN4nldeiwdw1Lfop7/NKxueIFODnb/SgmtOA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-bedrock-runtime@3.723.0': + resolution: {integrity: sha512-yt4Sw6AA3L4zExZxq3hAIiGyfWuW1097QUZVWkX8oPUvz+/+Uw9Jk29uutFo4I4HE92PiI7G7G1BgQHiWWk5kA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-comprehend@3.564.0': - resolution: {integrity: sha512-P5d7hSgM2PMkYU4yomh6PE23eRj2sXQjMWh/gSSq2hyroJHPXFvx17C8zNfTTTrJ4xvc3fdYm6KS2iwXimwQZQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-comprehend@3.723.0': + resolution: {integrity: sha512-l38rZMThU/Va7r1FwfE6T7R2v5NUpnw0AR46FEPizMwRj1xh5IBn/uFKrm7yooMAVk9GMqSpJXZA5BYDDE31Gw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.689.0': - resolution: {integrity: sha512-qYD1GJEPeLM6H3x8BuAAMXZltvVce5vGiwtZc9uMkBBo3HyFnmPitIPTPfaD1q8LOn/7KFdkY4MJ4e8D3YpV9g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-s3@3.723.0': + resolution: {integrity: sha512-uJkSBWeAbEORApCSc8ZlD8nmmJVZnklauSR+GLnG19ZiHQl3ib6IzT4zdnMHrrIXqVttwkyC8eT703ZUDVaacw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sqs@3.564.0': - resolution: {integrity: sha512-597lRdhqkS4xIwKnvrt7mB2cJzxBL7joJhLj0ZAo9MycK5MBhyaBsWU/1CGlZlWuuSRXtt6y/MBEJmdXSm5MPQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-sqs@3.723.0': + resolution: {integrity: sha512-jsTHOrcRp4yW6mrd3bEdb9RQbNFbcAIGbTHUlRek3/UbWYt+jZNBtTqXQd8dTHwLGS4ttWPBqlhxMdShEhBY2Q==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.564.0': - resolution: {integrity: sha512-LWBXiwA0qlGhpJx3fbFQagVEyVPoecGtJh3+5hoc+CTVnT00J7T0jLe3kgemvEI9kjhIyDW+MFkq1jCttrGNJw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-sso-oidc@3.723.0': + resolution: {integrity: sha512-9IH90m4bnHogBctVna2FnXaIGVORncfdxcqeEIovOxjIJJyHDmEAtA7B91dAM4sruddTbVzOYnqfPVst3odCbA==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/credential-provider-node': ^3.564.0 + '@aws-sdk/client-sts': ^3.723.0 - '@aws-sdk/client-sso-oidc@3.572.0': - resolution: {integrity: sha512-S6C/S6xYesDakEuzYvlY1DMMKLtKQxdbbygq3hfeG2R0jUt9KpRLsQXK8qrBuVCKa3WcnjN/30hp4g/iUWFU/w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.723.0': + resolution: {integrity: sha512-r1ddZDb8yPmdofX1gQ4m8oqKozgkgVONLlAuSprGObbyMy8bYt1Psxu+GjnwMmgVu3vlF069PHyW1ndrBiL1zA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.687.0': - resolution: {integrity: sha512-Rdd8kLeTeh+L5ZuG4WQnWgYgdv7NorytKdZsGjiag1D8Wv3PcJvPqqWdgnI0Og717BSXVoaTYaN34FyqFYSx6Q==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.687.0 + '@aws-sdk/client-sts@3.723.0': + resolution: {integrity: sha512-YyN8x4MI/jMb4LpHsLf+VYqvbColMK8aZeGWVk2fTFsmt8lpTYGaGC1yybSwGX42mZ4W8ucu8SAYSbUraJZEjA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.556.0': - resolution: {integrity: sha512-unXdWS7uvHqCcOyC1de+Fr8m3F2vMg2m24GPea0bg7rVGTYmiyn9mhUX11VCt+ozydrw+F50FQwL6OqoqPocmw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/core@3.723.0': + resolution: {integrity: sha512-UraXNmvqj3vScSsTkjMwQkhei30BhXlW5WxX6JacMKVtl95c7z0qOXquTWeTalYkFfulfdirUhvSZrl+hcyqTw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.572.0': - resolution: {integrity: sha512-S+xhScao5MD79AkrcHmFpEDk+CgoiuB/31WFcTcnrTio5TOUONAaT0QyscOIwRp7BZ7Aez7TBM+loTteJ+TQvg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-env@3.723.0': + resolution: {integrity: sha512-OuH2yULYUHTVDUotBoP/9AEUIJPn81GQ/YBtZLoo2QyezRJ2QiO/1epVtbJlhNZRwXrToLEDmQGA2QfC8c7pbA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.687.0': - resolution: {integrity: sha512-dfj0y9fQyX4kFill/ZG0BqBTLQILKlL7+O5M4F9xlsh2WNuV2St6WtcOg14Y1j5UODPJiJs//pO+mD1lihT5Kw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-http@3.723.0': + resolution: {integrity: sha512-DTsKC6xo/kz/ZSs1IcdbQMTgiYbpGTGEd83kngFc1bzmw7AmK92DBZKNZpumf8R/UfSpTcj9zzUUmrWz1kD0eQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.556.0': - resolution: {integrity: sha512-TsK3js7Suh9xEmC886aY+bv0KdLLYtzrcmVt6sJ/W6EnDXYQhBuKYFhp03NrN2+vSvMGpqJwR62DyfKe1G0QzQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-ini@3.723.0': + resolution: {integrity: sha512-fWRLksuSG851e7Iu+ltMrQTM7C/5iI9OkxAmCYblcCetAzjTRmMB2arku0Z83D8edIZEQtOJMt5oQ9KNg43pzg==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/credential-provider-node': ^3.556.0 + '@aws-sdk/client-sts': ^3.723.0 - '@aws-sdk/client-sts@3.572.0': - resolution: {integrity: sha512-jCQuH2qkbWoSY4wckLSfzf3OPh7zc7ZckEbIGGVUQar/JVff6EIbpQ+uNG29DDEOpdPPd8rrJsVuUlA/nvJdXA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/client-sts@3.687.0': - resolution: {integrity: sha512-SQjDH8O4XCTtouuCVYggB0cCCrIaTzUZIkgJUpOsIEJBLlTbNOb/BZqUShAQw2o9vxr2rCeOGjAQOYPysW/Pmg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-node@3.723.0': + resolution: {integrity: sha512-OyLHt+aY+rkuRejigcxviS5RLUBcqbxhDTSNfP8dp9I+1SP610qRLpTIROvtKwXZssFcATpPfgikFtVYRrihXQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.556.0': - resolution: {integrity: sha512-vJaSaHw2kPQlo11j/Rzuz0gk1tEaKdz+2ser0f0qZ5vwFlANjt08m/frU17ctnVKC1s58bxpctO/1P894fHLrA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-process@3.723.0': + resolution: {integrity: sha512-fgupvUjz1+jeoCBA7GMv0L6xEk92IN6VdF4YcFhsgRHlHvNgm7ayaoKQg7pz2JAAhG/3jPX6fp0ASNy+xOhmPA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.572.0': - resolution: {integrity: sha512-DBmf94qfN0dfaLl5EnNcq6TakWfOtVXYifHoTbX+VBwESj3rlY4W+W4mAnvBgAqDjlLFy7bBljmx+vnjnV73lg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.723.0': + resolution: {integrity: sha512-laCnxrk0pgUegU+ib6rj1/Uv51wei+cH8crvBJddybc8EDn7Qht61tCvBwf3o33qUDC+ZWZZewlpSebf+J+tBw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.686.0': - resolution: {integrity: sha512-Xt3DV4DnAT3v2WURwzTxWQK34Ew+iiLzoUoguvLaZrVMFOqMMrwVjP+sizqIaHp1j7rGmFcN5I8saXnsDLuQLA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-web-identity@3.723.0': + resolution: {integrity: sha512-tl7pojbFbr3qLcOE6xWaNCf1zEfZrIdSJtOPeSXfV/thFMMAvIjgf3YN6Zo1a6cxGee8zrV/C8PgOH33n+Ev/A==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.723.0 - '@aws-sdk/credential-provider-env@3.535.0': - resolution: {integrity: sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==} + '@aws-sdk/hash-node@3.374.0': + resolution: {integrity: sha512-5GmU64bwoQhkebMv7NzHa+Mw+p7ZmrKz9e3A6hKClxVGeZFE/+jME46gMuFYzO0iz3WqX4CCzUVOhNbS0x8EMQ==} engines: {node: '>=14.0.0'} + deprecated: This package has moved to @smithy/hash-node - '@aws-sdk/credential-provider-env@3.568.0': - resolution: {integrity: sha512-MVTQoZwPnP1Ev5A7LG+KzeU6sCB8BcGkZeDT1z1V5Wt7GPq0MgFQTSSjhImnB9jqRSZkl1079Bt3PbO6lfIS8g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.723.0': + resolution: {integrity: sha512-OmKSXwSlXyW+zg+xq4hUf7V4VF5/fa4LHu1JzeBlomrKX3/NnqhnJn7760GXoDr16AT+dP7nvv35Ofp91umEAg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.686.0': - resolution: {integrity: sha512-osD7lPO8OREkgxPiTWmA1i6XEmOth1uW9HWWj/+A2YGCj1G/t2sHu931w4Qj9NWHYZtbTTXQYVRg+TErALV7nQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-expect-continue@3.723.0': + resolution: {integrity: sha512-w/O0EkIzkiqvGu7U8Ke7tue0V0HYM5dZQrz6nVU+R8T2LddWJ+njEIHU4Wh8aHPLQXdZA5NQumv0xLPdEutykw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.552.0': - resolution: {integrity: sha512-vsmu7Cz1i45pFEqzVb4JcFmAmVnWFNLsGheZc8SCptlqCO5voETrZZILHYIl4cjKkSDk3pblBOf0PhyjqWW6WQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.723.0': + resolution: {integrity: sha512-JY76mrUCLa0FHeMZp8X9+KK6uEuZaRZaQrlgq6zkXX/3udukH0T3YdFC+Y9uw5ddbiwZ5+KwgmlhnPpiXKfP4g==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.568.0': - resolution: {integrity: sha512-gL0NlyI2eW17hnCrh45hZV+qjtBquB+Bckiip9R6DIVRKqYcoILyiFhuOgf2bXeF23gVh6j18pvUvIoTaFWs5w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.723.0': + resolution: {integrity: sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.686.0': - resolution: {integrity: sha512-xyGAD/f3vR/wssUiZrNFWQWXZvI4zRm2wpHhoHA1cC2fbRMNFYtFn365yw6dU7l00ZLcdFB1H119AYIUZS7xbw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-location-constraint@3.723.0': + resolution: {integrity: sha512-inp9tyrdRWjGOMu1rzli8i2gTo0P4X6L7nNRXNTKfyPNZcBimZ4H0H1B671JofSI5isaklVy5r4pvv2VjjLSHw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.564.0': - resolution: {integrity: sha512-kiEfBoKRcbX7I/rjhVGJrTUQ0895ANhPu6KE1GRZW7wc1gIGgKGJ+0tvAqRtQjYX0U9pivEDb0dh16OF9PBFFw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-logger@3.723.0': + resolution: {integrity: sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.572.0': - resolution: {integrity: sha512-05KzbAp77fEiQXqMeodXeMbT83FOqSyBrfSEMz6U8uBXeJCy8zPUjN3acqcbG55/HNJHUvg1cftqzy+fUz71gA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': 3.572.0 + '@aws-sdk/middleware-recursion-detection@3.723.0': + resolution: {integrity: sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.687.0': - resolution: {integrity: sha512-6d5ZJeZch+ZosJccksN0PuXv7OSnYEmanGCnbhUqmUSz9uaVX6knZZfHCZJRgNcfSqg9QC0zsFA/51W5HCUqSQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.687.0 + '@aws-sdk/middleware-sdk-s3@3.723.0': + resolution: {integrity: sha512-wfjOvNJVp8LDWhq4wO5jtSMb8Vgf4tNlR7QTEQfoYc6AGU3WlK5xyUQcpfcpwytEhQTN9u0cJLQpSyXDO+qSCw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.564.0': - resolution: {integrity: sha512-HXD5ZCXzfcd6cJ/pW8frh8DuYlKaCd/JKmwzuCRUxgxZwbLEeNmyRYvF+D7osETJJZ4VIwgVbpEw1yLqRz1onw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-sdk-sqs@3.723.0': + resolution: {integrity: sha512-CnOCbwq5VRSawX4FIWO9gb00iEoOKuD0ygbPQZLADNgeMimmJXIEa3eSYUtBYaXafwPIiMh2vffd2mGhx5rVWQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.572.0': - resolution: {integrity: sha512-anlYZnpmVkfp9Gan+LcEkQvmRf/m0KcbR11th8sBEyI5lxMaHKXhnAtC/hEGT7e3L6rgNOrFYTPuSvllITD/Pg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-ssec@3.723.0': + resolution: {integrity: sha512-Bs+8RAeSMik6ZYCGSDJzJieGsDDh2fRbh1HQG94T8kpwBXVxMYihm6e9Xp2cyl+w9fyyCnh0IdCKChP/DvrdhA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.687.0': - resolution: {integrity: sha512-Pqld8Nx11NYaBUrVk3bYiGGpLCxkz8iTONlpQWoVWFhSOzlO7zloNOaYbD2XgFjjqhjlKzE91drs/f41uGeCTA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-user-agent@3.723.0': + resolution: {integrity: sha512-AY5H2vD3IRElplBO4DCyRMNnOG/4/cb0tsHyLe1HJy0hdUF6eY5z/VVjKJoKbbDk7ui9euyOBWslXxDyLmyPWg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.535.0': - resolution: {integrity: sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==} + '@aws-sdk/node-http-handler@3.374.0': + resolution: {integrity: sha512-v1Z6m0wwkf65/tKuhwrtPRqVoOtNkDTRn2MBMtxCwEw+8V8Q+YRFqVgGN+J1n53ktE0G5OYVBux/NHiAjJHReQ==} engines: {node: '>=14.0.0'} + deprecated: This package has moved to @smithy/node-http-handler - '@aws-sdk/credential-provider-process@3.572.0': - resolution: {integrity: sha512-hXcOytf0BadSm/MMy7MV8mmY0+Jv3mkavsHNBx0R82hw5ollD0I3JyOAaCtdUpztF0I72F8K+q8SpJQZ+EwArw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-process@3.686.0': - resolution: {integrity: sha512-sXqaAgyzMOc+dm4CnzAR5Q6S9OWVHyZjLfW6IQkmGjqeQXmZl24c4E82+w64C+CTkJrFLzH1VNOYp1Hy5gE6Qw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-sso@3.564.0': - resolution: {integrity: sha512-Wv0NV8tDwtydEpsp/kVZ22Z+40bsSBDYgYZ1Uxx+KR8a1PvT6B5FnEtccWTJ371sQG/uqLum7dXSbJq1Qqze1w==} + '@aws-sdk/protocol-http@3.374.0': + resolution: {integrity: sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==} engines: {node: '>=14.0.0'} + deprecated: This package has moved to @smithy/protocol-http - '@aws-sdk/credential-provider-sso@3.572.0': - resolution: {integrity: sha512-iIlnpJiDXFp3XC4hJNSiNurnU24mr3iLB3HoNa9efr944bo6XBl9FQdk3NssIkqzSmgyoB2CEUx/daBHz4XSow==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-sso@3.687.0': - resolution: {integrity: sha512-N1YCoE7DovIRF2ReyRrA4PZzF0WNi4ObPwdQQkVxhvSm7PwjbWxrfq7rpYB+6YB1Uq3QPzgVwUFONE36rdpxUQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.723.0': + resolution: {integrity: sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.556.0': - resolution: {integrity: sha512-R/YAL8Uh8i+dzVjzMnbcWLIGeeRi2mioHVGnVF+minmaIkCiQMZg2HPrdlKm49El+RljT28Nl5YHRuiqzEIwMA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/s3-request-presigner@3.723.0': + resolution: {integrity: sha512-aA/Tfppwa6LzOSsvHxnY2Oc1J3tUUHlltt1HVvMWeBa0xh5kpH/0orCsTpGREBJPDJv0Y7VNRJrmv4rDz0gMGQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.568.0': - resolution: {integrity: sha512-ZJSmTmoIdg6WqAULjYzaJ3XcbgBzVy36lir6Y0UBMRGaxDgos1AARuX6EcYzXOl+ksLvxt/xMQ+3aYh1LWfKSw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.568.0 + '@aws-sdk/signature-v4-multi-region@3.723.0': + resolution: {integrity: sha512-lJlVAa5Sl589qO8lwMLVUtnlF1Q7I+6k1Iomv2goY9d1bRl4q2N5Pit2qJVr2AMW0sceQXeh23i2a/CKOqVAdg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.686.0': - resolution: {integrity: sha512-40UqCpPxyHCXDP7CGd9JIOZDgDZf+u1OyLaGBpjQJlz1HYuEsIWnnbTe29Yg3Ah/Zc3g4NBWcUdlGVotlnpnDg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/token-providers@3.723.0': + resolution: {integrity: sha512-hniWi1x4JHVwKElANh9afKIMUhAutHVBRD8zo6usr0PAoj+Waf220+1ULS74GXtLXAPCiNXl5Og+PHA7xT8ElQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.686.0 + '@aws-sdk/client-sso-oidc': ^3.723.0 - '@aws-sdk/hash-node@3.374.0': - resolution: {integrity: sha512-5GmU64bwoQhkebMv7NzHa+Mw+p7ZmrKz9e3A6hKClxVGeZFE/+jME46gMuFYzO0iz3WqX4CCzUVOhNbS0x8EMQ==} - engines: {node: '>=14.0.0'} - deprecated: This package has moved to @smithy/hash-node + '@aws-sdk/types@3.723.0': + resolution: {integrity: sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.686.0': - resolution: {integrity: sha512-6qCoWI73/HDzQE745MHQUYz46cAQxHCgy1You8MZQX9vHAQwqBnkcsb2hGp7S6fnQY5bNsiZkMWVQ/LVd2MNjg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/url-parser@3.374.0': + resolution: {integrity: sha512-RC3yEj4iqw5vbCmR4IQ3rhmFQilwHtWO1mZ9kRTUxfJCge3TVlrZzj9PRW3hxlYKdu3xZjSvCgX3ip8SFKXtbw==} + deprecated: This package has moved to @smithy/url-parser - '@aws-sdk/middleware-expect-continue@3.686.0': - resolution: {integrity: sha512-5yYqIbyhLhH29vn4sHiTj7sU6GttvLMk3XwCmBXjo2k2j3zHqFUwh9RyFGF9VY6Z392Drf/E/cl+qOGypwULpg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.723.0': + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.689.0': - resolution: {integrity: sha512-6VxMOf3mgmAgg6SMagwKj5pAe+putcx2F2odOAWviLcobFpdM/xK9vNry7p6kY+RDNmSlBvcji9wnU59fjV74Q==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-endpoints@3.723.0': + resolution: {integrity: sha512-vR1ZfAUvrTtdA1Q78QxgR8TFgi2gzk+N4EmNjbyR5hHmeOXuaKRdhbNQAzLPYVe1aNUpoiy9cl8mWkg9SrNHBw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.535.0': - resolution: {integrity: sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==} - engines: {node: '>=14.0.0'} + '@aws-sdk/util-format-url@3.723.0': + resolution: {integrity: sha512-70+xUrdcnencPlCdV9XkRqmgj0vLDb8vm4mcEsgabg5QQ3S80KM0GEuhBAIGMkBWwNQTzCgQy2s7xOUlJPbu+g==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.567.0': - resolution: {integrity: sha512-zQHHj2N3in9duKghH7AuRNrOMLnKhW6lnmb7dznou068DJtDr76w475sHp2TF0XELsOGENbbBsOlN/S5QBFBVQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-locate-window@3.723.0': + resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.686.0': - resolution: {integrity: sha512-+Yc6rO02z+yhFbHmRZGvEw1vmzf/ifS9a4aBjJGeVVU+ZxaUvnk+IUZWrj4YQopUQ+bSujmMUzJLXSkbDq7yuw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-browser@3.723.0': + resolution: {integrity: sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg==} - '@aws-sdk/middleware-location-constraint@3.686.0': - resolution: {integrity: sha512-pCLeZzt5zUGY3NbW4J/5x3kaHyJEji4yqtoQcUlJmkoEInhSxJ0OE8sTxAfyL3nIOF4yr6L2xdaLCqYgQT8Aog==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-node@3.723.0': + resolution: {integrity: sha512-uCtW5sGq8jCwA9w57TvVRIwNnPbSDD1lJaTIgotf7Jit2bTrYR64thgMy/drL5yU5aHOdFIQljqn/5aDXLtTJw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true - '@aws-sdk/middleware-logger@3.535.0': - resolution: {integrity: sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==} - engines: {node: '>=14.0.0'} + '@aws-sdk/xml-builder@3.723.0': + resolution: {integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.568.0': - resolution: {integrity: sha512-BinH72RG7K3DHHC1/tCulocFv+ZlQ9SrPF9zYT0T1OT95JXuHhB7fH8gEABrc6DAtOdJJh2fgxQjPy5tzPtsrA==} - engines: {node: '>=16.0.0'} + '@azure/abort-controller@1.1.0': + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} - '@aws-sdk/middleware-logger@3.686.0': - resolution: {integrity: sha512-cX43ODfA2+SPdX7VRxu6gXk4t4bdVJ9pkktbfnkE5t27OlwNfvSGGhnHrQL8xTOFeyQ+3T+oowf26gf1OI+vIg==} - engines: {node: '>=16.0.0'} + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.535.0': - resolution: {integrity: sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==} - engines: {node: '>=14.0.0'} + '@azure/core-auth@1.9.0': + resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.567.0': - resolution: {integrity: sha512-rFk3QhdT4IL6O/UWHmNdjJiURutBCy+ogGqaNHf/RELxgXH3KmYorLwCe0eFb5hq8f6vr3zl4/iH7YtsUOuo1w==} - engines: {node: '>=16.0.0'} + '@azure/core-http@3.0.5': + resolution: {integrity: sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg==} + engines: {node: '>=18.0.0'} + deprecated: This package is no longer supported. Please refer to https://github.com/Azure/azure-sdk-for-js/blob/490ce4dfc5b98ba290dee3b33a6d0876c5f138e2/sdk/core/README.md - '@aws-sdk/middleware-recursion-detection@3.686.0': - resolution: {integrity: sha512-jF9hQ162xLgp9zZ/3w5RUNhmwVnXDBlABEUX8jCgzaFpaa742qR/KKtjjZQ6jMbQnP+8fOCSXFAVNMU+s6v81w==} - engines: {node: '>=16.0.0'} + '@azure/core-lro@2.7.2': + resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.556.0': - resolution: {integrity: sha512-4W/dnxqj1B6/uS/5Z+3UHaqDDGjNPgEVlqf5d3ToOFZ31ZfpANwhcCmyX39JklC4aolCEi9renQ5wHnTCC8K8g==} - engines: {node: '>=14.0.0'} + '@azure/core-paging@1.6.2': + resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.687.0': - resolution: {integrity: sha512-YGHYqiyRiNNucmvLrfx3QxIkjSDWR/+cc72bn0lPvqFUQBRHZgmYQLxVYrVZSmRzzkH2FQ1HsZcXhOafLbq4vQ==} - engines: {node: '>=16.0.0'} + '@azure/core-tracing@1.0.0-preview.13': + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} - '@aws-sdk/middleware-sdk-sqs@3.552.0': - resolution: {integrity: sha512-s3xy3FJSj5Bpxfk8o48SQ8DCDqZ03V3nlpblrFpCbOfdMFkxkdFkTE3F+bx+uAL+iFfW46lHvsukTb95AZJzZQ==} - engines: {node: '>=14.0.0'} + '@azure/core-util@1.11.0': + resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.686.0': - resolution: {integrity: sha512-zJXml/CpVHFUdlGQqja87vNQ3rPB5SlDbfdwxlj1KBbjnRRwpBtxxmOlWRShg8lnVV6aIMGv95QmpIFy4ayqnQ==} - engines: {node: '>=16.0.0'} + '@azure/logger@1.1.4': + resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.540.0': - resolution: {integrity: sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==} + '@azure/storage-blob@12.18.0': + resolution: {integrity: sha512-BzBZJobMoDyjJsPRMLNHvqHycTGrT8R/dtcTx9qUFcqwSRfGVK9A/cZ7Nx38UQydT9usZGbaDCN75QRNjezSAA==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-user-agent@3.572.0': - resolution: {integrity: sha512-R4bBbLp1ywtF1kJoOX1juDMztKPWeQHNj6XuTvtruFDn1RdfnBlbM3+9rguRfH5s4V+xfl8SSWchnyo2cI00xg==} - engines: {node: '>=16.0.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-user-agent@3.687.0': - resolution: {integrity: sha512-nUgsKiEinyA50CaDXojAkOasAU3Apdg7Qox6IjNUC4ZjgOu7QWsCDB5N28AYMUt06cNYeYQdfMX1aEzG85a1Mg==} - engines: {node: '>=16.0.0'} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + engines: {node: '>=6.9.0'} - '@aws-sdk/node-http-handler@3.374.0': - resolution: {integrity: sha512-v1Z6m0wwkf65/tKuhwrtPRqVoOtNkDTRn2MBMtxCwEw+8V8Q+YRFqVgGN+J1n53ktE0G5OYVBux/NHiAjJHReQ==} - engines: {node: '>=14.0.0'} - deprecated: This package has moved to @smithy/node-http-handler - - '@aws-sdk/protocol-http@3.374.0': - resolution: {integrity: sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==} - engines: {node: '>=14.0.0'} - deprecated: This package has moved to @smithy/protocol-http - - '@aws-sdk/region-config-resolver@3.535.0': - resolution: {integrity: sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/region-config-resolver@3.572.0': - resolution: {integrity: sha512-xkZMIxek44F4YW5r9otD1O5Y/kDkgAb6JNJePkP1qPVojrkCmin3OFYAOZgGm+T4DZAQ5rWhpaqTAWmnRumYfw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.686.0': - resolution: {integrity: sha512-6zXD3bSD8tcsMAVVwO1gO7rI1uy2fCD3czgawuPGPopeLiPpo6/3FoUWCQzk2nvEhj7p9Z4BbjwZGSlRkVrXTw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/s3-request-presigner@3.564.0': - resolution: {integrity: sha512-SLsh0pIYeFqzyG5VBdBM8mtXUsj1ZF2TTA1XABb/gP6WGthePVmDkKklmsmhIyJs91DxwrU6X2HH1d6RFYwQ9A==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.556.0': - resolution: {integrity: sha512-bWDSK0ggK7QzAOmPZGv29UAIZocL1MNY7XyOvm3P3P1U3tFMoIBilQQBLabXyHoZ9J3Ik0Vv4n95htUhRQ35ow==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.687.0': - resolution: {integrity: sha512-vdOQHCRHJPX9mT8BM6xOseazHD6NodvHl9cyF5UjNtLn+gERRJEItIA9hf0hlt62odGD8Fqp+rFRuqdmbNkcNw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/token-providers@3.564.0': - resolution: {integrity: sha512-Kk5ixcl9HjqwzfBJZGQAtsqwKa7Z8P7Mdug837BG8zCJbhf7wwNsmItzXTiAlpVrDZyT8P1yWIxsLOS1YUtmow==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/token-providers@3.572.0': - resolution: {integrity: sha512-IkSu8p32tQZhKqwmfLZLGfYwNhsS/HUQBLnDMHJlr9VifmDqlTurcr+DwMCaMimuFhcLeb45vqTymKf/ro/OBw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': 3.572.0 - - '@aws-sdk/token-providers@3.686.0': - resolution: {integrity: sha512-9oL4kTCSePFmyKPskibeiOXV6qavPZ63/kXM9Wh9V6dTSvBtLeNnMxqGvENGKJcTdIgtoqyqA6ET9u0PJ5IRIg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.686.0 - - '@aws-sdk/types@3.535.0': - resolution: {integrity: sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/types@3.567.0': - resolution: {integrity: sha512-JBznu45cdgQb8+T/Zab7WpBmfEAh77gsk99xuF4biIb2Sw1mdseONdoGDjEJX57a25TzIv/WUJ2oABWumckz1A==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/types@3.686.0': - resolution: {integrity: sha512-xFnrb3wxOoJcW2Xrh63ZgFo5buIu9DF7bOHnwoUxHdNpUXicUh0AHw85TjXxyxIAd0d1psY/DU7QHoNI3OswgQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/url-parser@3.374.0': - resolution: {integrity: sha512-RC3yEj4iqw5vbCmR4IQ3rhmFQilwHtWO1mZ9kRTUxfJCge3TVlrZzj9PRW3hxlYKdu3xZjSvCgX3ip8SFKXtbw==} - deprecated: This package has moved to @smithy/url-parser - - '@aws-sdk/util-arn-parser@3.535.0': - resolution: {integrity: sha512-smVo29nUPAOprp8Z5Y3GHuhiOtw6c8/EtLCm5AVMtRsTPw4V414ZXL2H66tzmb5kEeSzQlbfBSBEdIFZoxO9kg==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/util-arn-parser@3.679.0': - resolution: {integrity: sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.540.0': - resolution: {integrity: sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/util-endpoints@3.572.0': - resolution: {integrity: sha512-AIEC7ItIWBqkJLtqcSd0HG8tvdh3zVwqnKPHNrcfFay0Xonqx3p/qTCDwGosh5CM5hDGzyOSRA5PkacEDBTz9w==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.686.0': - resolution: {integrity: sha512-7msZE2oYl+6QYeeRBjlDgxQUhq/XRky3cXE0FqLFs2muLS7XSuQEXkpOXB3R782ygAP6JX0kmBxPTLurRTikZg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-format-url@3.535.0': - resolution: {integrity: sha512-ElbNkm0bddu53CuW44Iuux1ZbTV50fydbSh/4ypW3LrmUvHx193ogj0HXQ7X26kmmo9rXcsrLdM92yIeTjidVg==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/util-locate-window@3.535.0': - resolution: {integrity: sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/util-user-agent-browser@3.535.0': - resolution: {integrity: sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==} - - '@aws-sdk/util-user-agent-browser@3.567.0': - resolution: {integrity: sha512-cqP0uXtZ7m7hRysf3fRyJwcY1jCgQTpJy7BHB5VpsE7DXlXHD5+Ur5L42CY7UrRPrB6lc6YGFqaAOs5ghMcLyA==} - - '@aws-sdk/util-user-agent-browser@3.686.0': - resolution: {integrity: sha512-YiQXeGYZegF1b7B2GOR61orhgv79qmI0z7+Agm3NXLO6hGfVV3kFUJbXnjtH1BgWo5hbZYW7HQ2omGb3dnb6Lg==} - - '@aws-sdk/util-user-agent-node@3.535.0': - resolution: {integrity: sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-user-agent-node@3.568.0': - resolution: {integrity: sha512-NVoZoLnKF+eXPBvXg+KqixgJkPSrerR6Gqmbjwqbv14Ini+0KNKB0/MXas1mDGvvEgtNkHI/Cb9zlJ3KXpti2A==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-user-agent-node@3.687.0': - resolution: {integrity: sha512-idkP6ojSTZ4ek1pJ8wIN7r9U3KR5dn0IkJn3KQBXQ58LWjkRqLtft2vxzdsktWwhPKjjmIKl1S0kbvqLawf8XQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-utf8-browser@3.259.0': - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - - '@aws-sdk/xml-builder@3.686.0': - resolution: {integrity: sha512-k0z5b5dkYSuOHY0AOZ4iyjcGBeVL9lWsQNF4+c+1oK3OW4fRWl/bNa1soMRMpangsHPzgyn/QkzuDbl7qR4qrw==} - engines: {node: '>=16.0.0'} - - '@azure/abort-controller@1.1.0': - resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} - engines: {node: '>=12.0.0'} - - '@azure/abort-controller@2.1.2': - resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} - engines: {node: '>=18.0.0'} - - '@azure/core-auth@1.9.0': - resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} - engines: {node: '>=18.0.0'} - - '@azure/core-http@3.0.4': - resolution: {integrity: sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==} - engines: {node: '>=14.0.0'} - deprecated: This package is no longer supported. Please migrate to use @azure/core-rest-pipeline - - '@azure/core-lro@2.7.2': - resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} - engines: {node: '>=18.0.0'} - - '@azure/core-paging@1.6.2': - resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} - engines: {node: '>=18.0.0'} - - '@azure/core-tracing@1.0.0-preview.13': - resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} - engines: {node: '>=12.0.0'} - - '@azure/core-util@1.11.0': - resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} - engines: {node: '>=18.0.0'} - - '@azure/logger@1.1.4': - resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} - engines: {node: '>=18.0.0'} - - '@azure/storage-blob@12.18.0': - resolution: {integrity: sha512-BzBZJobMoDyjJsPRMLNHvqHycTGrT8R/dtcTx9qUFcqwSRfGVK9A/cZ7Nx38UQydT9usZGbaDCN75QRNjezSAA==} - engines: {node: '>=14.0.0'} - - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.24.4': - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} - engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} '@babel/generator@7.17.7': resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.4': - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.24.4': - resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.26.3': + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.23.0': - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.0': - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.22.20': - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.4': - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4': - resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2701,24 +2472,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2733,8 +2494,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2781,8 +2542,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.1': - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2793,302 +2554,314 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.24.4': - resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.4': - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.24.1': - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.1': - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.1': - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.1': - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.1': - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.1': - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.1': - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.4': - resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.24.4': - resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3098,37 +2871,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.24.1': - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.1': - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -3145,210 +2915,219 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@datadog/native-appsec@7.1.1': - resolution: {integrity: sha512-1XVrCY4g1ArN79SQANMtiIkaxKSPfgdAGv0VAM4Pz+NQuxKfl+2xQPXjQPm87LI1KQIO6MU6qzv3sUUSesb9lA==} - engines: {node: '>=14'} + '@datadog/libdatadog@0.3.0': + resolution: {integrity: sha512-TbP8+WyXfh285T17FnLeLUOPl4SbkRYMqKgcmknID2mXHNrbt5XJgW9bnDgsrrtu31Q7FjWWw2WolgRLWyzLRA==} - '@datadog/native-iast-rewriter@2.3.1': - resolution: {integrity: sha512-3pmt5G1Ai/+MPyxP7wBerIu/zH/BnAHxEu/EAMr+77IMpK5m7THPDUoWrPRCWcgFBfn0pK5DR7gRItG0wX3e0g==} + '@datadog/native-appsec@8.3.0': + resolution: {integrity: sha512-RYHbSJ/MwJcJaLzaCaZvUyNLUKFbMshayIiv4ckpFpQJDiq1T8t9iM2k7008s75g1vRuXfsRNX7MaLn4aoFuWA==} + engines: {node: '>=16'} + + '@datadog/native-iast-rewriter@2.6.1': + resolution: {integrity: sha512-zv7cr/MzHg560jhAnHcO7f9pLi4qaYrBEcB+Gla0xkVouYSDsp8cGXIGG4fiGdAMHdt7SpDNS6+NcEAqD/v8Ig==} engines: {node: '>= 10'} - '@datadog/native-iast-taint-tracking@2.1.0': - resolution: {integrity: sha512-DjZ6itJcjLrTdKk2vP96hak2xS0ABd0NIB8poZG3OBQU5efkzu8JOQoxbIKMklG/0P2zh7EquvGP88PdVXT9aA==} + '@datadog/native-iast-taint-tracking@3.2.0': + resolution: {integrity: sha512-Mc6FzCoyvU5yXLMsMS9yKnEqJMWoImAukJXolNWCTm+JQYCMf2yMsJ8pBAm7KyZKliamM9rCn7h7Tr2H3lXwjA==} - '@datadog/native-metrics@2.0.0': - resolution: {integrity: sha512-YklGVwUtmKGYqFf1MNZuOHvTYdKuR4+Af1XkWcMD8BwOAjxmd9Z+97328rCOY8TFUJzlGUPaXzB8j2qgG/BMwA==} - engines: {node: '>=12'} + '@datadog/native-metrics@3.1.0': + resolution: {integrity: sha512-yOBi4x0OQRaGNPZ2bx9TGvDIgEdQ8fkudLTFAe7gEM1nAlvFmbE5YfpH8WenEtTSEBwojSau06m2q7axtEEmCg==} + engines: {node: '>=16'} - '@datadog/pprof@5.3.0': - resolution: {integrity: sha512-53z2Q3K92T6Pf4vz4Ezh8kfkVEvLzbnVqacZGgcbkP//q0joFzO8q00Etw1S6NdnCX0XmX08ULaF4rUI5r14mw==} - engines: {node: '>=14'} + '@datadog/pprof@5.4.1': + resolution: {integrity: sha512-IvpL96e/cuh8ugP5O8Czdup7XQOLHeIDgM5pac5W7Lc1YzGe5zTtebKFpitvb1CPw1YY+1qFx0pWGgKP2kOfHg==} + engines: {node: '>=16'} '@datadog/sketches-js@2.1.1': resolution: {integrity: sha512-d5RjycE+MObE/hU+8OM5Zp4VjTwiPLRa8299fj7muOmR16fb942z8byoMbCErnGh0lBevvgkGrLclQDvINbIyg==} - '@discordjs/builders@1.7.0': - resolution: {integrity: sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==} + '@discordjs/builders@1.10.0': + resolution: {integrity: sha512-ikVZsZP+3shmVJ5S1oM+7SveUCK3L9fTyfA8aJ7uD9cNQlTqF+3Irbk2Y22KXTb3C3RNUahRkSInClJMkHrINg==} engines: {node: '>=16.11.0'} '@discordjs/collection@1.5.3': resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} engines: {node: '>=16.11.0'} - '@discordjs/collection@2.0.0': - resolution: {integrity: sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==} + '@discordjs/collection@2.1.1': + resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} engines: {node: '>=18'} - '@discordjs/formatters@0.3.3': - resolution: {integrity: sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==} + '@discordjs/formatters@0.6.0': + resolution: {integrity: sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==} engines: {node: '>=16.11.0'} - '@discordjs/rest@2.2.0': - resolution: {integrity: sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==} - engines: {node: '>=16.11.0'} + '@discordjs/rest@2.4.2': + resolution: {integrity: sha512-9bOvXYLQd5IBg/kKGuEFq3cstVxAMJ6wMxO2U3wjrgO+lHv8oNCT+BBRpuzVQh7BoXKvk/gpajceGvQUiRoJ8g==} + engines: {node: '>=18'} - '@discordjs/util@1.0.2': - resolution: {integrity: sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==} - engines: {node: '>=16.11.0'} + '@discordjs/util@1.1.1': + resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} + engines: {node: '>=18'} - '@discordjs/ws@1.0.2': - resolution: {integrity: sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==} + '@discordjs/ws@1.2.0': + resolution: {integrity: sha512-QH5CAFe3wHDiedbO+EI3OOiyipwWd+Q6BdoFZUw/Wf2fw5Cv2fgU/9UEtJRmJa9RecI+TAhdGPadMaEIur5yJg==} engines: {node: '>=16.11.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@exodus/schemasafe@1.3.0': @@ -3358,16 +3137,16 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@gitbeaker/core@40.2.1': - resolution: {integrity: sha512-4RPpip70/NPo/3fx5TDrF88AwQxqK4OxzsheZnadhFM5O7YBp0lfkIH2c6zeMEwIRn2M5PleNK5mAe3qr00RQg==} + '@gitbeaker/core@40.6.0': + resolution: {integrity: sha512-tVVm8ZPrS9YCHEcuPV8vD1IcEf9POpdygWo+kPvkK7LcC36EERVcXagb8snEaGgGLfUaVQh8qP4iDZgPnP3YBQ==} engines: {node: '>=18.20.0'} - '@gitbeaker/requester-utils@40.2.1': - resolution: {integrity: sha512-GMawAsDEDioDxT4g5hFvzx7bwQq89s8vrf/jffRi35mcWgbtT1yr1m2QzURALsmsNC+H3ktRUCm7f9XtieNDwg==} + '@gitbeaker/requester-utils@40.6.0': + resolution: {integrity: sha512-DQu2l3iXtB+8e1Ye2ekeUHABt4mGMRTLtuVWtFqf74sqJnerHNOxVOjPn19qu/nKdvKR3ZLwSRTtPzEsxgcShg==} engines: {node: '>=18.20.0'} - '@gitbeaker/rest@40.2.1': - resolution: {integrity: sha512-XVaNKa9ahqppSvyNsSayC6TILe4FvBla8zxytCpxZMjrLYLxMt7ny/QCltp9tP8ElDSITALsrKo/wLjab36YEQ==} + '@gitbeaker/rest@40.6.0': + resolution: {integrity: sha512-sAwYJclU3NlB/gdxqhH6Hnmy5LWzvW7D3W33eShQEnxMhM0VjnFHPHcgJLQCIux3hMiub1uGtTw1hBJTxDc2mQ==} engines: {node: '>=18.20.0'} '@google-cloud/common@3.10.0': @@ -3406,8 +3185,8 @@ packages: resolution: {integrity: sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==} engines: {node: '>=14'} - '@grpc/grpc-js@1.11.3': - resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + '@grpc/grpc-js@1.12.5': + resolution: {integrity: sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==} engines: {node: '>=12.10.0'} '@grpc/proto-loader@0.7.13': @@ -3415,8 +3194,8 @@ packages: engines: {node: '>=6'} hasBin: true - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead @@ -3436,6 +3215,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3510,8 +3293,8 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -3525,8 +3308,8 @@ packages: '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -3546,14 +3329,14 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.1.0': - resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.3.0': - resolution: {integrity: sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==} + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -3602,12 +3385,12 @@ packages: resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} - '@octokit/core@6.1.2': - resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} engines: {node: '>= 18'} - '@octokit/endpoint@10.1.1': - resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} engines: {node: '>= 18'} '@octokit/endpoint@6.0.12': @@ -3624,8 +3407,8 @@ packages: resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} engines: {node: '>= 14'} - '@octokit/graphql@8.1.1': - resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} + '@octokit/graphql@8.1.2': + resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} engines: {node: '>= 18'} '@octokit/oauth-authorization-url@4.3.3': @@ -3658,8 +3441,8 @@ packages: resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} engines: {node: '>= 14'} - '@octokit/request-error@6.1.4': - resolution: {integrity: sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==} + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} engines: {node: '>= 18'} '@octokit/request@5.6.3': @@ -3669,12 +3452,12 @@ packages: resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} engines: {node: '>= 14'} - '@octokit/request@9.1.3': - resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} + '@octokit/request@9.1.4': + resolution: {integrity: sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==} engines: {node: '>= 18'} - '@octokit/types@13.5.0': - resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + '@octokit/types@13.6.2': + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} '@octokit/types@6.41.0': resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} @@ -3685,22 +3468,26 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@opensearch-project/opensearch@2.11.0': - resolution: {integrity: sha512-G+SZwtWRDv90IrtTSNnCt0MQjHVyqrcIXcpwN68vjHnfbun2+RHn+ux4K7dnG+s/KwWzVKIpPFoRjg2gfFX0Mw==} + '@opensearch-project/opensearch@2.13.0': + resolution: {integrity: sha512-Bu3jJ7pKzumbMMeefu7/npAWAvFu5W9SlbBow1ulhluqUpqc7QoXe0KidDrMy7Dy3BQrkI6llR3cWL4lQTZOFw==} engines: {node: '>=10', yarn: ^1.22.10} - '@opentelemetry/api@1.6.0': - resolution: {integrity: sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==} + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@1.24.0': - resolution: {integrity: sha512-FP2oN7mVPqcdxJDTTnKExj4mi91EH+DNuArKfHTjPuJWe2K1JfMIVXNfahw1h3onJxQnxS8K0stKkogX05s+Aw==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@1.30.0': + resolution: {integrity: sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.24.0': - resolution: {integrity: sha512-yL0jI6Ltuz8R+Opj7jClGrul6pOoYrdfVmzQS4SITXRPH7I5IRZbrwe/6/v8v4WYMa6MYZG480S1+uc/IGfqsA==} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} '@pkgjs/parseargs@0.11.0': @@ -3753,19 +3540,23 @@ packages: '@readme/json-schema-ref-parser@1.2.0': resolution: {integrity: sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==} - '@readme/openapi-parser@2.5.1': - resolution: {integrity: sha512-p9ndWhwjtP+DEiOOF6jeNMpdmYIPM4nl+JEIdnQNdq7b68esI024x7HiYACZpaYaSvISDSyKc7aiRJx4K4IDhg==} + '@readme/openapi-parser@2.6.0': + resolution: {integrity: sha512-pyFJXezWj9WI1O+gdp95CoxfY+i+Uq3kKk4zXIFuRAZi9YnHpHOpjumWWr67wkmRTw19Hskh9spyY0Iyikf3fA==} engines: {node: '>=18'} peerDependencies: openapi-types: '>=7' + '@readme/openapi-schemas@3.1.0': + resolution: {integrity: sha512-9FC/6ho8uFa8fV50+FPy/ngWN53jaUu4GRXlAjcxIRrzhltJnpKkBG2Tp0IDraFJeWrOpk84RJ9EMEEYzaI1Bw==} + engines: {node: '>=18'} + '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: '@redis/client': ^1.0.0 - '@redis/client@1.5.14': - resolution: {integrity: sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==} + '@redis/client@1.6.0': + resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} engines: {node: '>=14'} '@redis/graph@1.1.1': @@ -3773,31 +3564,34 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@redis/json@1.0.6': - resolution: {integrity: sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==} + '@redis/json@1.0.7': + resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} peerDependencies: '@redis/client': ^1.0.0 - '@redis/search@1.1.6': - resolution: {integrity: sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==} + '@redis/search@1.2.0': + resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} peerDependencies: '@redis/client': ^1.0.0 - '@redis/time-series@1.0.5': - resolution: {integrity: sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==} + '@redis/time-series@1.1.0': + resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} peerDependencies: '@redis/client': ^1.0.0 - '@sapphire/async-queue@1.5.2': - resolution: {integrity: sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sapphire/async-queue@1.5.5': + resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/shapeshift@3.9.7': - resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} + '@sapphire/shapeshift@4.0.0': + resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==} engines: {node: '>=v16'} - '@sapphire/snowflake@3.5.1': - resolution: {integrity: sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==} + '@sapphire/snowflake@3.5.3': + resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} '@segment/loosely-validate-event@2.0.0': @@ -3813,8 +3607,8 @@ packages: resolution: {integrity: sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==} engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/client@8.1.3': - resolution: {integrity: sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==} + '@sendgrid/client@8.1.4': + resolution: {integrity: sha512-VxZoQ82MpxmjSXLR3ZAE2OWxvQIW2k2G24UeRPr/SYX8HqWLV/8UBN15T2WmjjnEb5XSmFImTJOKDzzSeKr9YQ==} engines: {node: '>=12.*'} '@sendgrid/eventwebhook@7.7.0': @@ -3837,8 +3631,8 @@ packages: resolution: {integrity: sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==} engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/mail@8.1.3': - resolution: {integrity: sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==} + '@sendgrid/mail@8.1.4': + resolution: {integrity: sha512-MUpIZykD9ARie8LElYCqbcBhGGMaA/E6I7fEcG7Hc2An26QJyLtwOaKQ3taGp8xO8BICPJrSKuYV4bDeAJKFGQ==} engines: {node: '>=12.*'} '@sinclair/typebox@0.27.8': @@ -3858,124 +3652,85 @@ packages: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - '@slack/types@2.11.0': - resolution: {integrity: sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==} + '@slack/types@2.14.0': + resolution: {integrity: sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - '@slack/web-api@6.12.0': - resolution: {integrity: sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ==} + '@slack/web-api@6.13.0': + resolution: {integrity: sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} '@smithy/abort-controller@1.1.0': resolution: {integrity: sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ==} engines: {node: '>=14.0.0'} - '@smithy/abort-controller@2.2.0': - resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} - engines: {node: '>=14.0.0'} - - '@smithy/abort-controller@3.1.6': - resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} - engines: {node: '>=16.0.0'} - - '@smithy/chunked-blob-reader-native@3.0.1': - resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} - - '@smithy/chunked-blob-reader@4.0.0': - resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} - - '@smithy/config-resolver@2.2.0': - resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==} - engines: {node: '>=14.0.0'} - - '@smithy/config-resolver@3.0.10': - resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==} - engines: {node: '>=16.0.0'} - - '@smithy/core@1.4.2': - resolution: {integrity: sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==} - engines: {node: '>=14.0.0'} - - '@smithy/core@2.5.1': - resolution: {integrity: sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==} - engines: {node: '>=16.0.0'} - - '@smithy/credential-provider-imds@2.3.0': - resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} - engines: {node: '>=14.0.0'} - - '@smithy/credential-provider-imds@3.2.5': - resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} - engines: {node: '>=16.0.0'} - - '@smithy/eventstream-codec@2.2.0': - resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} + '@smithy/abort-controller@4.0.0': + resolution: {integrity: sha512-xFNL1ZfluscKiVI0qlPEnu7pL1UgNNIzQdjTPkaO7JCJtIkbArPYNtqbxohuNaQdksJ01Tn1wLbDA5oIp62P8w==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@3.1.7': - resolution: {integrity: sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==} + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@2.2.0': - resolution: {integrity: sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==} - engines: {node: '>=14.0.0'} + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@3.0.11': - resolution: {integrity: sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==} - engines: {node: '>=16.0.0'} + '@smithy/config-resolver@4.0.0': + resolution: {integrity: sha512-29pIDlUY/a9+ChJPAarPiD9cU8fBtBh0wFnmnhj7j5AhgMzc+uyXdfzmziH6xx2jzw54waSP3HfnFkTANZuPYA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@2.2.0': - resolution: {integrity: sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==} - engines: {node: '>=14.0.0'} + '@smithy/core@3.0.0': + resolution: {integrity: sha512-pKaas7RWvPljJ8uByCeBa10rtbVJCy4N/Fr7OSPxFezcyG0SQuXWnESZqzXj7m2+A+kPzG6fKyP4wrKidl2Ikg==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.8': - resolution: {integrity: sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==} - engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@4.0.0': + resolution: {integrity: sha512-+hTShyZHiq2AVFOxJja3k6O17DKU6TaZbwr2y1OH5HQtUw2a+7O3mMR+10LVmc39ef72SAj+uFX0IW9rJGaLQQ==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@2.2.0': - resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-codec@4.0.0': + resolution: {integrity: sha512-YvKUUOo3qehqOxNrkax3YKXF1v0ff475FhDgbBmF8Bo0oOOpsXZyltjQnwBzIeTYo446ZPV85KM3kY4YoxUNOg==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@3.0.10': - resolution: {integrity: sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-browser@4.0.0': + resolution: {integrity: sha512-YRwsVPJU/DN1VshH8tKs4CxY66HLhmDSw6oZDM2LVIgHODsqpJBcRdEfcnb97ULmgyFrWxTjL9UXpyKPuJXQRA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@2.2.0': - resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-serde-config-resolver@4.0.0': + resolution: {integrity: sha512-OZ/aK9LHsZch0VZ6bnf+dPD80kJripnZnkc36QNymnej49VkHJLSNJxsM0pwt53FA6+fUYYMMT0DVDTH1Msq2g==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@3.0.10': - resolution: {integrity: sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-node@4.0.0': + resolution: {integrity: sha512-10b4F+zXbzxZHKuP+m2st/C+rEGK7FUut1dNSRw6DQCCfaTUecJGCoHPCmk2CRvuMTzunVpS1BKLMk839318VQ==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@2.5.0': - resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} + '@smithy/eventstream-serde-universal@4.0.0': + resolution: {integrity: sha512-HEhZpf731J3oFYJtaKO3dnV6stIjA+lJwXuXGu/WbSgicDWGAOITUwTt9ynldEFsnFkNu9b/C4ebXnJA16xSCA==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@4.0.0': - resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==} + '@smithy/fetch-http-handler@5.0.0': + resolution: {integrity: sha512-jUEq+4056uqsDLRqQb1fm48rrSMBYcBxVvODfiP37ORcV5n9xWJQsINWcIffyYxWTM5K0Y/GOfhSQGDtWpAPpQ==} + engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@3.1.7': - resolution: {integrity: sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==} + '@smithy/hash-blob-browser@4.0.0': + resolution: {integrity: sha512-JBXNC2YCDlm9uqP/eQJbK6auahAaq4HndJC2PURxWPRUDjbXDRJS5Npfi+7zSxKOSOWxXCG/3dLE5D8znI9l/w==} + engines: {node: '>=18.0.0'} '@smithy/hash-node@1.1.0': resolution: {integrity: sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==} engines: {node: '>=14.0.0'} - '@smithy/hash-node@2.2.0': - resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==} - engines: {node: '>=14.0.0'} - - '@smithy/hash-node@3.0.8': - resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==} - engines: {node: '>=16.0.0'} - - '@smithy/hash-stream-node@3.1.7': - resolution: {integrity: sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==} - engines: {node: '>=16.0.0'} + '@smithy/hash-node@4.0.0': + resolution: {integrity: sha512-25OxGYGnG3JPEOTk4iFE03bfmoC6GXUQ4L13z4cNdsS3mkncH22AGSDRfKwwEqutNUxXQZWVy9f72Fm59C9qlg==} + engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@2.2.0': - resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==} + '@smithy/hash-stream-node@4.0.0': + resolution: {integrity: sha512-MRgYnr9atik1c02mdgjjJkNK5A8IvRRlpa/zOdA8PxmQtBCwjODKzobyI166uamxrL20wg7vuKoVSAjQU4IXfw==} + engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@3.0.8': - resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==} + '@smithy/invalid-dependency@4.0.0': + resolution: {integrity: sha512-0GTyet02HX/sPctEhOExY+3HI7hwkVwOoJg0XnItTJ+Xw7JMuL9FOxALTmKVIV6+wg0kF6veLeg72hVSbD9UCw==} + engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@1.1.0': resolution: {integrity: sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==} @@ -3985,194 +3740,116 @@ packages: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@3.0.0': - resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} - engines: {node: '>=16.0.0'} - - '@smithy/md5-js@2.2.0': - resolution: {integrity: sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==} - - '@smithy/md5-js@3.0.8': - resolution: {integrity: sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==} - - '@smithy/middleware-content-length@2.2.0': - resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==} - engines: {node: '>=14.0.0'} - - '@smithy/middleware-content-length@3.0.10': - resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-endpoint@2.5.1': - resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} - engines: {node: '>=14.0.0'} - - '@smithy/middleware-endpoint@3.2.1': - resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-retry@2.3.1': - resolution: {integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==} - engines: {node: '>=14.0.0'} + '@smithy/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@3.0.25': - resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==} - engines: {node: '>=16.0.0'} + '@smithy/md5-js@4.0.0': + resolution: {integrity: sha512-NUjbK+M1RNd0J/mM3eh4Yw5SfUrJBsIAea/H5dvc8tirxWFHFDUHJ/CK40/vtY3niiYnygWjZZ+ISydray6Raw==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@2.3.0': - resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-content-length@4.0.0': + resolution: {integrity: sha512-nM1RJqLwkSCidumGK8WwNEZ0a0D/4LkwqdPna+QmHrdPoAK6WGLyZFosdMpsAW1OIbDLWGa+r37Mo4Vth4S4kQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@3.0.8': - resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@4.0.0': + resolution: {integrity: sha512-/f6z5SqUurmqemhBZNhM0c+C7QW0AY/zJpic//sbdu26q98HSPAI/xvzStjYq+UhtWeAe/jaX6gamdL/2r3W1g==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@2.2.0': - resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-retry@4.0.0': + resolution: {integrity: sha512-K6tsFp3Ik44H3694a+LWoXLV8mqy8zn6/vTw2feU72MaIzi51EHMVNNxxpL6e2GI6oxw8FFRGWgGn8+wQRrHZQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@3.0.8': - resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.0.0': + resolution: {integrity: sha512-aW4Zo8Cm988RCvhysErzqrQ4YPKgZFhajvgPoZnsWIDaZfT419J17Ahr13Lul3kqGad2dCz7YOrXd7r+UAEj/w==} + engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@2.3.0': - resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-stack@4.0.0': + resolution: {integrity: sha512-4NFaX88RmgVrCyJv/3RsSdqMwxzI/EQa8nvhUDVxmLUMRS2JUdHnliD6IwKuqIwIzz+E1aZK3EhSHUM4HXp3ww==} + engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@3.1.9': - resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} - engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.0.0': + resolution: {integrity: sha512-Crp9rg1ewjqgM2i7pWSpNhfbBa0usyKGDVQLEXTOpu6trFqq3BFLLCgbCE1S18h6mxqKnOqUONq3nWOxUk75XA==} + engines: {node: '>=18.0.0'} '@smithy/node-http-handler@1.1.0': resolution: {integrity: sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg==} engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@2.5.0': - resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} - engines: {node: '>=14.0.0'} - - '@smithy/node-http-handler@3.2.5': - resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==} - engines: {node: '>=16.0.0'} - - '@smithy/property-provider@2.2.0': - resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} - engines: {node: '>=14.0.0'} + '@smithy/node-http-handler@4.0.0': + resolution: {integrity: sha512-WvumtEaFyxaI95zmj6eYlF/vCFCKNyru3P/UUHCUS9BjvajUtNckH2cY3bBfi+qqMPX5gha4g26lcOlE/wPz/Q==} + engines: {node: '>=18.0.0'} - '@smithy/property-provider@3.1.8': - resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} - engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.0.0': + resolution: {integrity: sha512-AJSvY1k3SdM0stGrIjL8/FIjXO7X9I7KkznXDmr76RGz+yvaDHLsLm2hSHyzAlmwEQnHaafSU2dwaV0JcnR/4w==} + engines: {node: '>=18.0.0'} '@smithy/protocol-http@1.2.0': resolution: {integrity: sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==} engines: {node: '>=14.0.0'} - '@smithy/protocol-http@3.3.0': - resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} - engines: {node: '>=14.0.0'} - - '@smithy/protocol-http@4.1.5': - resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} - engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.0.0': + resolution: {integrity: sha512-laAcIHWq9GQ5VdAS71DUrCj5HUHZ/89Ee+HRTLhFR5/E3toBlnZfPG+kqBajwfEB5aSdRuKslfzl5Dzrn3pr8A==} + engines: {node: '>=18.0.0'} '@smithy/querystring-builder@1.1.0': resolution: {integrity: sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==} engines: {node: '>=14.0.0'} - '@smithy/querystring-builder@2.2.0': - resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} - engines: {node: '>=14.0.0'} - - '@smithy/querystring-builder@3.0.8': - resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.0.0': + resolution: {integrity: sha512-kMqPDRf+/hwm+Dmk8AQCaYTJxNWWpNdJJteeMm0jwDbmRDqSqHQ7oLEVzvOnbWJu1poVtOhv6v7jsbyx9JASsw==} + engines: {node: '>=18.0.0'} '@smithy/querystring-parser@1.1.0': resolution: {integrity: sha512-Lm/FZu2qW3XX+kZ4WPwr+7aAeHf1Lm84UjNkKyBu16XbmEV7ukfhXni2aIwS2rcVf8Yv5E7wchGGpOFldj9V4Q==} engines: {node: '>=14.0.0'} - '@smithy/querystring-parser@2.2.0': - resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} - engines: {node: '>=14.0.0'} - - '@smithy/querystring-parser@3.0.8': - resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} - engines: {node: '>=16.0.0'} - - '@smithy/service-error-classification@2.1.5': - resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} - engines: {node: '>=14.0.0'} - - '@smithy/service-error-classification@3.0.8': - resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} - engines: {node: '>=16.0.0'} - - '@smithy/shared-ini-file-loader@2.4.0': - resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} - engines: {node: '>=14.0.0'} - - '@smithy/shared-ini-file-loader@3.1.9': - resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.0.0': + resolution: {integrity: sha512-SbogL1PNEmm28ya0eK2S0EZEbYwe0qpaqSGrODm+uYS6dQ7pekPLVNXjBRuuLIAT26ZF2wTsp6X7AVRBNZd8qw==} + engines: {node: '>=18.0.0'} - '@smithy/signature-v4@2.3.0': - resolution: {integrity: sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==} - engines: {node: '>=14.0.0'} + '@smithy/service-error-classification@4.0.0': + resolution: {integrity: sha512-hIZreT6aXSG0PK/psT1S+kfeGTnYnRRlf7rU3yDmH/crSVjTbS/5h5w2J7eO2ODrQb3xfhJcYxQBREdwsZk6TA==} + engines: {node: '>=18.0.0'} - '@smithy/signature-v4@4.2.1': - resolution: {integrity: sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==} - engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@4.0.0': + resolution: {integrity: sha512-Ktupe8msp2GPaKKVfiz3NNUNnslJiGGRoVh3BDpm/RChkQ5INQpqmTc2taE0XChNYumNynLfb3keekIPaiaZeg==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@2.5.1': - resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==} - engines: {node: '>=14.0.0'} + '@smithy/signature-v4@5.0.0': + resolution: {integrity: sha512-zqcOR1sZTuoA6K3PBNwzu4YgT1pmIwz47tYpgaJjBTfGUIMtcjUaXKtuSKEScdv+0wx45/PbXz0//hk80fky3w==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@3.4.2': - resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==} - engines: {node: '>=16.0.0'} + '@smithy/smithy-client@4.0.0': + resolution: {integrity: sha512-AgcZ6B+JuqArYioAbaYrCpTCjYsD3/1hPSXntbN2ipsfc4hE+72RFZevUPYgsKxpy3G+QxuLfqm11i3+oX4oSA==} + engines: {node: '>=18.0.0'} '@smithy/types@1.2.0': resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==} engines: {node: '>=14.0.0'} - '@smithy/types@2.12.0': - resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} - engines: {node: '>=14.0.0'} - - '@smithy/types@3.6.0': - resolution: {integrity: sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==} - engines: {node: '>=16.0.0'} + '@smithy/types@4.0.0': + resolution: {integrity: sha512-aNwIGSOgDOhtTRY/rrn2aeuQeKw/IFrQ998yK5l6Ah853WeWIEmFPs/EO4OpfADEdcK+igWnZytm/oUgkLgUYg==} + engines: {node: '>=18.0.0'} '@smithy/url-parser@1.1.0': resolution: {integrity: sha512-tpvi761kzboiLNGEWczuybMPCJh6WHB3cz9gWAG95mSyaKXmmX8ZcMxoV+irZfxDqLwZVJ22XTumu32S7Ow8aQ==} - '@smithy/url-parser@2.2.0': - resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} - - '@smithy/url-parser@3.0.8': - resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} - - '@smithy/util-base64@2.3.0': - resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} - engines: {node: '>=14.0.0'} - - '@smithy/util-base64@3.0.0': - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} - - '@smithy/util-body-length-browser@2.2.0': - resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==} + '@smithy/url-parser@4.0.0': + resolution: {integrity: sha512-2iPpuLoH0hCKpLtqVgilHtpPKsmHihbkwBm3h3RPuEctdmuiOlFRZ2ZI8IHSwl0o4ff5IdyyJ0yu/2tS9KpUug==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@3.0.0': - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@2.3.0': - resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==} - engines: {node: '>=14.0.0'} + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@3.0.0': - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@1.1.0': resolution: {integrity: sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==} @@ -4182,85 +3859,49 @@ packages: resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@3.0.0': - resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} - engines: {node: '>=16.0.0'} - - '@smithy/util-config-provider@2.3.0': - resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==} - engines: {node: '>=14.0.0'} - - '@smithy/util-config-provider@3.0.0': - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} - - '@smithy/util-defaults-mode-browser@2.2.1': - resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-defaults-mode-browser@3.0.25': - resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-defaults-mode-node@2.3.1': - resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-defaults-mode-node@3.0.25': - resolution: {integrity: sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-endpoints@1.2.0': - resolution: {integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==} - engines: {node: '>= 14.0.0'} - - '@smithy/util-endpoints@2.1.4': - resolution: {integrity: sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@2.2.0': - resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==} - engines: {node: '>=14.0.0'} + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@3.0.0': - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-defaults-mode-browser@4.0.0': + resolution: {integrity: sha512-7wqsXkzaJkpSqV+Ca95pN9yQutXvhaKeCxGGmjWnRGXY1fW/yR7wr1ouNnUYCJuTS8MvmB61xp5Qdj8YMgIA2Q==} + engines: {node: '>=18.0.0'} - '@smithy/util-middleware@2.2.0': - resolution: {integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==} - engines: {node: '>=14.0.0'} + '@smithy/util-defaults-mode-node@4.0.0': + resolution: {integrity: sha512-P8VK885kiRT6TEtvcQvz+L/+xIhrDhCmM664ToUtrshFSBhwGYaJWlQNAH9fXlMhwnNvR+tmh1KngKJIgQP6bw==} + engines: {node: '>=18.0.0'} - '@smithy/util-middleware@3.0.8': - resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==} - engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@3.0.0': + resolution: {integrity: sha512-kyOKbkg77lsIVN2jC08uEWm3s16eK1YdVDyi/nKeBDbUnjR30dmTEga79E5tiu5OEgTAdngNswA9V+L6xa65sA==} + engines: {node: '>=18.0.0'} - '@smithy/util-retry@2.2.0': - resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} - engines: {node: '>= 14.0.0'} + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} - '@smithy/util-retry@3.0.8': - resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} - engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.0.0': + resolution: {integrity: sha512-ncuvK6ekpDqtASHg7jx3d3nrkD2BsTzUmeVgvtepuHGxtySY8qUlb4SiNRdxHYcv3pL2SwdXs70RwKBU0edW5w==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@2.2.0': - resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} - engines: {node: '>=14.0.0'} + '@smithy/util-retry@4.0.0': + resolution: {integrity: sha512-64WFoC19NVuHh3HQO2QbGw+n6GzQ6VH/drxwXLOU3GDLKxUUzIR9XNm9aTVqh8/7R+y+DgITiv5LpX5XdOy73A==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@3.2.1': - resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==} - engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.0.0': + resolution: {integrity: sha512-ctcLq8Ogi2FQuGy2RxJXGGrozhFEb4p9FawB5SpTNAkNQWbNHcwrGcVSVI3FtdQtkNAINLiEdMnrx+UN/mafvw==} + engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@1.1.0': resolution: {integrity: sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==} engines: {node: '>=14.0.0'} - '@smithy/util-uri-escape@2.2.0': - resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-uri-escape@3.0.0': - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} '@smithy/util-utf8@1.1.0': resolution: {integrity: sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==} @@ -4270,13 +3911,13 @@ packages: resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@3.0.0': - resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} - engines: {node: '>=16.0.0'} + '@smithy/util-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} - '@smithy/util-waiter@3.1.7': - resolution: {integrity: sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-waiter@4.0.0': + resolution: {integrity: sha512-C8dSfGmZH0ecrmnJOw4aDXJ47krihnUtee8eDZ2fA+28wTjD4TVM3L/bBQYnBBlDVWcYzldLV7loPRsPc1kERg==} + engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -4293,71 +3934,71 @@ packages: '@superfaceai/passport-twitter-oauth2@1.2.4': resolution: {integrity: sha512-f2P4X1HqBHJuAnQefINpgJvMGLHx+nT9APbfJzN/CCBcazvP9NOD9IiENHMZMXEgfcHU40V3KwKiIZTBH5Q4Wg==} - '@swc/core-darwin-arm64@1.4.17': - resolution: {integrity: sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw==} + '@swc/core-darwin-arm64@1.10.4': + resolution: {integrity: sha512-sV/eurLhkjn/197y48bxKP19oqcLydSel42Qsy2zepBltqUx+/zZ8+/IS0Bi7kaWVFxerbW1IPB09uq8Zuvm3g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.4.17': - resolution: {integrity: sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA==} + '@swc/core-darwin-x64@1.10.4': + resolution: {integrity: sha512-gjYNU6vrAUO4+FuovEo9ofnVosTFXkF0VDuo1MKPItz6e2pxc2ale4FGzLw0Nf7JB1sX4a8h06CN16/pLJ8Q2w==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.4.17': - resolution: {integrity: sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q==} + '@swc/core-linux-arm-gnueabihf@1.10.4': + resolution: {integrity: sha512-zd7fXH5w8s+Sfvn2oO464KDWl+ZX1MJiVmE4Pdk46N3PEaNwE0koTfgx2vQRqRG4vBBobzVvzICC3618WcefOA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.4.17': - resolution: {integrity: sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q==} + '@swc/core-linux-arm64-gnu@1.10.4': + resolution: {integrity: sha512-+UGfoHDxsMZgFD3tABKLeEZHqLNOkxStu+qCG7atGBhS4Slri6h6zijVvf4yI5X3kbXdvc44XV/hrP/Klnui2A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.4.17': - resolution: {integrity: sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw==} + '@swc/core-linux-arm64-musl@1.10.4': + resolution: {integrity: sha512-cDDj2/uYsOH0pgAnDkovLZvKJpFmBMyXkxEG6Q4yw99HbzO6QzZ5HDGWGWVq/6dLgYKlnnmpjZCPPQIu01mXEg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.4.17': - resolution: {integrity: sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA==} + '@swc/core-linux-x64-gnu@1.10.4': + resolution: {integrity: sha512-qJXh9D6Kf5xSdGWPINpLGixAbB5JX8JcbEJpRamhlDBoOcQC79dYfOMEIxWPhTS1DGLyFakAx2FX/b2VmQmj0g==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.4.17': - resolution: {integrity: sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw==} + '@swc/core-linux-x64-musl@1.10.4': + resolution: {integrity: sha512-A76lIAeyQnHCVt0RL/pG+0er8Qk9+acGJqSZOZm67Ve3B0oqMd871kPtaHBM0BW3OZAhoILgfHW3Op9Q3mx3Cw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.4.17': - resolution: {integrity: sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w==} + '@swc/core-win32-arm64-msvc@1.10.4': + resolution: {integrity: sha512-e6j5kBu4fIY7fFxFxnZI0MlEovRvp50Lg59Fw+DVbtqHk3C85dckcy5xKP+UoXeuEmFceauQDczUcGs19SRGSQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.4.17': - resolution: {integrity: sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g==} + '@swc/core-win32-ia32-msvc@1.10.4': + resolution: {integrity: sha512-RSYHfdKgNXV/amY5Tqk1EWVsyQnhlsM//jeqMLw5Fy9rfxP592W9UTumNikNRPdjI8wKKzNMXDb1U29tQjN0dg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.4.17': - resolution: {integrity: sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg==} + '@swc/core-win32-x64-msvc@1.10.4': + resolution: {integrity: sha512-1ujYpaqfqNPYdwKBlvJnOqcl+Syn3UrQ4XE0Txz6zMYgyh6cdU6a3pxqLqIUSJ12MtXRA9ZUhEz1ekU3LfLWXw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.4.17': - resolution: {integrity: sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ==} + '@swc/core@1.10.4': + resolution: {integrity: sha512-ut3zfiTLORMxhr6y/GBxkHmzcGuVpwJYX4qyXWuBKkpw/0g0S5iO1/wW7RnLnZbAi8wS/n0atRZoaZlXWBkeJg==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': ^0.5.0 + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true @@ -4365,8 +4006,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.6': - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} @@ -4375,27 +4016,27 @@ packages: '@techteamer/ocsp@1.0.1': resolution: {integrity: sha512-q4pW5wAC6Pc3JI8UePwE37CkLQ5gDGZMgjSX4MEEm4D4Di59auDQ8UNIDzC4gRnPNmmcwjpPxozq8p5pjiOmOw==} - '@temporalio/activity@1.11.1': - resolution: {integrity: sha512-3nfkYBvWzHeAd/0a7M4GdfrUcDs6dA6L5bvGRJQYxNZ0h1X7Shd/FXQ5Yvfqz2LAa4NKlgZ4qcjfnUiulJkVyA==} + '@temporalio/activity@1.11.5': + resolution: {integrity: sha512-IHvaADrKhxYyhuybnMt5JX3rxK94DstENwO2jq5qjsS2p5jr1qjU72pRDUSXAha1endqgsyjqIyxqrEOsqzuyg==} - '@temporalio/client@1.11.1': - resolution: {integrity: sha512-1cEh6y7gB1bV/dZbSLL8TsEWM9/glj4j46V8sOS1B3ykoK2+5KaBvkUBKeS/SVH8puqo1zaWbaYEWD8kajg6/g==} + '@temporalio/client@1.11.5': + resolution: {integrity: sha512-Q8hFqxyf41MQmCeyxcGpbiMyuxhilvG8FScFwSbFs8ZZPZykNcpr5o+TOowLWzGWAL5f2bIKETh/eXDZpZvY7g==} - '@temporalio/common@1.11.1': - resolution: {integrity: sha512-8fQwmYHMakSbqMX26FNfiLwBwVwsMNbGmVfGaFOqy72QZuUiXxgmImXQhK6ir1ieeH8bLyY5laAosB4W6VPBAA==} + '@temporalio/common@1.11.5': + resolution: {integrity: sha512-6cgGTAT+jSKKwCPOoUDIseJuDroP7cEIAX/pYpNBRGvfj+lpU8GitSVsPEZTVoMQ400otzBa1n80aH8bnOLVTw==} - '@temporalio/core-bridge@1.11.1': - resolution: {integrity: sha512-zgBHPdzQqOHyetVR12k4L1vrGlrwFFsMZ1iNaSJoaf8M4C5whYlzv13nUvXThZkaN06/xQCop6L02XkmhxkzYA==} + '@temporalio/core-bridge@1.11.5': + resolution: {integrity: sha512-1IzxtPrndR99golP1yZnvsOHU9QP5o9KdNtM/W5VxChFc0ihmeZpisptgfYyqa9VaO/Bs9wEoSmH6fCSB9knTQ==} - '@temporalio/proto@1.11.1': - resolution: {integrity: sha512-qTNSsU88IOJbv6lhWyW0qAHAYg4euEW/NNPgAp5ohfPkqaw+/j51QABO9E6m/KQwMZ6x43z2JjQRS37aC6Psiw==} + '@temporalio/proto@1.11.5': + resolution: {integrity: sha512-LjRGQdLRpRxDp2NSyNyhCp7JLaUlMY2T+hAeGfueR5cOVZxHXTO8TXnnjimi0UM1knyA6sW3yNJCNieKlCcASg==} - '@temporalio/worker@1.11.1': - resolution: {integrity: sha512-PiYbPLUH0UIakVtcZzJ4064Z3bOYrk+pOL8w8YxBlE85IQKQG6tVm9yrqd/XpC9lk0JOJhdw6KLcm64kDRrryw==} + '@temporalio/worker@1.11.5': + resolution: {integrity: sha512-WeIK/2ZQMCFVz89FeSa081kMDeHbyL0yZf335Rn0my2l0TcWWoHjVI9kQGuEAuP6fke/sCCQxpcxJ8EvEMHX8w==} engines: {node: '>= 16.0.0'} - '@temporalio/workflow@1.11.1': - resolution: {integrity: sha512-aTfoHPc6O/7UioOSe+PHmpzLZveG2qn0VI/snlclPFs8VO8r5hcbXb5jYeuzCi26mm7Z+Dxmf2hCK77tJlPeKg==} + '@temporalio/workflow@1.11.5': + resolution: {integrity: sha512-U0kGoQ6bttEiT59km+cpeSxVr2Bq8ZHmlurP2N+9nQdxa10RsMqrp5YQrJQfg7KrfrYbeY1HyJBQ7Ljy1FrOtQ==} '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -4431,8 +4072,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -4449,8 +4090,8 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/config@3.3.4': - resolution: {integrity: sha512-qFiTLnWy+TdPSMIXFHP+87lFXFRM4SXjRS+CSB66+56TrpLNw003y1sh7DGaaC1NGesxgKoT5FDy6dyA1Xju/g==} + '@types/config@3.3.5': + resolution: {integrity: sha512-itq2HtXQBrNUKwMNZnb9mBRE3T99VYCdl1gjST9rq+9kFaB1iMMGuDeZnP88qid73DnpAMKH9ZolqDpS1Lz7+w==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -4464,8 +4105,8 @@ packages: '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - '@types/cron@2.4.0': - resolution: {integrity: sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==} + '@types/cron@2.4.3': + resolution: {integrity: sha512-ViRBkoZD9Rk0hGeMdd2GHGaOaZuH9mDmwsE5/Zo53Ftwcvh7h9VJc8lIt2wdgEwS4EW5lbtTX6vlE0idCLPOyA==} deprecated: This is a stub types definition. cron provides its own type definitions, so you do not need this installed. '@types/debug@4.1.12': @@ -4474,14 +4115,14 @@ packages: '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -4510,8 +4151,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -4519,8 +4160,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.6': - resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@types/jsonwebtoken@9.0.7': + resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -4543,23 +4184,23 @@ packages: '@types/node@18.0.6': resolution: {integrity: sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==} - '@types/node@18.19.31': - resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + '@types/node@18.19.70': + resolution: {integrity: sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ==} - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.17.12': + resolution: {integrity: sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==} - '@types/oauth@0.9.4': - resolution: {integrity: sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==} + '@types/oauth@0.9.6': + resolution: {integrity: sha512-H9TRCVKBNOhZZmyHLqFt9drPM9l+ShWiqqJijU1B8P3DX3ub84NjxDuy+Hjrz+fEca5Kwip3qPMKNyiLgNJtIA==} - '@types/passport-oauth2@1.4.15': - resolution: {integrity: sha512-9cUTP/HStNSZmhxXGuRrBJfEWzIEJRub2eyJu3CvkA+8HAMc9W3aKdFhVq+Qz1hi42qn+GvSAnz3zwacDSYWpw==} + '@types/passport-oauth2@1.4.17': + resolution: {integrity: sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg==} - '@types/passport@1.0.16': - resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + '@types/passport@1.0.17': + resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -4573,8 +4214,8 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/sanitize-html@2.11.0': - resolution: {integrity: sha512-7oxPGNQHXLHE48r/r/qjn7q0hlrs3kL7oZnGj0Wf/h9tj/6ibFyRkNbsDxaBBZ4XUZ0Dx5LGCyDJ04ytSofacQ==} + '@types/sanitize-html@2.13.0': + resolution: {integrity: sha512-X31WxbvW9TjIhZZNyNBZ/p5ax4ti7qsNDBDEnH4zAgmEh35YnFD1UiS6z9Cd34kKm0LslFW0KPmTQzu/oGtsqQ==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -4603,17 +4244,17 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.11.9': - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + '@types/validator@13.12.2': + resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} - '@types/ws@8.5.9': - resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} + '@types/ws@8.5.13': + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@typescript-eslint/eslint-plugin@5.62.0': resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} @@ -4731,61 +4372,61 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - '@vercel/ncc@0.38.1': - resolution: {integrity: sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==} + '@vercel/ncc@0.38.3': + resolution: {integrity: sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==} hasBin: true - '@vladfrangu/async_event_emitter@2.2.4': - resolution: {integrity: sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==} + '@vladfrangu/async_event_emitter@2.4.6': + resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -4808,11 +4449,6 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -4823,12 +4459,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -4836,8 +4472,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} ajv-draft-04@1.0.0: @@ -4861,11 +4497,16 @@ packages: peerDependencies: ajv: ^6.9.1 + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} analytics-node@6.2.0: resolution: {integrity: sha512-NLU4tCHlWt0tzEaFQL7NIoWhq2KmQSmz0JvyS2lYn6fc4fEjTMSabhJUx8H1r5995FX8fE3rZ15uIHU6u+ovlQ==} @@ -4894,8 +4535,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -4954,8 +4595,8 @@ packages: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-flatten@1.1.1: @@ -4973,16 +4614,16 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} arrify@2.0.1: @@ -5003,21 +4644,21 @@ packages: asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - assert-options@0.8.1: - resolution: {integrity: sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==} + assert-options@0.8.2: + resolution: {integrity: sha512-XaXoMxY0zuwAb0YuZjxIm8FeWvNq0aWNIbrzHhFjme8Smxw4JlPoyrAKQ6808k5UvQdhvnWqHZCphq5mXd4TDA==} engines: {node: '>=10.0.0'} async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - auth0@4.3.1: - resolution: {integrity: sha512-VuR/PdNHwXD9QiYUZf8UN0qiv07yJWHKfF2yEhePaPCrpwbEm6lHM6dkN7ylOdseogCkGmvchxYGMga0IPNrCA==} + auth0@4.15.0: + resolution: {integrity: sha512-GPJJcDxk0sMnpbTZf9QWHXJrdPoSTG9eG5q9Un7X+eNKhZVPEzr3sSK3/EToRP4fNIPKbCWjXa2+HM3GnY3F4g==} engines: {node: '>=18'} available-typed-arrays@1.0.7: @@ -5028,8 +4669,8 @@ packages: resolution: {integrity: sha512-empd1m/J/MAkL6d9OeRpmg9thobULu0wk4v8W3JToaxGi2TD7PIdvE6yliZKyOVAdJINhBWEBhxR4OUIHhcGbQ==} engines: {node: '>= 0.8.0'} - aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} axios-retry@3.2.0: resolution: {integrity: sha512-RK2cLMgIsAQBDhlIsJR5dOhODPigvel18XUv1dDXW+4k1FzebyfRk+C+orot6WPZOYFKSfhLwHPwVmTVOODQ5w==} @@ -5046,6 +4687,9 @@ packages: axios@1.6.8: resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5060,23 +4704,23 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 @@ -5147,6 +4791,10 @@ packages: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5167,16 +4815,16 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browser-request@0.3.3: resolution: {integrity: sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==} engines: {'0': node} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5202,8 +4850,8 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} engines: {node: '>=6.14.2'} bunyan-format@0.2.1: @@ -5229,8 +4877,16 @@ packages: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} call-me-maybe@1.0.2: @@ -5252,11 +4908,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001614: - resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} - cargo-cp-artifact@0.1.8: - resolution: {integrity: sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==} + cargo-cp-artifact@0.1.9: + resolution: {integrity: sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA==} hasBin: true chalk@2.4.2: @@ -5285,8 +4941,8 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} ci-info@2.0.0: @@ -5296,8 +4952,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} clearbit@1.3.5: resolution: {integrity: sha512-tlzF6XzgrT22+9tobCPnlJ1575QIy/wuAoVLUe/7Y6/Y4ZCbXSmVms5l9lbcrGqwmaiTZmhB/EQnimkt/m5ViQ==} @@ -5434,8 +5090,8 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - config@3.3.11: - resolution: {integrity: sha512-Dhn63ZoWCW5EMg4P0Sl/XNsj/7RLiUIA1x1npCy+m2cRwRHzLnt3UtYtxRDMZW/6oOMdWhCzaGYkOcajGgrAOA==} + config@3.3.12: + resolution: {integrity: sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw==} engines: {node: '>= 10.0.0'} configstore@5.0.1: @@ -5470,14 +5126,14 @@ packages: resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} engines: {node: '>= 0.6'} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -5489,8 +5145,8 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5521,14 +5177,14 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crowd-sentiment@1.1.7: @@ -5554,34 +5210,34 @@ packages: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} - csv-parse@5.5.6: - resolution: {integrity: sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==} + csv-parse@5.6.0: + resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} date-and-time@0.14.2: resolution: {integrity: sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==} - dc-polyfill@0.1.4: - resolution: {integrity: sha512-8iwEduR2jR9wWYggeaYtYZWRiUe3XZPyAQtMTL1otv8X3kfR8xUIVb4l5awHEeyDrH6Je7N324lKzMKlMMN6Yw==} + dc-polyfill@0.1.6: + resolution: {integrity: sha512-UV33cugmCC49a5uWAApM+6Ev9ZdvIUMTrtCO9fj96TPGOQiea54oeO3tiEVdVeo3J9N2UdJEmbS4zOkkEA35uQ==} engines: {node: '>=12.17'} - dd-trace@4.38.0: - resolution: {integrity: sha512-tEcCFz3drKoifSo4U7EyT+PDg0TXBBjl07z51NkouIou7eiKK/vGWQ5zKBDmt0qCPLnvNuNFT3T6ErSoLZNSOw==} + dd-trace@4.54.0: + resolution: {integrity: sha512-4yVnl3m0F0t/6PFQSurIOfNCD/Y0otl/UKmadsHGlrbnrzYKBmvUuMPofMbWur1sHf3/Y7LRwLGaFzSdot40KA==} engines: {node: '>=16'} debug@2.6.9: @@ -5600,8 +5256,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -5609,8 +5265,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -5722,12 +5378,12 @@ packages: discontinuous-range@1.0.0: resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} - discord-api-types@0.37.61: - resolution: {integrity: sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==} + discord-api-types@0.37.115: + resolution: {integrity: sha512-ivPnJotSMrXW8HLjFu+0iCVs8zP6KSliMelhr7HgcB2ki1QzpORkb26m71l1pzSnnGfm7gb5n/VtRTtpw8kXFA==} - discord.js@14.14.1: - resolution: {integrity: sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==} - engines: {node: '>=16.11.0'} + discord.js@14.17.2: + resolution: {integrity: sha512-mrH6ziLVtNtId4bV4bsaUt5jE6NUaiHMPqO5VsSw1VVhFnjFi9duD8ctlo90/6cUH+8uyKBkoq9mSJ35SuuZ7Q==} + engines: {node: '>=18'} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -5757,8 +5413,8 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} @@ -5779,6 +5435,10 @@ packages: resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} engines: {node: '>=0.10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -5805,8 +5465,13 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.750: - resolution: {integrity: sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.78: + resolution: {integrity: sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -5843,30 +5508,28 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.2: + resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + ent@2.2.2: + resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==} + engines: {node: '>= 0.4'} entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -5881,34 +5544,34 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es5-ext@0.10.64: @@ -5928,13 +5591,13 @@ packages: es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-goat@2.1.1: @@ -5986,8 +5649,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6007,30 +5670,16 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - eslint-plugin-prettier@5.2.1: resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6057,8 +5706,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true @@ -6076,8 +5725,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -6103,9 +5752,6 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-lite@0.1.3: - resolution: {integrity: sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -6168,14 +5814,17 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -6193,24 +5842,23 @@ packages: fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} - fast-xml-parser@4.2.5: - resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} - hasBin: true + fast-uri@3.0.5: + resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + fast-xml-parser@4.5.1: + resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} hasBin: true fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -6225,8 +5873,11 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} finalhandler@1.1.2: @@ -6257,14 +5908,14 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6275,16 +5926,16 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + form-data@2.5.2: + resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} engines: {node: '>= 0.12'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} formidable-serverless@1.1.1: @@ -6311,8 +5962,8 @@ packages: fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} - fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6325,8 +5976,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -6377,14 +6028,18 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -6401,12 +6056,12 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -6419,9 +6074,8 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@6.0.4: @@ -6448,8 +6102,8 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -6460,8 +6114,8 @@ packages: resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==} engines: {node: '>=10'} - google-auth-library@9.14.2: - resolution: {integrity: sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==} + google-auth-library@9.15.0: + resolution: {integrity: sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==} engines: {node: '>=14'} google-p12-pem@3.1.4: @@ -6470,8 +6124,9 @@ packages: deprecated: Package is no longer maintained hasBin: true - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} @@ -6498,8 +6153,9 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -6512,12 +6168,12 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -6542,8 +6198,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - heap-js@2.5.0: - resolution: {integrity: sha512-kUGoI3p7u6B41z/dp33G6OaL7J4DRqRYwVmeIlwLClx7yaaAy7hoDExnuejTKtuDwfcatGmddHDEOjf6EyIxtQ==} + heap-js@2.6.0: + resolution: {integrity: sha512-trFMIq3PATiFRiQmNNeHtsrkwYRByIXUbYNbotiY9RLVfMkdwZdd2eQ38mGt7BRiCKBaj1DyBAIHmm7mmXPuuw==} engines: {node: '>=10.0.0'} helmet@4.1.1: @@ -6619,8 +6275,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} human-signals@2.1.0: @@ -6651,23 +6307,23 @@ packages: ignore-walk@3.0.4: resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-in-the-middle@1.8.1: - resolution: {integrity: sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==} + import-in-the-middle@1.11.2: + resolution: {integrity: sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==} import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true @@ -6699,11 +6355,8 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - int64-buffer@0.1.10: - resolution: {integrity: sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} invert-kv@1.0.0: @@ -6714,12 +6367,8 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -6728,15 +6377,20 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -6750,15 +6404,16 @@ packages: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-docker@2.2.1: @@ -6777,6 +6432,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@1.0.0: resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} engines: {node: '>=0.10.0'} @@ -6793,6 +6452,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6809,8 +6472,8 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} is-npm@4.0.0: @@ -6821,8 +6484,8 @@ packages: resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} engines: {node: '>=10'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -6844,16 +6507,20 @@ packages: is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-stream@1.1.0: @@ -6864,16 +6531,16 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -6883,8 +6550,17 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} @@ -6932,8 +6608,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} - istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} istanbul-lib-report@3.0.1: @@ -6951,9 +6627,13 @@ packages: iterate-object@1.3.4: resolution: {integrity: sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -7098,8 +6778,8 @@ packages: join-component@1.1.0: resolution: {integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==} - jose@4.15.5: - resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} js-beautify@1.15.1: resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} @@ -7124,15 +6804,21 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -7158,8 +6844,8 @@ packages: resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==} engines: {node: '>= 4'} - json11@1.1.2: - resolution: {integrity: sha512-5r1RHT1/Gr/jsI/XZZj/P6F11BKM8xvTaftRuiLkQI9Z2PFDukM82Ysxw8yDszb3NJP/NKnRlSGmhUdG99rlBw==} + json11@2.0.0: + resolution: {integrity: sha512-VuKJKUSPEJape+daTm70Nx7vdcdorf4S6LCyN2z0jUVH4UrQ4ftXo2kC0bnHpCREmxHuHqCNVPA75BjI3CB6Ag==} hasBin: true json2csv@5.0.7: @@ -7364,12 +7050,8 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@4.0.2: - resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -7389,8 +7071,8 @@ packages: resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} engines: {node: 14 || >=16.14} - lru-memoizer@2.2.0: - resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -7419,6 +7101,10 @@ packages: map-o@2.0.10: resolution: {integrity: sha512-BxazE81fVByHWasyXhqKeo2m7bFKYu+ZbEfiuexMOnklXW+tzDvnlTi/JaklEeuuwqcqJzPaf9q+TWptSGXeLg==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} @@ -7430,12 +7116,13 @@ packages: resolution: {integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==} engines: {node: '>=4'} - memfs@4.11.1: - resolution: {integrity: sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==} + memfs@4.15.3: + resolution: {integrity: sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw==} engines: {node: '>= 4.0.0'} - memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -7454,14 +7141,18 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -7499,6 +7190,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} @@ -7507,8 +7202,8 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -7517,8 +7212,8 @@ packages: minipass@2.9.0: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} minizlib@1.3.3: @@ -7536,8 +7231,8 @@ packages: module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + moment-timezone@0.5.46: + resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} @@ -7554,9 +7249,6 @@ packages: ms@2.1.1: resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -7564,10 +7256,6 @@ packages: resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} engines: {node: '>=12.13'} - msgpack-lite@0.1.26: - resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==} - hasBin: true - mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -7578,11 +7266,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + nan@2.22.0: + resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -7607,6 +7295,7 @@ packages: needle@https://codeload.github.com/clearbit/needle/tar.gz/84d28b5f2c3916db1e7eb84aeaa9d976cc40054b: resolution: {tarball: https://codeload.github.com/clearbit/needle/tar.gz/84d28b5f2c3916db1e7eb84aeaa9d976cc40054b} + name: needle version: 0.7.10 engines: {node: '>= 0.10.x'} hasBin: true @@ -7621,9 +7310,6 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} @@ -7651,8 +7337,8 @@ packages: resolution: {integrity: sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==} hasBin: true - node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-html-markdown@1.3.0: @@ -7677,8 +7363,8 @@ packages: node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nodemon@2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} @@ -7690,24 +7376,20 @@ packages: engines: {node: '>=8.10.0'} hasBin: true - nodemon@3.1.0: - resolution: {integrity: sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==} + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} engines: {node: '>=10'} hasBin: true noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - nopt@4.0.3: resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} hasBin: true - nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true @@ -7780,8 +7462,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} object-keys@0.4.0: resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} @@ -7790,8 +7473,8 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -7806,8 +7489,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} omit-deep-by-values@1.0.2: @@ -7871,6 +7554,10 @@ packages: resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} deprecated: This package is no longer supported. + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} @@ -7923,6 +7610,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} @@ -8035,16 +7725,16 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - path-to-regexp@0.1.8: - resolution: {integrity: sha512-EErxvEqTuliG5GCVHNt3K3UmfKhlOM26QtiJZ6XBnZgCd7n+P5aHNV37wFHGJSpbjN4danT+1CpOFT4giETmRQ==} - path-type@2.0.0: resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} engines: {node: '>=4'} @@ -8065,11 +7755,11 @@ packages: pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - pg-connection-string@2.6.4: - resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} - pg-cursor@2.12.0: - resolution: {integrity: sha512-rppw54OnuYZfMUjiJI2zJMwAjjt2V9EtLUb+t7V5tqwSE5Jxod+7vA7Y0FI6Nq976jNLciA0hoVkwvjjB8qzEw==} + pg-cursor@2.12.1: + resolution: {integrity: sha512-V13tEaA9Oq1w+V6Q3UBIB/blxJrwbbr35/dY54r/86soBJ7xkP236bXaORUTVXUPt9B6Ql2BQu+uwQiuMfRVgg==} peerDependencies: pg: ^8 @@ -8077,24 +7767,26 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-minify@1.6.3: - resolution: {integrity: sha512-NoSsPqXxbkD8RIe+peQCqiea4QzXgosdTKY8p7PsbbGsh2F8TifDj/vJxfuR8qJwNYrijdSs7uf0tAe6WOyCsQ==} - engines: {node: '>=12.0.0'} + pg-minify@1.6.5: + resolution: {integrity: sha512-u0UE8veaCnMfJmoklqneeBBopOAPG3/6DHqGVHYAhz8DkJXh9dnjPlz25fRxn4e+6XVzdOp7kau63Rp52fZ3WQ==} + engines: {node: '>=14.0.0'} - pg-pool@3.6.2: - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + pg-pool@3.7.0: + resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} peerDependencies: pg: '>=8.0' - pg-promise@11.6.0: - resolution: {integrity: sha512-NDRPMfkv3ia89suWlJ4iGvP6X5YFrLJ2+9AIVISeBFFZ29Eb4FNXX9JaVb1p1OrpQkE2yT7igmXPL7UYQhk+6A==} + pg-promise@11.10.2: + resolution: {integrity: sha512-wK4yjxZdfxBmAMcs40q6IsC1SOzdLilc1yNvJqlbOjtm2syayqLDCt1JQ9lhS6yNSgVlGOQZT88yb/SADJmEBw==} engines: {node: '>=14.0'} + peerDependencies: + pg-query-stream: 4.7.1 - pg-protocol@1.6.1: - resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + pg-protocol@1.7.0: + resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} - pg-query-stream@4.7.0: - resolution: {integrity: sha512-aQpK8yfFTvOzvPmhXEzWfkwM24lv2Y3TfFY0HJYwx0YM/2fL4DhqpBhLni2Kd+l9p/XoDEi+HFvEvOCm7oqaLg==} + pg-query-stream@4.7.1: + resolution: {integrity: sha512-UMgsgn/pOIYsIifRySp59vwlpTpLADMK9HWJtq5ff0Z3MxBnPMGnCQeaQl5VuL+7ov4F96mSzIRIcz+Duo6OiQ==} peerDependencies: pg: ^8 @@ -8102,8 +7794,8 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.11.5: - resolution: {integrity: sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==} + pg@8.13.1: + resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -8114,8 +7806,8 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch-browser@2.2.6: resolution: {integrity: sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w==} @@ -8145,8 +7837,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -8180,13 +7872,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -8212,8 +7899,8 @@ packages: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} - protobufjs@7.2.6: - resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -8229,8 +7916,8 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} pumpify@2.0.1: resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} @@ -8238,6 +7925,9 @@ packages: punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -8256,14 +7946,14 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} + engines: {node: '>=0.6'} + qs@6.7.0: resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} engines: {node: '>=0.6'} @@ -8339,18 +8029,22 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - redis@4.6.13: - resolution: {integrity: sha512-MHgkS4B+sPjCXpf+HfdetBwbRz6vCtsceTmw1pHNYJAsYxrfpOP6dz+piJWGos8wqG7qb3vj/Rrc5qOlmInUuA==} + redis@4.7.0: + resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + reftools@1.1.9: resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} regenerate@1.4.2: @@ -8362,12 +8056,12 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} registry-auth-token@4.2.2: @@ -8378,8 +8072,11 @@ packages: resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} engines: {node: '>=8'} - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true remove-trailing-slash@0.1.1: @@ -8414,12 +8111,13 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true responselike@1.0.2: @@ -8452,6 +8150,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -8473,8 +8174,8 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -8486,8 +8187,12 @@ packages: safe-json-stringify@1.2.0: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: @@ -8497,19 +8202,23 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-html@2.13.0: - resolution: {integrity: sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==} + sanitize-html@2.14.0: + resolution: {integrity: sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g==} sax@1.2.1: resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -8539,8 +8248,8 @@ packages: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -8613,6 +8322,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.1.1: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} @@ -8635,8 +8348,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} should-equal@2.0.0: resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} @@ -8656,8 +8370,20 @@ packages: should@13.2.3: resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -8699,19 +8425,19 @@ packages: peerDependencies: asn1.js: ^5.4.1 - socket.io-adapter@2.5.4: - resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-loader@4.0.2: @@ -8747,12 +8473,12 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} - spex@3.3.0: - resolution: {integrity: sha512-VNiXjFp6R4ldPbVRYbpxlD35yRHceecVXlct1J4/X80KuuPnW2AXMq3sGwhnJOhKkUsOxAT6nRGfGE5pocVw5w==} - engines: {node: '>=10.0.0'} + spex@3.4.0: + resolution: {integrity: sha512-8JeZJ7QlEBnSj1W1fKXgbB2KUPA8k4BxFMf6lZX/c1ZagU/1b9uZWZK0yD6yjfzqAIuTNG4YlRmtMpQiXuohsg==} + engines: {node: '>=14.0.0'} split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} @@ -8805,12 +8531,13 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -8910,10 +8637,6 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - synckit@0.9.2: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -8942,8 +8665,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8958,8 +8681,8 @@ packages: uglify-js: optional: true - terser@5.30.4: - resolution: {integrity: sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==} + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} engines: {node: '>=10'} hasBin: true @@ -8989,14 +8712,15 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} - tldts-core@6.1.18: - resolution: {integrity: sha512-e4wx32F/7dMBSZyKAx825Yte3U0PQtZZ0bkWxYQiwLteRVnQ5zM40fEbi0IyNtwQssgJAk3GCr7Q+w39hX0VKA==} + tldts-core@6.1.71: + resolution: {integrity: sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==} - tldts@6.1.18: - resolution: {integrity: sha512-F+6zjPFnFxZ0h6uGb8neQWwHQm8u3orZVFribsGq4eBgEVrzSkHxzWS2l6aKr19T1vXiOMFjqfff4fQt+WgJFg==} + tldts@6.1.71: + resolution: {integrity: sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==} hasBin: true tlhunter-sorted-set@0.1.0: @@ -9038,8 +8762,8 @@ packages: toposort-class@1.0.1: resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} - touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true tr46@0.0.3: @@ -9055,18 +8779,19 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - ts-jest@29.1.2: - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -9075,6 +8800,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -9109,8 +8836,8 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -9118,8 +8845,8 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tsx@4.7.3: - resolution: {integrity: sha512-+fQnMqIp/jxZEXLcj6WzYy9FhcS5/Dfk8y4AtzJ6ejKcKqmfTF8Gso/jtrzDggCF2zTU20gJa6n8XqPYwDAUYQ==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} hasBin: true @@ -9151,23 +8878,23 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typedarray-to-buffer@3.1.5: @@ -9181,8 +8908,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} hasBin: true @@ -9201,8 +8928,9 @@ packages: resolution: {integrity: sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==} engines: {node: '>=6.0.0'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -9210,24 +8938,30 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.27.2: - resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} - engines: {node: '>=14.0'} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + engines: {node: '>=18.17'} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: @@ -9241,8 +8975,8 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} - universal-github-app-jwt@1.1.2: - resolution: {integrity: sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA==} + universal-github-app-jwt@1.2.0: + resolution: {integrity: sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==} universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} @@ -9262,8 +8996,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -9313,15 +9047,15 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} vary@1.1.2: @@ -9340,8 +9074,8 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: @@ -9354,8 +9088,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9367,14 +9101,23 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -9443,20 +9186,20 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9563,16 +9306,16 @@ packages: snapshots: - '@actions/core@1.10.1': + '@actions/core@1.11.1': dependencies: - '@actions/http-client': 2.2.1 - uuid: 8.3.2 + '@actions/exec': 1.1.1 + '@actions/http-client': 2.2.3 '@actions/exec@1.1.1': dependencies: '@actions/io': 1.1.3 - '@actions/http-client@2.2.1': + '@actions/http-client@2.2.3': dependencies: tunnel: 0.0.6 undici: 5.28.4 @@ -9581,1471 +9324,728 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@apidevtools/openapi-schemas@2.1.0': {} - '@apidevtools/swagger-methods@3.0.2': {} - '@aws-crypto/crc32@3.0.0': - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.567.0 - tslib: 1.14.1 - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.6.2 - - '@aws-crypto/ie11-detection@3.0.0': - dependencies: - tslib: 1.14.1 + '@aws-sdk/types': 3.723.0 + tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-locate-window': 3.535.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@aws-crypto/sha256-browser@3.0.0': - dependencies: - '@aws-crypto/ie11-detection': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-crypto/supports-web-crypto': 3.0.0 - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-locate-window': 3.535.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + tslib: 2.8.1 '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-locate-window': 3.535.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@aws-crypto/sha256-js@3.0.0': - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.567.0 - tslib: 1.14.1 + tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.6.2 - - '@aws-crypto/supports-web-crypto@3.0.0': - dependencies: - tslib: 1.14.1 + '@aws-sdk/types': 3.723.0 + tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - tslib: 2.6.2 - - '@aws-crypto/util@3.0.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + tslib: 2.8.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@aws-sdk/client-bedrock-runtime@3.572.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/eventstream-serde-browser': 2.2.0 - '@smithy/eventstream-serde-config-resolver': 2.2.0 - '@smithy/eventstream-serde-node': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-stream': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-comprehend@3.564.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.556.0 - '@aws-sdk/credential-provider-node': 3.564.0 - '@aws-sdk/middleware-host-header': 3.535.0 - '@aws-sdk/middleware-logger': 3.535.0 - '@aws-sdk/middleware-recursion-detection': 3.535.0 - '@aws-sdk/middleware-user-agent': 3.540.0 - '@aws-sdk/region-config-resolver': 3.535.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@aws-sdk/util-user-agent-browser': 3.535.0 - '@aws-sdk/util-user-agent-node': 3.535.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 + '@aws-sdk/types': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - uuid: 9.0.1 - transitivePeerDependencies: - - aws-crt + tslib: 2.8.1 - '@aws-sdk/client-s3@3.689.0': + '@aws-sdk/client-bedrock-runtime@3.723.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.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-bucket-endpoint': 3.686.0 - '@aws-sdk/middleware-expect-continue': 3.686.0 - '@aws-sdk/middleware-flexible-checksums': 3.689.0 - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-location-constraint': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-sdk-s3': 3.687.0 - '@aws-sdk/middleware-ssec': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/signature-v4-multi-region': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@aws-sdk/xml-builder': 3.686.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/eventstream-serde-browser': 3.0.11 - '@smithy/eventstream-serde-config-resolver': 3.0.8 - '@smithy/eventstream-serde-node': 3.0.10 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-blob-browser': 3.1.7 - '@smithy/hash-node': 3.0.8 - '@smithy/hash-stream-node': 3.1.7 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@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.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sqs@3.564.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.556.0 - '@aws-sdk/credential-provider-node': 3.564.0 - '@aws-sdk/middleware-host-header': 3.535.0 - '@aws-sdk/middleware-logger': 3.535.0 - '@aws-sdk/middleware-recursion-detection': 3.535.0 - '@aws-sdk/middleware-sdk-sqs': 3.552.0 - '@aws-sdk/middleware-user-agent': 3.540.0 - '@aws-sdk/region-config-resolver': 3.535.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@aws-sdk/util-user-agent-browser': 3.535.0 - '@aws-sdk/util-user-agent-node': 3.535.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/md5-js': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso-oidc@3.564.0(@aws-sdk/credential-provider-node@3.564.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.556.0 - '@aws-sdk/credential-provider-node': 3.564.0 - '@aws-sdk/middleware-host-header': 3.535.0 - '@aws-sdk/middleware-logger': 3.535.0 - '@aws-sdk/middleware-recursion-detection': 3.535.0 - '@aws-sdk/middleware-user-agent': 3.540.0 - '@aws-sdk/region-config-resolver': 3.535.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@aws-sdk/util-user-agent-browser': 3.535.0 - '@aws-sdk/util-user-agent-node': 3.535.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso-oidc@3.572.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.572.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/eventstream-serde-browser': 4.0.0 + '@smithy/eventstream-serde-config-resolver': 4.0.0 + '@smithy/eventstream-serde-node': 4.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-stream': 4.0.0 + '@smithy/util-utf8': 4.0.0 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)': + '@aws-sdk/client-comprehend@3.723.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@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.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.556.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.556.0 - '@aws-sdk/middleware-host-header': 3.535.0 - '@aws-sdk/middleware-logger': 3.535.0 - '@aws-sdk/middleware-recursion-detection': 3.535.0 - '@aws-sdk/middleware-user-agent': 3.540.0 - '@aws-sdk/region-config-resolver': 3.535.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@aws-sdk/util-user-agent-browser': 3.535.0 - '@aws-sdk/util-user-agent-node': 3.535.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.572.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-utf8': 4.0.0 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.687.0': + '@aws-sdk/client-s3@3.723.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/core': 3.686.0 - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@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.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.556.0(@aws-sdk/credential-provider-node@3.564.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.556.0 - '@aws-sdk/credential-provider-node': 3.564.0 - '@aws-sdk/middleware-host-header': 3.535.0 - '@aws-sdk/middleware-logger': 3.535.0 - '@aws-sdk/middleware-recursion-detection': 3.535.0 - '@aws-sdk/middleware-user-agent': 3.540.0 - '@aws-sdk/region-config-resolver': 3.535.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@aws-sdk/util-user-agent-browser': 3.535.0 - '@aws-sdk/util-user-agent-node': 3.535.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.572.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/core': 3.572.0 - '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.572.0 - '@aws-sdk/region-config-resolver': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-bucket-endpoint': 3.723.0 + '@aws-sdk/middleware-expect-continue': 3.723.0 + '@aws-sdk/middleware-flexible-checksums': 3.723.0 + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-location-constraint': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-sdk-s3': 3.723.0 + '@aws-sdk/middleware-ssec': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/signature-v4-multi-region': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@aws-sdk/xml-builder': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/eventstream-serde-browser': 4.0.0 + '@smithy/eventstream-serde-config-resolver': 4.0.0 + '@smithy/eventstream-serde-node': 4.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-blob-browser': 4.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/hash-stream-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/md5-js': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-stream': 4.0.0 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/client-sts@3.687.0': + '@aws-sdk/client-sqs@3.723.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@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.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.556.0': - dependencies: - '@smithy/core': 1.4.2 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - - '@aws-sdk/core@3.572.0': - dependencies: - '@smithy/core': 1.4.2 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - - '@aws-sdk/core@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - fast-xml-parser: 4.4.1 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-env@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-env@3.568.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-env@3.686.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-http@3.552.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/property-provider': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-http@3.568.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/property-provider': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-http@3.686.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/node-http-handler': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-ini@3.564.0(@aws-sdk/credential-provider-node@3.564.0)': - dependencies: - '@aws-sdk/client-sts': 3.556.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/credential-provider-env': 3.535.0 - '@aws-sdk/credential-provider-process': 3.535.0 - '@aws-sdk/credential-provider-sso': 3.564.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/credential-provider-web-identity': 3.556.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/types': 3.535.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': - dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': - dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-env': 3.686.0 - '@aws-sdk/credential-provider-http': 3.686.0 - '@aws-sdk/credential-provider-process': 3.686.0 - '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-node@3.564.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.535.0 - '@aws-sdk/credential-provider-http': 3.552.0 - '@aws-sdk/credential-provider-ini': 3.564.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/credential-provider-process': 3.535.0 - '@aws-sdk/credential-provider-sso': 3.564.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/credential-provider-web-identity': 3.556.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/types': 3.535.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0))': - dependencies: - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)) - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/credential-provider-process': 3.572.0 - '@aws-sdk/credential-provider-sso': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.686.0 - '@aws-sdk/credential-provider-http': 3.686.0 - '@aws-sdk/credential-provider-ini': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/credential-provider-process': 3.686.0 - '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-sdk-sqs': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/md5-js': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-process@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + - aws-crt - '@aws-sdk/credential-provider-process@3.572.0': + '@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0)': dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/credential-provider-process@3.686.0': + '@aws-sdk/client-sso@3.723.0': dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/credential-provider-sso@3.564.0(@aws-sdk/credential-provider-node@3.564.0)': + '@aws-sdk/client-sts@3.723.0': dependencies: - '@aws-sdk/client-sso': 3.556.0 - '@aws-sdk/token-providers': 3.564.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/types': 3.535.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/middleware-host-header': 3.723.0 + '@aws-sdk/middleware-logger': 3.723.0 + '@aws-sdk/middleware-recursion-detection': 3.723.0 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/region-config-resolver': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@aws-sdk/util-user-agent-browser': 3.723.0 + '@aws-sdk/util-user-agent-node': 3.723.0 + '@smithy/config-resolver': 4.0.0 + '@smithy/core': 3.0.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/hash-node': 4.0.0 + '@smithy/invalid-dependency': 4.0.0 + '@smithy/middleware-content-length': 4.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-retry': 4.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.0 + '@smithy/util-defaults-mode-node': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - aws-crt - '@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': - dependencies: - '@aws-sdk/client-sso': 3.572.0 - '@aws-sdk/token-providers': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-sdk/core@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/core': 3.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/signature-v4': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-middleware': 4.0.0 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.723.0': + dependencies: + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/property-provider': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.723.0': + dependencies: + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-stream': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0)': + dependencies: + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/credential-provider-env': 3.723.0 + '@aws-sdk/credential-provider-http': 3.723.0 + '@aws-sdk/credential-provider-process': 3.723.0 + '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/types': 3.723.0 + '@smithy/credential-provider-imds': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': - dependencies: - '@aws-sdk/client-sso': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/token-providers': 3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/credential-provider-node@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.723.0 + '@aws-sdk/credential-provider-http': 3.723.0 + '@aws-sdk/credential-provider-ini': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-process': 3.723.0 + '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/types': 3.723.0 + '@smithy/credential-provider-imds': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.556.0(@aws-sdk/credential-provider-node@3.564.0)': - dependencies: - '@aws-sdk/client-sts': 3.556.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/types': 3.535.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-sdk/credential-provider-process@3.723.0': + dependencies: + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)': + dependencies: + '@aws-sdk/client-sso': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/token-providers': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/types': 3.723.0 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' + - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.572.0)': - dependencies: - '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-web-identity@3.686.0(@aws-sdk/client-sts@3.687.0)': + '@aws-sdk/credential-provider-web-identity@3.723.0(@aws-sdk/client-sts@3.723.0)': dependencies: - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/client-sts': 3.723.0 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/property-provider': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@aws-sdk/hash-node@3.374.0': dependencies: '@smithy/hash-node': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.686.0': + '@aws-sdk/middleware-bucket-endpoint@3.723.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-config-provider': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.686.0': + '@aws-sdk/middleware-expect-continue@3.723.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.689.0': + '@aws-sdk/middleware-flexible-checksums@3.723.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-host-header@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-host-header@3.567.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-host-header@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-location-constraint@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-logger@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-logger@3.568.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-logger@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-recursion-detection@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-recursion-detection@3.567.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-recursion-detection@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-sdk-s3@3.556.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-arn-parser': 3.535.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-sdk-s3@3.687.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 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 - - '@aws-sdk/middleware-sdk-sqs@3.552.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-ssec@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-user-agent@3.540.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-endpoints': 3.540.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-user-agent@3.572.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.572.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-user-agent@3.687.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-stream': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.723.0': + dependencies: + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/core': 3.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/signature-v4': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-stream': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-sqs@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.723.0': + dependencies: + '@aws-sdk/types': 3.723.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.723.0': + dependencies: + '@aws-sdk/core': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-endpoints': 3.723.0 + '@smithy/core': 3.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@aws-sdk/node-http-handler@3.374.0': dependencies: '@smithy/node-http-handler': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/protocol-http@3.374.0': dependencies: '@smithy/protocol-http': 1.2.0 - tslib: 2.6.2 - - '@aws-sdk/region-config-resolver@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.6.2 - - '@aws-sdk/region-config-resolver@3.572.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.6.2 - - '@aws-sdk/region-config-resolver@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.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.8 - tslib: 2.6.2 - - '@aws-sdk/s3-request-presigner@3.564.0': - dependencies: - '@aws-sdk/signature-v4-multi-region': 3.556.0 - '@aws-sdk/types': 3.535.0 - '@aws-sdk/util-format-url': 3.535.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/signature-v4-multi-region@3.556.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.556.0 - '@aws-sdk/types': 3.535.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/signature-v4-multi-region@3.687.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@aws-sdk/token-providers@3.564.0(@aws-sdk/credential-provider-node@3.564.0)': - dependencies: - '@aws-sdk/client-sso-oidc': 3.564.0(@aws-sdk/credential-provider-node@3.564.0) - '@aws-sdk/types': 3.535.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt + tslib: 2.8.1 - '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': + '@aws-sdk/region-config-resolver@3.723.0': dependencies: - '@aws-sdk/client-sso-oidc': 3.572.0 - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/token-providers@3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': + '@aws-sdk/s3-request-presigner@3.723.0': dependencies: - '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/signature-v4-multi-region': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@aws-sdk/util-format-url': 3.723.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/types@3.535.0': + '@aws-sdk/signature-v4-multi-region@3.723.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-sdk/middleware-sdk-s3': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/signature-v4': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/types@3.567.0': + '@aws-sdk/token-providers@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/types': 3.723.0 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/types@3.686.0': + '@aws-sdk/types@3.723.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@aws-sdk/url-parser@3.374.0': dependencies: '@smithy/url-parser': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.535.0': + '@aws-sdk/util-arn-parser@3.723.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.679.0': + '@aws-sdk/util-endpoints@3.723.0': dependencies: - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + '@smithy/types': 4.0.0 + '@smithy/util-endpoints': 3.0.0 + tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.540.0': + '@aws-sdk/util-format-url@3.723.0': dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/types': 2.12.0 - '@smithy/util-endpoints': 1.2.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.723.0 + '@smithy/querystring-builder': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.572.0': + '@aws-sdk/util-locate-window@3.723.0': dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/types': 2.12.0 - '@smithy/util-endpoints': 1.2.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.686.0': + '@aws-sdk/util-user-agent-browser@3.723.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - '@smithy/util-endpoints': 2.1.4 - tslib: 2.6.2 - - '@aws-sdk/util-format-url@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/util-locate-window@3.535.0': - dependencies: - tslib: 2.6.2 - - '@aws-sdk/util-user-agent-browser@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/types': 2.12.0 - bowser: 2.11.0 - tslib: 2.6.2 - - '@aws-sdk/util-user-agent-browser@3.567.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/types': 2.12.0 - bowser: 2.11.0 - tslib: 2.6.2 - - '@aws-sdk/util-user-agent-browser@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 + '@aws-sdk/types': 3.723.0 + '@smithy/types': 4.0.0 bowser: 2.11.0 - tslib: 2.6.2 - - '@aws-sdk/util-user-agent-node@3.535.0': - dependencies: - '@aws-sdk/types': 3.535.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@aws-sdk/util-user-agent-node@3.568.0': - dependencies: - '@aws-sdk/types': 3.567.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.687.0': + '@aws-sdk/util-user-agent-node@3.723.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@aws-sdk/middleware-user-agent': 3.723.0 + '@aws-sdk/types': 3.723.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@aws-sdk/util-utf8-browser@3.259.0': + '@aws-sdk/xml-builder@3.723.0': dependencies: - tslib: 2.6.2 - - '@aws-sdk/xml-builder@3.686.0': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@azure/abort-controller@1.1.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@azure/abort-controller@2.1.2': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@azure/core-auth@1.9.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-util': 1.11.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@azure/core-http@3.0.4(encoding@0.1.13)': + '@azure/core-http@3.0.5': dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-auth': 1.9.0 @@ -11054,10 +10054,10 @@ snapshots: '@azure/logger': 1.1.4 '@types/node-fetch': 2.6.12 '@types/tunnel': 0.0.3 - form-data: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) + form-data: 4.0.1 + node-fetch: 2.7.0 process: 0.11.10 - tslib: 2.6.2 + tslib: 2.8.1 tunnel: 0.0.6 uuid: 8.3.2 xml2js: 0.5.0 @@ -11069,60 +10069,61 @@ snapshots: '@azure/abort-controller': 2.1.2 '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - tslib: 2.6.2 + tslib: 2.8.1 '@azure/core-paging@1.6.2': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@azure/core-tracing@1.0.0-preview.13': dependencies: - '@opentelemetry/api': 1.6.0 - tslib: 2.6.2 + '@opentelemetry/api': 1.9.0 + tslib: 2.8.1 '@azure/core-util@1.11.0': dependencies: '@azure/abort-controller': 2.1.2 - tslib: 2.6.2 + tslib: 2.8.1 '@azure/logger@1.1.4': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@azure/storage-blob@12.18.0(encoding@0.1.13)': + '@azure/storage-blob@12.18.0': dependencies: '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.4(encoding@0.1.13) + '@azure/core-http': 3.0.5 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 '@azure/core-tracing': 1.0.0-preview.13 '@azure/logger': 1.1.4 events: 3.3.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - encoding - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.26.3': {} - '@babel/core@7.24.4': + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -11131,743 +10132,759 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.24.4': + '@babel/generator@7.26.3': dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-annotate-as-pure@7.22.5': - dependencies: - '@babel/types': 7.24.0 + jsesc: 3.1.0 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.26.3 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@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/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.4 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4)': + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.4)': + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - debug: 4.3.4(supports-color@5.5.0) + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0(supports-color@5.5.0) lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 - '@babel/helper-function-name@7.23.0': + '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.26.3 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - '@babel/helper-member-expression-to-functions@7.23.0': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': + '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/types': 7.26.3 - '@babel/helper-optimise-call-expression@7.22.5': + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/helper-plugin-utils@7.24.0': {} + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4)': + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4)': + '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/types': 7.26.3 - '@babel/helper-simple-access@7.22.5': + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/types': 7.24.0 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + '@babel/helpers@7.26.0': dependencies: - '@babel/types': 7.24.0 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 - '@babel/helper-split-export-declaration@7.22.6': + '@babel/parser@7.26.3': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.26.3 - '@babel/helper-string-parser@7.24.1': {} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option@7.23.5': {} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-wrap-function@7.22.20': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/helpers@7.24.4': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.2': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser@7.24.4': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4)': + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4)': + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@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/core@7.26.0) + '@babel/traverse': 7.26.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - regenerator-transform: 0.15.2 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/preset-env@7.24.4(@babel/core@7.24.4)': - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.4) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.4) - core-js-compat: 3.37.0 + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@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/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.3 esutils: 2.0.3 - '@babel/preset-typescript@7.24.1(@babel/core@7.24.4)': + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) - - '@babel/regjsgen@0.8.0': {} + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/runtime@7.24.4': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@babel/traverse@7.23.2': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@5.5.0) + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.24.1': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@5.5.0) + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.17.0': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.25.9 to-fast-properties: 2.0.0 - '@babel/types@7.24.0': + '@babel/types@7.26.3': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@bcoe/v8-coverage@0.2.3': {} @@ -11883,25 +10900,27 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@datadog/native-appsec@7.1.1': + '@datadog/libdatadog@0.3.0': {} + + '@datadog/native-appsec@8.3.0': dependencies: node-gyp-build: 3.9.0 - '@datadog/native-iast-rewriter@2.3.1': + '@datadog/native-iast-rewriter@2.6.1': dependencies: lru-cache: 7.18.3 - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.4 - '@datadog/native-iast-taint-tracking@2.1.0': + '@datadog/native-iast-taint-tracking@3.2.0': dependencies: node-gyp-build: 3.9.0 - '@datadog/native-metrics@2.0.0': + '@datadog/native-metrics@3.1.0': dependencies: node-addon-api: 6.1.0 node-gyp-build: 3.9.0 - '@datadog/pprof@5.3.0': + '@datadog/pprof@5.4.1': dependencies: delay: 5.0.0 node-gyp-build: 3.9.0 @@ -11911,136 +10930,139 @@ snapshots: '@datadog/sketches-js@2.1.1': {} - '@discordjs/builders@1.7.0': + '@discordjs/builders@1.10.0': dependencies: - '@discordjs/formatters': 0.3.3 - '@discordjs/util': 1.0.2 - '@sapphire/shapeshift': 3.9.7 - discord-api-types: 0.37.61 + '@discordjs/formatters': 0.6.0 + '@discordjs/util': 1.1.1 + '@sapphire/shapeshift': 4.0.0 + discord-api-types: 0.37.115 fast-deep-equal: 3.1.3 ts-mixer: 6.0.4 - tslib: 2.6.2 + tslib: 2.8.1 '@discordjs/collection@1.5.3': {} - '@discordjs/collection@2.0.0': {} + '@discordjs/collection@2.1.1': {} - '@discordjs/formatters@0.3.3': + '@discordjs/formatters@0.6.0': dependencies: - discord-api-types: 0.37.61 + discord-api-types: 0.37.115 - '@discordjs/rest@2.2.0': + '@discordjs/rest@2.4.2': dependencies: - '@discordjs/collection': 2.0.0 - '@discordjs/util': 1.0.2 - '@sapphire/async-queue': 1.5.2 - '@sapphire/snowflake': 3.5.1 - '@vladfrangu/async_event_emitter': 2.2.4 - discord-api-types: 0.37.61 + '@discordjs/collection': 2.1.1 + '@discordjs/util': 1.1.1 + '@sapphire/async-queue': 1.5.5 + '@sapphire/snowflake': 3.5.3 + '@vladfrangu/async_event_emitter': 2.4.6 + discord-api-types: 0.37.115 magic-bytes.js: 1.10.0 - tslib: 2.6.2 - undici: 5.27.2 - - '@discordjs/util@1.0.2': {} - - '@discordjs/ws@1.0.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@discordjs/collection': 2.0.0 - '@discordjs/rest': 2.2.0 - '@discordjs/util': 1.0.2 - '@sapphire/async-queue': 1.5.2 - '@types/ws': 8.5.9 - '@vladfrangu/async_event_emitter': 2.2.4 - discord-api-types: 0.37.61 - tslib: 2.6.2 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + tslib: 2.8.1 + undici: 6.19.8 + + '@discordjs/util@1.1.1': {} + + '@discordjs/ws@1.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@discordjs/collection': 2.1.1 + '@discordjs/rest': 2.4.2 + '@discordjs/util': 1.1.1 + '@sapphire/async-queue': 1.5.5 + '@types/ws': 8.5.13 + '@vladfrangu/async_event_emitter': 2.4.6 + discord-api-types: 0.37.115 + tslib: 2.8.1 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@esbuild/aix-ppc64@0.19.12': + '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-ia32@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: - eslint: 8.57.0 + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -12048,41 +11070,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.57.1': {} '@exodus/schemasafe@1.3.0': {} '@fastify/busboy@2.1.1': {} - '@gitbeaker/core@40.2.1': + '@gitbeaker/core@40.6.0': dependencies: - '@gitbeaker/requester-utils': 40.2.1 - qs: 6.13.0 + '@gitbeaker/requester-utils': 40.6.0 + qs: 6.13.1 xcase: 2.0.1 - '@gitbeaker/requester-utils@40.2.1': + '@gitbeaker/requester-utils@40.6.0': dependencies: picomatch-browser: 2.2.6 - qs: 6.13.0 + qs: 6.13.1 rate-limiter-flexible: 4.0.1 xcase: 2.0.1 - '@gitbeaker/rest@40.2.1': + '@gitbeaker/rest@40.6.0': dependencies: - '@gitbeaker/core': 40.2.1 - '@gitbeaker/requester-utils': 40.2.1 + '@gitbeaker/core': 40.6.0 + '@gitbeaker/requester-utils': 40.6.0 - '@google-cloud/common@3.10.0(encoding@0.1.13)': + '@google-cloud/common@3.10.0': dependencies: '@google-cloud/projectify': 2.1.1 '@google-cloud/promisify': 2.0.4 arrify: 2.0.1 duplexify: 4.1.3 - ent: 2.2.0 + ent: 2.2.2 extend: 3.0.2 - google-auth-library: 7.14.1(encoding@0.1.13) + google-auth-library: 7.14.1 retry-request: 4.2.2 - teeny-request: 7.2.0(encoding@0.1.13) + teeny-request: 7.2.0 transitivePeerDependencies: - encoding - supports-color @@ -12105,9 +11127,9 @@ snapshots: '@google-cloud/promisify@4.0.0': {} - '@google-cloud/storage@5.3.0(encoding@0.1.13)': + '@google-cloud/storage@5.3.0': dependencies: - '@google-cloud/common': 3.10.0(encoding@0.1.13) + '@google-cloud/common': 3.10.0 '@google-cloud/paginator': 3.0.7 '@google-cloud/promisify': 2.0.4 arrify: 2.0.1 @@ -12116,8 +11138,8 @@ snapshots: date-and-time: 0.14.2 duplexify: 3.7.1 extend: 3.0.2 - gaxios: 3.2.0(encoding@0.1.13) - gcs-resumable-upload: 3.6.0(encoding@0.1.13) + gaxios: 3.2.0 + gcs-resumable-upload: 3.6.0 hash-stream-validation: 0.2.4 mime: 2.6.0 mime-types: 2.1.35 @@ -12131,7 +11153,7 @@ snapshots: - encoding - supports-color - '@google-cloud/storage@7.14.0(encoding@0.1.13)': + '@google-cloud/storage@7.14.0': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -12139,20 +11161,20 @@ snapshots: abort-controller: 3.0.0 async-retry: 1.3.3 duplexify: 4.1.3 - fast-xml-parser: 4.5.0 - gaxios: 6.7.1(encoding@0.1.13) - google-auth-library: 9.14.2(encoding@0.1.13) + fast-xml-parser: 4.5.1 + gaxios: 6.7.1 + google-auth-library: 9.15.0 html-entities: 2.5.2 mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2(encoding@0.1.13) - teeny-request: 9.0.0(encoding@0.1.13) + retry-request: 7.0.2 + teeny-request: 9.0.0 uuid: 8.3.2 transitivePeerDependencies: - encoding - supports-color - '@grpc/grpc-js@1.11.3': + '@grpc/grpc-js@1.12.5': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 @@ -12161,13 +11183,13 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.2.3 - protobufjs: 7.2.6 + protobufjs: 7.4.0 yargs: 17.7.2 - '@humanwhocodes/config-array@0.11.14': + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12187,6 +11209,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/ttlcache@1.4.1': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -12200,27 +11224,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3))': + '@jest/core@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.17.12) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -12232,7 +11256,7 @@ snapshots: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -12245,7 +11269,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -12263,7 +11287,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.7 + '@types/node': 20.17.12 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12285,14 +11309,14 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 @@ -12302,7 +11326,7 @@ snapshots: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color @@ -12332,7 +11356,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.26.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -12343,7 +11367,7 @@ snapshots: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -12355,14 +11379,14 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.7 - '@types/yargs': 17.0.32 + '@types/node': 20.17.12 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} @@ -12371,40 +11395,40 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@js-sdsl/ordered-map@4.4.2': {} '@jsdevtools/ono@7.1.3': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.6.2)': + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.0(tslib@2.6.2)': + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.6.2) - '@jsonjoy.com/util': 1.3.0(tslib@2.6.2) + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.6.2) - tslib: 2.6.2 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/util@1.3.0(tslib@2.6.2)': + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -12416,42 +11440,42 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 - '@octokit/auth-app@3.6.1(encoding@0.1.13)': + '@octokit/auth-app@3.6.1': dependencies: - '@octokit/auth-oauth-app': 4.3.4(encoding@0.1.13) - '@octokit/auth-oauth-user': 1.3.0(encoding@0.1.13) - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/auth-oauth-app': 4.3.4 + '@octokit/auth-oauth-user': 1.3.0 + '@octokit/request': 5.6.3 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 '@types/lru-cache': 5.1.1 deprecation: 2.3.1 lru-cache: 6.0.0 - universal-github-app-jwt: 1.1.2 + universal-github-app-jwt: 1.2.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/auth-app@4.0.13(encoding@0.1.13)': + '@octokit/auth-app@4.0.13': dependencies: - '@octokit/auth-oauth-app': 5.0.6(encoding@0.1.13) - '@octokit/auth-oauth-user': 2.1.2(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/auth-oauth-app': 5.0.6 + '@octokit/auth-oauth-user': 2.1.2 + '@octokit/request': 6.2.8 '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 deprecation: 2.3.1 lru-cache: 9.1.2 - universal-github-app-jwt: 1.1.2 + universal-github-app-jwt: 1.2.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/auth-oauth-app@4.3.4(encoding@0.1.13)': + '@octokit/auth-oauth-app@4.3.4': dependencies: - '@octokit/auth-oauth-device': 3.1.4(encoding@0.1.13) - '@octokit/auth-oauth-user': 2.1.2(encoding@0.1.13) - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/auth-oauth-device': 3.1.4 + '@octokit/auth-oauth-user': 2.1.2 + '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 '@types/btoa-lite': 1.0.2 btoa-lite: 1.0.0 @@ -12459,11 +11483,11 @@ snapshots: transitivePeerDependencies: - encoding - '@octokit/auth-oauth-app@5.0.6(encoding@0.1.13)': + '@octokit/auth-oauth-app@5.0.6': dependencies: - '@octokit/auth-oauth-device': 4.0.5(encoding@0.1.13) - '@octokit/auth-oauth-user': 2.1.2(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/auth-oauth-device': 4.0.5 + '@octokit/auth-oauth-user': 2.1.2 + '@octokit/request': 6.2.8 '@octokit/types': 9.3.2 '@types/btoa-lite': 1.0.2 btoa-lite: 1.0.0 @@ -12471,40 +11495,40 @@ snapshots: transitivePeerDependencies: - encoding - '@octokit/auth-oauth-device@3.1.4(encoding@0.1.13)': + '@octokit/auth-oauth-device@3.1.4': dependencies: - '@octokit/oauth-methods': 2.0.6(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/oauth-methods': 2.0.6 + '@octokit/request': 6.2.8 '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/auth-oauth-device@4.0.5(encoding@0.1.13)': + '@octokit/auth-oauth-device@4.0.5': dependencies: - '@octokit/oauth-methods': 2.0.6(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/oauth-methods': 2.0.6 + '@octokit/request': 6.2.8 '@octokit/types': 9.3.2 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/auth-oauth-user@1.3.0(encoding@0.1.13)': + '@octokit/auth-oauth-user@1.3.0': dependencies: - '@octokit/auth-oauth-device': 3.1.4(encoding@0.1.13) - '@octokit/oauth-methods': 1.2.6(encoding@0.1.13) - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/auth-oauth-device': 3.1.4 + '@octokit/oauth-methods': 1.2.6 + '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 btoa-lite: 1.0.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/auth-oauth-user@2.1.2(encoding@0.1.13)': + '@octokit/auth-oauth-user@2.1.2': dependencies: - '@octokit/auth-oauth-device': 4.0.5(encoding@0.1.13) - '@octokit/oauth-methods': 2.0.6(encoding@0.1.13) - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/auth-oauth-device': 4.0.5 + '@octokit/oauth-methods': 2.0.6 + '@octokit/request': 6.2.8 '@octokit/types': 9.3.2 btoa-lite: 1.0.0 universal-user-agent: 6.0.1 @@ -12513,19 +11537,19 @@ snapshots: '@octokit/auth-token@5.1.1': {} - '@octokit/core@6.1.2': + '@octokit/core@6.1.3': dependencies: '@octokit/auth-token': 5.1.1 - '@octokit/graphql': 8.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.4 - '@octokit/types': 13.5.0 + '@octokit/graphql': 8.1.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 before-after-hook: 3.0.2 universal-user-agent: 7.0.2 - '@octokit/endpoint@10.1.1': + '@octokit/endpoint@10.1.2': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 '@octokit/endpoint@6.0.12': @@ -12540,46 +11564,46 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@4.8.0(encoding@0.1.13)': + '@octokit/graphql@4.8.0': dependencies: - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/graphql@5.0.6(encoding@0.1.13)': + '@octokit/graphql@5.0.6': dependencies: - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/request': 6.2.8 '@octokit/types': 9.3.2 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/graphql@8.1.1': + '@octokit/graphql@8.1.2': dependencies: - '@octokit/request': 9.1.3 - '@octokit/types': 13.5.0 + '@octokit/request': 9.1.4 + '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 '@octokit/oauth-authorization-url@4.3.3': {} '@octokit/oauth-authorization-url@5.0.0': {} - '@octokit/oauth-methods@1.2.6(encoding@0.1.13)': + '@octokit/oauth-methods@1.2.6': dependencies: '@octokit/oauth-authorization-url': 4.3.3 - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/request': 5.6.3 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 btoa-lite: 1.0.0 transitivePeerDependencies: - encoding - '@octokit/oauth-methods@2.0.6(encoding@0.1.13)': + '@octokit/oauth-methods@2.0.6': dependencies: '@octokit/oauth-authorization-url': 5.0.0 - '@octokit/request': 6.2.8(encoding@0.1.13) + '@octokit/request': 6.2.8 '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 btoa-lite: 1.0.0 @@ -12604,40 +11628,41 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request-error@6.1.4': + '@octokit/request-error@6.1.6': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 - '@octokit/request@5.6.3(encoding@0.1.13)': + '@octokit/request@5.6.3': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/request@6.2.8(encoding@0.1.13)': + '@octokit/request@6.2.8': dependencies: '@octokit/endpoint': 7.0.6 '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 is-plain-object: 5.0.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/request@9.1.3': + '@octokit/request@9.1.4': dependencies: - '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.4 - '@octokit/types': 13.5.0 + '@octokit/endpoint': 10.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + fast-content-type-parse: 2.0.1 universal-user-agent: 7.0.2 - '@octokit/types@13.5.0': + '@octokit/types@13.6.2': dependencies: '@octokit/openapi-types': 22.2.0 @@ -12651,25 +11676,27 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@opensearch-project/opensearch@2.11.0': + '@opensearch-project/opensearch@2.13.0': dependencies: - aws4: 1.12.0 - debug: 4.3.4(supports-color@5.5.0) + aws4: 1.13.2 + debug: 4.4.0(supports-color@5.5.0) hpagent: 1.2.0 - json11: 1.1.2 + json11: 2.0.0 ms: 2.1.3 secure-json-parse: 2.7.0 transitivePeerDependencies: - supports-color - '@opentelemetry/api@1.6.0': {} + '@opentelemetry/api@1.8.0': {} + + '@opentelemetry/api@1.9.0': {} - '@opentelemetry/core@1.24.0(@opentelemetry/api@1.6.0)': + '@opentelemetry/core@1.30.0(@opentelemetry/api@1.8.0)': dependencies: - '@opentelemetry/api': 1.6.0 - '@opentelemetry/semantic-conventions': 1.24.0 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/semantic-conventions@1.24.0': {} + '@opentelemetry/semantic-conventions@1.28.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -12701,12 +11728,12 @@ snapshots: '@questdb/nodejs-client@3.0.0': {} - '@readme/better-ajv-errors@1.6.0(ajv@8.12.0)': + '@readme/better-ajv-errors@1.6.0(ajv@8.17.1)': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.4 + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 '@humanwhocodes/momoa': 2.0.4 - ajv: 8.12.0 + ajv: 8.17.1 chalk: 4.1.2 json-to-ast: 2.1.0 jsonpointer: 5.0.1 @@ -12719,52 +11746,56 @@ snapshots: call-me-maybe: 1.0.2 js-yaml: 4.1.0 - '@readme/openapi-parser@2.5.1(openapi-types@12.1.3)': + '@readme/openapi-parser@2.6.0(openapi-types@12.1.3)': dependencies: - '@apidevtools/openapi-schemas': 2.1.0 '@apidevtools/swagger-methods': 3.0.2 '@jsdevtools/ono': 7.1.3 - '@readme/better-ajv-errors': 1.6.0(ajv@8.12.0) + '@readme/better-ajv-errors': 1.6.0(ajv@8.17.1) '@readme/json-schema-ref-parser': 1.2.0 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) + '@readme/openapi-schemas': 3.1.0 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) call-me-maybe: 1.0.2 openapi-types: 12.1.3 - '@redis/bloom@1.2.0(@redis/client@1.5.14)': + '@readme/openapi-schemas@3.1.0': {} + + '@redis/bloom@1.2.0(@redis/client@1.6.0)': dependencies: - '@redis/client': 1.5.14 + '@redis/client': 1.6.0 - '@redis/client@1.5.14': + '@redis/client@1.6.0': dependencies: cluster-key-slot: 1.1.2 generic-pool: 3.9.0 yallist: 4.0.0 - '@redis/graph@1.1.1(@redis/client@1.5.14)': + '@redis/graph@1.1.1(@redis/client@1.6.0)': dependencies: - '@redis/client': 1.5.14 + '@redis/client': 1.6.0 - '@redis/json@1.0.6(@redis/client@1.5.14)': + '@redis/json@1.0.7(@redis/client@1.6.0)': dependencies: - '@redis/client': 1.5.14 + '@redis/client': 1.6.0 - '@redis/search@1.1.6(@redis/client@1.5.14)': + '@redis/search@1.2.0(@redis/client@1.6.0)': dependencies: - '@redis/client': 1.5.14 + '@redis/client': 1.6.0 - '@redis/time-series@1.0.5(@redis/client@1.5.14)': + '@redis/time-series@1.1.0(@redis/client@1.6.0)': dependencies: - '@redis/client': 1.5.14 + '@redis/client': 1.6.0 + + '@rtsao/scc@1.1.0': {} - '@sapphire/async-queue@1.5.2': {} + '@sapphire/async-queue@1.5.5': {} - '@sapphire/shapeshift@3.9.7': + '@sapphire/shapeshift@4.0.0': dependencies: fast-deep-equal: 3.1.3 lodash: 4.17.21 - '@sapphire/snowflake@3.5.1': {} + '@sapphire/snowflake@3.5.3': {} '@segment/loosely-validate-event@2.0.0': dependencies: @@ -12788,10 +11819,10 @@ snapshots: transitivePeerDependencies: - debug - '@sendgrid/client@8.1.3': + '@sendgrid/client@8.1.4': dependencies: '@sendgrid/helpers': 8.0.0 - axios: 1.6.8 + axios: 1.7.9 transitivePeerDependencies: - debug @@ -12821,9 +11852,9 @@ snapshots: transitivePeerDependencies: - debug - '@sendgrid/mail@8.1.3': + '@sendgrid/mail@8.1.4': dependencies: - '@sendgrid/client': 8.1.3 + '@sendgrid/client': 8.1.4 '@sendgrid/helpers': 8.0.0 transitivePeerDependencies: - debug @@ -12842,19 +11873,19 @@ snapshots: '@slack/logger@3.0.0': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 - '@slack/types@2.11.0': {} + '@slack/types@2.14.0': {} - '@slack/web-api@6.12.0': + '@slack/web-api@6.13.0': dependencies: '@slack/logger': 3.0.0 - '@slack/types': 2.11.0 + '@slack/types': 2.14.0 '@types/is-stream': 1.1.0 - '@types/node': 20.12.7 - axios: 1.6.8 + '@types/node': 20.17.12 + axios: 1.7.9 eventemitter3: 3.1.2 - form-data: 2.5.1 + form-data: 2.5.2 is-electron: 2.2.2 is-stream: 1.1.0 p-queue: 6.6.2 @@ -12865,315 +11896,182 @@ snapshots: '@smithy/abort-controller@1.1.0': dependencies: '@smithy/types': 1.2.0 - tslib: 2.6.2 - - '@smithy/abort-controller@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/abort-controller@3.1.6': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@3.0.1': + '@smithy/abort-controller@4.0.0': dependencies: - '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/chunked-blob-reader@4.0.0': + '@smithy/chunked-blob-reader-native@4.0.0': dependencies: - tslib: 2.6.2 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 - '@smithy/config-resolver@2.2.0': + '@smithy/chunked-blob-reader@5.0.0': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/config-resolver@3.0.10': + '@smithy/config-resolver@4.0.0': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - tslib: 2.6.2 + '@smithy/node-config-provider': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.0 + tslib: 2.8.1 - '@smithy/core@1.4.2': + '@smithy/core@3.0.0': dependencies: - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.6.2 + '@smithy/middleware-serde': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-stream': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/core@2.5.1': + '@smithy/credential-provider-imds@4.0.0': dependencies: - '@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 + '@smithy/node-config-provider': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + tslib: 2.8.1 - '@smithy/credential-provider-imds@2.3.0': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - tslib: 2.6.2 - - '@smithy/credential-provider-imds@3.2.5': - dependencies: - '@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 - - '@smithy/eventstream-codec@2.2.0': - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.2.0 - tslib: 2.6.2 - - '@smithy/eventstream-codec@3.1.7': + '@smithy/eventstream-codec@4.0.0': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.6.0 - '@smithy/util-hex-encoding': 3.0.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-browser@2.2.0': - dependencies: - '@smithy/eventstream-serde-universal': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-browser@3.0.11': + '@smithy/eventstream-serde-browser@4.0.0': dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@2.2.0': + '@smithy/eventstream-serde-config-resolver@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@3.0.8': + '@smithy/eventstream-serde-node@4.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-node@2.2.0': + '@smithy/eventstream-serde-universal@4.0.0': dependencies: - '@smithy/eventstream-serde-universal': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/eventstream-codec': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-node@3.0.10': + '@smithy/fetch-http-handler@5.0.0': dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/protocol-http': 5.0.0 + '@smithy/querystring-builder': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 - '@smithy/eventstream-serde-universal@2.2.0': + '@smithy/hash-blob-browser@4.0.0': dependencies: - '@smithy/eventstream-codec': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-universal@3.0.10': - dependencies: - '@smithy/eventstream-codec': 3.1.7 - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@smithy/fetch-http-handler@2.5.0': - dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 - tslib: 2.6.2 - - '@smithy/fetch-http-handler@4.0.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 - - '@smithy/hash-blob-browser@3.1.7': - dependencies: - '@smithy/chunked-blob-reader': 4.0.0 - '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@smithy/hash-node@1.1.0': dependencies: '@smithy/types': 1.2.0 '@smithy/util-buffer-from': 1.1.0 '@smithy/util-utf8': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/hash-node@2.2.0': + '@smithy/hash-node@4.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@smithy/hash-node@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/hash-stream-node@3.1.7': + '@smithy/hash-stream-node@4.0.0': dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/invalid-dependency@2.2.0': + '@smithy/invalid-dependency@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/invalid-dependency@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@smithy/is-array-buffer@1.1.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: - tslib: 2.6.2 - - '@smithy/is-array-buffer@3.0.0': - dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/md5-js@2.2.0': + '@smithy/is-array-buffer@4.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@smithy/md5-js@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - - '@smithy/middleware-content-length@2.2.0': - dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/middleware-content-length@3.0.10': - dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/middleware-endpoint@2.5.1': + '@smithy/md5-js@4.0.0': dependencies: - '@smithy/middleware-serde': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-middleware': 2.2.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.1': + '@smithy/middleware-content-length@4.0.0': dependencies: - '@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 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/middleware-retry@2.3.1': + '@smithy/middleware-endpoint@4.0.0': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/service-error-classification': 2.1.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - tslib: 2.6.2 - uuid: 9.0.1 + '@smithy/core': 3.0.0 + '@smithy/middleware-serde': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/url-parser': 4.0.0 + '@smithy/util-middleware': 4.0.0 + tslib: 2.8.1 - '@smithy/middleware-retry@3.0.25': + '@smithy/middleware-retry@4.0.0': dependencies: - '@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 + '@smithy/node-config-provider': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/service-error-classification': 4.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-retry': 4.0.0 + tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@2.3.0': + '@smithy/middleware-serde@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/middleware-serde@3.0.8': + '@smithy/middleware-stack@4.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/middleware-stack@2.2.0': + '@smithy/node-config-provider@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/middleware-stack@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@smithy/node-config-provider@2.3.0': - dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/node-config-provider@3.1.9': - dependencies: - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/property-provider': 4.0.0 + '@smithy/shared-ini-file-loader': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@smithy/node-http-handler@1.1.0': dependencies: @@ -13181,368 +12079,229 @@ snapshots: '@smithy/protocol-http': 1.2.0 '@smithy/querystring-builder': 1.1.0 '@smithy/types': 1.2.0 - tslib: 2.6.2 - - '@smithy/node-http-handler@2.5.0': - dependencies: - '@smithy/abort-controller': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/node-http-handler@3.2.5': + '@smithy/node-http-handler@4.0.0': dependencies: - '@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 + '@smithy/abort-controller': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/querystring-builder': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/property-provider@2.2.0': + '@smithy/property-provider@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/property-provider@3.1.8': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@smithy/protocol-http@1.2.0': dependencies: '@smithy/types': 1.2.0 - tslib: 2.6.2 - - '@smithy/protocol-http@3.3.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/protocol-http@4.1.5': + '@smithy/protocol-http@5.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@smithy/querystring-builder@1.1.0': dependencies: '@smithy/types': 1.2.0 '@smithy/util-uri-escape': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/querystring-builder@2.2.0': + '@smithy/querystring-builder@4.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-uri-escape': 2.2.0 - tslib: 2.6.2 - - '@smithy/querystring-builder@3.0.8': - dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 '@smithy/querystring-parser@1.1.0': dependencies: '@smithy/types': 1.2.0 - tslib: 2.6.2 - - '@smithy/querystring-parser@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/querystring-parser@3.0.8': + '@smithy/querystring-parser@4.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/service-error-classification@2.1.5': + '@smithy/service-error-classification@4.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 4.0.0 - '@smithy/service-error-classification@3.0.8': + '@smithy/shared-ini-file-loader@4.0.0': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/shared-ini-file-loader@2.4.0': + '@smithy/signature-v4@5.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.0 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/shared-ini-file-loader@3.1.9': + '@smithy/smithy-client@4.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 - - '@smithy/signature-v4@2.3.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-uri-escape': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@smithy/signature-v4@4.2.1': - 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 - - '@smithy/smithy-client@2.5.1': - dependencies: - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-stack': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 - tslib: 2.6.2 - - '@smithy/smithy-client@3.4.2': - dependencies: - '@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 + '@smithy/core': 3.0.0 + '@smithy/middleware-endpoint': 4.0.0 + '@smithy/middleware-stack': 4.0.0 + '@smithy/protocol-http': 5.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-stream': 4.0.0 + tslib: 2.8.1 '@smithy/types@1.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/types@2.12.0': + '@smithy/types@4.0.0': dependencies: - tslib: 2.6.2 - - '@smithy/types@3.6.0': - dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/url-parser@1.1.0': dependencies: '@smithy/querystring-parser': 1.1.0 '@smithy/types': 1.2.0 - tslib: 2.6.2 - - '@smithy/url-parser@2.2.0': - dependencies: - '@smithy/querystring-parser': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/url-parser@3.0.8': + '@smithy/url-parser@4.0.0': dependencies: - '@smithy/querystring-parser': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/querystring-parser': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/util-base64@2.3.0': + '@smithy/util-base64@4.0.0': dependencies: - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - - '@smithy/util-base64@3.0.0': - dependencies: - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - - '@smithy/util-body-length-browser@2.2.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-body-length-browser@3.0.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-body-length-node@2.3.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-body-length-node@3.0.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-buffer-from@1.1.0': - dependencies: - '@smithy/is-array-buffer': 1.1.0 - tslib: 2.6.2 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.6.2 - - '@smithy/util-buffer-from@3.0.0': - dependencies: - '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 - - '@smithy/util-config-provider@2.3.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-config-provider@3.0.0': - dependencies: - tslib: 2.6.2 - - '@smithy/util-defaults-mode-browser@2.2.1': - dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - bowser: 2.11.0 - tslib: 2.6.2 - - '@smithy/util-defaults-mode-browser@3.0.25': - dependencies: - '@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 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/util-defaults-mode-node@2.3.1': + '@smithy/util-body-length-browser@4.0.0': dependencies: - '@smithy/config-resolver': 2.2.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.25': + '@smithy/util-body-length-node@4.0.0': dependencies: - '@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 + tslib: 2.8.1 - '@smithy/util-endpoints@1.2.0': + '@smithy/util-buffer-from@1.1.0': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/is-array-buffer': 1.1.0 + tslib: 2.8.1 - '@smithy/util-endpoints@2.1.4': + '@smithy/util-buffer-from@2.2.0': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 - '@smithy/util-hex-encoding@2.2.0': + '@smithy/util-buffer-from@4.0.0': dependencies: - tslib: 2.6.2 + '@smithy/is-array-buffer': 4.0.0 + tslib: 2.8.1 - '@smithy/util-hex-encoding@3.0.0': + '@smithy/util-config-provider@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/util-middleware@2.2.0': + '@smithy/util-defaults-mode-browser@4.0.0': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/property-provider': 4.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + bowser: 2.11.0 + tslib: 2.8.1 - '@smithy/util-middleware@3.0.8': + '@smithy/util-defaults-mode-node@4.0.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/config-resolver': 4.0.0 + '@smithy/credential-provider-imds': 4.0.0 + '@smithy/node-config-provider': 4.0.0 + '@smithy/property-provider': 4.0.0 + '@smithy/smithy-client': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/util-retry@2.2.0': + '@smithy/util-endpoints@3.0.0': dependencies: - '@smithy/service-error-classification': 2.1.5 - '@smithy/types': 2.12.0 - tslib: 2.6.2 + '@smithy/node-config-provider': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/util-retry@3.0.8': + '@smithy/util-hex-encoding@4.0.0': dependencies: - '@smithy/service-error-classification': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/util-stream@2.2.0': + '@smithy/util-middleware@4.0.0': dependencies: - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-hex-encoding': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/util-stream@3.2.1': + '@smithy/util-retry@4.0.0': dependencies: - '@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 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + '@smithy/service-error-classification': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 - '@smithy/util-uri-escape@1.1.0': + '@smithy/util-stream@4.0.0': dependencies: - tslib: 2.6.2 + '@smithy/fetch-http-handler': 5.0.0 + '@smithy/node-http-handler': 4.0.0 + '@smithy/types': 4.0.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@smithy/util-uri-escape@2.2.0': + '@smithy/util-uri-escape@1.1.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/util-uri-escape@3.0.0': + '@smithy/util-uri-escape@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-utf8@1.1.0': dependencies: '@smithy/util-buffer-from': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/util-utf8@3.0.0': + '@smithy/util-utf8@4.0.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 + '@smithy/util-buffer-from': 4.0.0 + tslib: 2.8.1 - '@smithy/util-waiter@3.1.7': + '@smithy/util-waiter@4.0.0': dependencies: - '@smithy/abort-controller': 3.1.6 - '@smithy/types': 3.6.0 - tslib: 2.6.2 + '@smithy/abort-controller': 4.0.0 + '@smithy/types': 4.0.0 + tslib: 2.8.1 '@socket.io/component-emitter@3.1.2': {} '@superfaceai/ast@1.2.0': dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) - '@superfaceai/one-sdk@1.5.2(encoding@0.1.13)': + '@superfaceai/one-sdk@1.5.2': dependencies: '@superfaceai/ast': 1.2.0 '@superfaceai/parser': 1.2.0 abort-controller: 3.0.0 - cross-fetch: 3.1.8(encoding@0.1.13) - debug: 4.3.4(supports-color@5.5.0) + cross-fetch: 3.2.0 + debug: 4.4.0(supports-color@5.5.0) isomorphic-form-data: 2.0.0 vm2: 3.9.19 transitivePeerDependencies: @@ -13553,7 +12312,7 @@ snapshots: dependencies: '@superfaceai/ast': 1.2.0 '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -13562,58 +12321,58 @@ snapshots: dependencies: passport-oauth2: 1.8.0 optionalDependencies: - '@types/passport': 1.0.16 - '@types/passport-oauth2': 1.4.15 + '@types/passport': 1.0.17 + '@types/passport-oauth2': 1.4.17 - '@swc/core-darwin-arm64@1.4.17': + '@swc/core-darwin-arm64@1.10.4': optional: true - '@swc/core-darwin-x64@1.4.17': + '@swc/core-darwin-x64@1.10.4': optional: true - '@swc/core-linux-arm-gnueabihf@1.4.17': + '@swc/core-linux-arm-gnueabihf@1.10.4': optional: true - '@swc/core-linux-arm64-gnu@1.4.17': + '@swc/core-linux-arm64-gnu@1.10.4': optional: true - '@swc/core-linux-arm64-musl@1.4.17': + '@swc/core-linux-arm64-musl@1.10.4': optional: true - '@swc/core-linux-x64-gnu@1.4.17': + '@swc/core-linux-x64-gnu@1.10.4': optional: true - '@swc/core-linux-x64-musl@1.4.17': + '@swc/core-linux-x64-musl@1.10.4': optional: true - '@swc/core-win32-arm64-msvc@1.4.17': + '@swc/core-win32-arm64-msvc@1.10.4': optional: true - '@swc/core-win32-ia32-msvc@1.4.17': + '@swc/core-win32-ia32-msvc@1.10.4': optional: true - '@swc/core-win32-x64-msvc@1.4.17': + '@swc/core-win32-x64-msvc@1.10.4': optional: true - '@swc/core@1.4.17': + '@swc/core@1.10.4': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.6 + '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.17 - '@swc/core-darwin-x64': 1.4.17 - '@swc/core-linux-arm-gnueabihf': 1.4.17 - '@swc/core-linux-arm64-gnu': 1.4.17 - '@swc/core-linux-arm64-musl': 1.4.17 - '@swc/core-linux-x64-gnu': 1.4.17 - '@swc/core-linux-x64-musl': 1.4.17 - '@swc/core-win32-arm64-msvc': 1.4.17 - '@swc/core-win32-ia32-msvc': 1.4.17 - '@swc/core-win32-x64-msvc': 1.4.17 + '@swc/core-darwin-arm64': 1.10.4 + '@swc/core-darwin-x64': 1.10.4 + '@swc/core-linux-arm-gnueabihf': 1.10.4 + '@swc/core-linux-arm64-gnu': 1.10.4 + '@swc/core-linux-arm64-musl': 1.10.4 + '@swc/core-linux-x64-gnu': 1.10.4 + '@swc/core-linux-x64-musl': 1.10.4 + '@swc/core-win32-arm64-msvc': 1.10.4 + '@swc/core-win32-ia32-msvc': 1.10.4 + '@swc/core-win32-x64-msvc': 1.10.4 '@swc/counter@0.1.3': {} - '@swc/types@0.1.6': + '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 @@ -13626,83 +12385,83 @@ snapshots: asn1.js: 5.4.1 asn1.js-rfc2560: 5.0.1(asn1.js@5.4.1) asn1.js-rfc5280: 3.0.0 - async: 3.2.5 + async: 3.2.6 simple-lru-cache: 0.0.2 - '@temporalio/activity@1.11.1': + '@temporalio/activity@1.11.5': dependencies: - '@temporalio/common': 1.11.1 + '@temporalio/common': 1.11.5 abort-controller: 3.0.0 - '@temporalio/client@1.11.1': + '@temporalio/client@1.11.5': dependencies: - '@grpc/grpc-js': 1.11.3 - '@temporalio/common': 1.11.1 - '@temporalio/proto': 1.11.1 + '@grpc/grpc-js': 1.12.5 + '@temporalio/common': 1.11.5 + '@temporalio/proto': 1.11.5 abort-controller: 3.0.0 long: 5.2.3 uuid: 9.0.1 - '@temporalio/common@1.11.1': + '@temporalio/common@1.11.5': dependencies: - '@temporalio/proto': 1.11.1 + '@temporalio/proto': 1.11.5 long: 5.2.3 ms: 3.0.0-canary.1 proto3-json-serializer: 2.0.2 - '@temporalio/core-bridge@1.11.1': + '@temporalio/core-bridge@1.11.5': dependencies: - '@temporalio/common': 1.11.1 + '@temporalio/common': 1.11.5 arg: 5.0.2 - cargo-cp-artifact: 0.1.8 + cargo-cp-artifact: 0.1.9 which: 4.0.0 - '@temporalio/proto@1.11.1': + '@temporalio/proto@1.11.5': dependencies: long: 5.2.3 - protobufjs: 7.2.6 + protobufjs: 7.4.0 - '@temporalio/worker@1.11.1': + '@temporalio/worker@1.11.5': dependencies: - '@swc/core': 1.4.17 - '@temporalio/activity': 1.11.1 - '@temporalio/client': 1.11.1 - '@temporalio/common': 1.11.1 - '@temporalio/core-bridge': 1.11.1 - '@temporalio/proto': 1.11.1 - '@temporalio/workflow': 1.11.1 + '@swc/core': 1.10.4 + '@temporalio/activity': 1.11.5 + '@temporalio/client': 1.11.5 + '@temporalio/common': 1.11.5 + '@temporalio/core-bridge': 1.11.5 + '@temporalio/proto': 1.11.5 + '@temporalio/workflow': 1.11.5 abort-controller: 3.0.0 - heap-js: 2.5.0 - memfs: 4.11.1 + heap-js: 2.6.0 + memfs: 4.15.3 rxjs: 7.8.1 source-map: 0.7.4 - source-map-loader: 4.0.2(webpack@5.91.0(@swc/core@1.4.17)) + source-map-loader: 4.0.2(webpack@5.97.1) supports-color: 8.1.1 - swc-loader: 0.2.6(@swc/core@1.4.17)(webpack@5.91.0(@swc/core@1.4.17)) + swc-loader: 0.2.6(@swc/core@1.10.4)(webpack@5.97.1) unionfs: 4.5.4 - webpack: 5.91.0(@swc/core@1.4.17) + webpack: 5.97.1(@swc/core@1.10.4) transitivePeerDependencies: - '@swc/helpers' - esbuild - uglify-js - webpack-cli - '@temporalio/workflow@1.11.1': + '@temporalio/workflow@1.11.5': dependencies: - '@temporalio/common': 1.11.1 - '@temporalio/proto': 1.11.1 + '@temporalio/common': 1.11.5 + '@temporalio/proto': 1.11.5 '@tootallnate/once@2.0.0': {} - '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.3)': + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.4.2)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.24.4 + '@babel/parser': 7.26.3 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 lodash: 4.17.21 - prettier: 3.3.3 + prettier: 3.4.2 transitivePeerDependencies: - supports-color @@ -13716,47 +12475,47 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.26.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.26.3 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/btoa-lite@1.0.2': {} '@types/bunyan-format@0.2.9': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/bunyan@1.8.11': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/caseless@0.12.5': {} - '@types/config@3.3.4': {} + '@types/config@3.3.5': {} '@types/connect@3.4.38': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/cookie@0.4.1': {} @@ -13764,9 +12523,9 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 - '@types/cron@2.4.0': + '@types/cron@2.4.3': dependencies: cron: 2.4.4 @@ -13776,33 +12535,33 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.56.10 - '@types/estree': 1.0.5 + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 - '@types/eslint@8.56.10': + '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} - '@types/express-serve-static-core@4.19.0': + '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.12.7 - '@types/qs': 6.9.15 + '@types/node': 20.17.12 + '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.17 '@types/serve-static': 1.15.7 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/he@1.2.3': {} @@ -13812,7 +12571,7 @@ snapshots: '@types/is-stream@1.1.0': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/istanbul-lib-coverage@2.0.6': {} @@ -13824,7 +12583,7 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.12': + '@types/jest@29.5.14': dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -13833,13 +12592,13 @@ snapshots: '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.6': + '@types/jsonwebtoken@9.0.7': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/keyv@3.1.4': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/lru-cache@5.1.1': {} @@ -13851,54 +12610,54 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.12.7 - form-data: 4.0.0 + '@types/node': 20.17.12 + form-data: 4.0.1 '@types/node@18.0.6': {} - '@types/node@18.19.31': + '@types/node@18.19.70': dependencies: undici-types: 5.26.5 - '@types/node@20.12.7': + '@types/node@20.17.12': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 - '@types/oauth@0.9.4': + '@types/oauth@0.9.6': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 optional: true - '@types/passport-oauth2@1.4.15': + '@types/passport-oauth2@1.4.17': dependencies: '@types/express': 4.17.21 - '@types/oauth': 0.9.4 - '@types/passport': 1.0.16 + '@types/oauth': 0.9.6 + '@types/passport': 1.0.17 optional: true - '@types/passport@1.0.16': + '@types/passport@1.0.17': dependencies: '@types/express': 4.17.21 optional: true - '@types/qs@6.9.15': {} + '@types/qs@6.9.17': {} '@types/range-parser@1.2.7': {} '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/tough-cookie': 4.0.5 - form-data: 2.5.1 + form-data: 2.5.2 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/retry@0.12.0': {} - '@types/sanitize-html@2.11.0': + '@types/sanitize-html@2.13.0': dependencies: htmlparser2: 8.0.2 @@ -13907,12 +12666,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -13920,7 +12679,7 @@ snapshots: '@types/superagent@4.1.24': dependencies: '@types/cookiejar': 2.1.5 - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/tough-cookie@4.0.5': {} @@ -13928,83 +12687,79 @@ snapshots: '@types/tunnel@0.0.3': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/uuid@9.0.8': {} - '@types/validator@13.11.9': {} + '@types/validator@13.12.2': {} - '@types/ws@8.5.9': + '@types/ws@8.5.13': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.32': + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.6.3 + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -14018,27 +12773,25 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.6.3) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -14046,60 +12799,58 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) + eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) - eslint: 8.57.0 - semver: 7.6.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) + eslint: 8.57.1 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -14114,86 +12865,86 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.2.1': {} - '@vercel/ncc@0.38.1': {} + '@vercel/ncc@0.38.3': {} - '@vladfrangu/async_event_emitter@2.2.4': {} + '@vladfrangu/async_event_emitter@2.4.6': {} - '@webassemblyjs/ast@1.12.1': + '@webassemblyjs/ast@1.14.1': dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - '@webassemblyjs/helper-api-error@1.11.6': {} + '@webassemblyjs/helper-api-error@1.13.2': {} - '@webassemblyjs/helper-buffer@1.12.1': {} + '@webassemblyjs/helper-buffer@1.14.1': {} - '@webassemblyjs/helper-numbers@1.11.6': + '@webassemblyjs/helper-numbers@1.13.2': dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - '@webassemblyjs/helper-wasm-section@1.12.1': + '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/ieee754@1.11.6': + '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/leb128@1.11.6': + '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} + '@webassemblyjs/utf8@1.13.2': {} - '@webassemblyjs/wasm-edit@1.12.1': + '@webassemblyjs/wasm-edit@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 - '@webassemblyjs/wasm-gen@1.12.1': + '@webassemblyjs/wasm-gen@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wasm-opt@1.12.1': + '@webassemblyjs/wasm-opt@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wasm-parser@1.12.1': + '@webassemblyjs/wasm-parser@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wast-printer@1.12.1': + '@webassemblyjs/wast-printer@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 '@xtuc/ieee754@1.2.0': {} @@ -14213,46 +12964,45 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-assertions@1.9.0(acorn@8.11.3): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 8.11.3 + acorn: 8.14.0 - acorn-import-attributes@1.9.5(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.11.3 + acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-walk@8.3.4: dependencies: - acorn: 8.11.3 - - acorn-walk@8.3.2: {} + acorn: 8.14.0 - acorn@8.11.3: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: - debug: 4.3.7 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} - ajv-draft-04@1.0.0(ajv@8.12.0): - optionalDependencies: - ajv: 8.12.0 + ajv-draft-04@1.0.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: - ajv: 8.12.0 + ajv-formats@2.1.1(ajv@8.17.1): + dependencies: + ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -14260,12 +13010,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 analytics-node@6.2.0: dependencies: @@ -14296,7 +13046,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -14342,57 +13092,56 @@ snapshots: array-back@4.0.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-flatten@1.1.1: {} array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + get-intrinsic: 1.2.7 + is-string: 1.1.1 array-union@2.1.0: {} array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 arrify@2.0.1: {} @@ -14414,19 +13163,20 @@ snapshots: minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 - assert-options@0.8.1: {} + assert-options@0.8.2: {} async-retry@1.3.3: dependencies: retry: 0.13.1 - async@3.2.5: {} + async@3.2.6: {} asynckit@0.4.0: {} - auth0@4.3.1: + auth0@4.15.0: dependencies: - jose: 4.15.5 + jose: 4.15.9 + undici-types: 6.21.0 uuid: 9.0.1 available-typed-arrays@1.0.7: @@ -14445,7 +13195,7 @@ snapshots: uuid: 3.3.2 xml2js: 0.4.19 - aws4@1.12.0: {} + aws4@1.13.2: {} axios-retry@3.2.0: dependencies: @@ -14453,40 +13203,48 @@ snapshots: axios@0.26.1: dependencies: - follow-redirects: 1.15.6 + follow-redirects: 1.15.9 transitivePeerDependencies: - debug axios@0.27.2: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 transitivePeerDependencies: - debug axios@1.5.1: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug axios@1.6.8: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.24.4): + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.26.0 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.4) + babel-preset-jest: 29.6.3(@babel/core@7.26.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -14495,7 +13253,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -14505,56 +13263,59 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.4): + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) - core-js-compat: 3.37.0 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.4): + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4): - dependencies: - '@babel/core': 7.24.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - - babel-preset-jest@29.6.3(@babel/core@7.24.4): - dependencies: - '@babel/core': 7.24.4 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) balanced-match@1.0.2: {} @@ -14631,6 +13392,23 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} bowser@2.11.0: {} @@ -14666,18 +13444,18 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 browser-request@0.3.3: {} - browserslist@4.23.0: + browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001614 - electron-to-chromium: 1.4.750 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.78 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) bs-logger@0.2.6: dependencies: @@ -14704,9 +13482,9 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.8: + bufferutil@4.0.9: dependencies: - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.4 bunyan-format@0.2.1: dependencies: @@ -14741,14 +13519,23 @@ snapshots: normalize-url: 4.5.1 responselike: 1.0.2 - call-bind@1.0.7: + call-bind-apply-helpers@1.0.1: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + call-me-maybe@1.0.2: {} callsites@3.1.0: {} @@ -14759,9 +13546,9 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001614: {} + caniuse-lite@1.0.30001690: {} - cargo-cp-artifact@0.1.8: {} + cargo-cp-artifact@0.1.9: {} chalk@2.4.2: dependencies: @@ -14786,7 +13573,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -14797,13 +13584,13 @@ snapshots: chownr@1.1.4: {} - chrome-trace-event@1.0.3: {} + chrome-trace-event@1.0.4: {} ci-info@2.0.0: {} ci-info@3.9.0: {} - cjs-module-lexer@1.3.1: {} + cjs-module-lexer@1.4.1: {} clearbit@1.3.5: dependencies: @@ -14820,8 +13607,8 @@ snapshots: d: 1.0.2 es5-ext: 0.10.64 es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 + memoizee: 0.4.17 + timers-ext: 0.1.8 cli-cursor@3.1.0: dependencies: @@ -14941,7 +13728,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.53.0 concat-map@0.0.1: {} @@ -14957,7 +13744,7 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - config@3.3.11: + config@3.3.12: dependencies: json5: 2.2.3 @@ -14990,10 +13777,10 @@ snapshots: cookie@0.4.0: {} - cookie@0.4.2: {} - cookie@0.5.0: {} + cookie@0.7.2: {} + cookiejar@2.1.4: {} copy-anything@3.0.5: @@ -15010,9 +13797,9 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.37.0: + core-js-compat@3.39.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.24.3 core-util-is@1.0.3: {} @@ -15023,13 +13810,13 @@ snapshots: create-error@0.3.1: {} - create-jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@18.0.6): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@18.0.6) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -15049,11 +13836,11 @@ snapshots: cross-env@7.0.2: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 - cross-fetch@3.1.8(encoding@0.1.13): + cross-fetch@3.2.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -15063,7 +13850,7 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -15084,73 +13871,72 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-what@6.1.0: {} - csv-parse@5.5.6: {} + csv-parse@5.6.0: {} d@1.0.2: dependencies: es5-ext: 0.10.64 - type: 2.7.2 + type: 2.7.3 - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 date-and-time@0.14.2: {} - dc-polyfill@0.1.4: {} + dc-polyfill@0.1.6: {} - dd-trace@4.38.0: + dd-trace@4.54.0: dependencies: - '@datadog/native-appsec': 7.1.1 - '@datadog/native-iast-rewriter': 2.3.1 - '@datadog/native-iast-taint-tracking': 2.1.0 - '@datadog/native-metrics': 2.0.0 - '@datadog/pprof': 5.3.0 + '@datadog/libdatadog': 0.3.0 + '@datadog/native-appsec': 8.3.0 + '@datadog/native-iast-rewriter': 2.6.1 + '@datadog/native-iast-taint-tracking': 3.2.0 + '@datadog/native-metrics': 3.1.0 + '@datadog/pprof': 5.4.1 '@datadog/sketches-js': 2.1.1 - '@opentelemetry/api': 1.6.0 - '@opentelemetry/core': 1.24.0(@opentelemetry/api@1.6.0) + '@isaacs/ttlcache': 1.4.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.30.0(@opentelemetry/api@1.8.0) crypto-randomuuid: 1.0.0 - dc-polyfill: 0.1.4 - ignore: 5.3.1 - import-in-the-middle: 1.8.1 - int64-buffer: 0.1.10 - ipaddr.js: 2.2.0 + dc-polyfill: 0.1.6 + ignore: 5.3.2 + import-in-the-middle: 1.11.2 istanbul-lib-coverage: 3.2.0 jest-docblock: 29.7.0 koalas: 1.0.2 limiter: 1.1.5 lodash.sortby: 4.7.0 lru-cache: 7.18.3 - methods: 1.1.2 module-details-from-path: 1.0.3 - msgpack-lite: 0.1.26 - node-abort-controller: 3.1.1 opentracing: 0.14.7 - path-to-regexp: 0.1.8 + path-to-regexp: 0.1.12 pprof-format: 2.1.0 - protobufjs: 7.2.6 + protobufjs: 7.4.0 retry: 0.13.1 - semver: 7.6.0 - shell-quote: 1.8.1 + rfdc: 1.4.1 + semver: 7.6.3 + shell-quote: 1.8.2 + source-map: 0.7.4 tlhunter-sorted-set: 0.1.0 debug@2.6.9: @@ -15160,18 +13946,16 @@ snapshots: debug@3.2.7(supports-color@5.5.0): dependencies: ms: 2.1.3 - optionalDependencies: supports-color: 5.5.0 - debug@4.3.4(supports-color@5.5.0): + debug@4.3.7: dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 5.5.0 + ms: 2.1.3 - debug@4.3.7: + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 + supports-color: 5.5.0 decamelize@1.2.0: {} @@ -15197,9 +13981,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-lazy-prop@2.0.0: {} @@ -15244,24 +14028,22 @@ snapshots: discontinuous-range@1.0.0: {} - discord-api-types@0.37.61: {} + discord-api-types@0.37.115: {} - discord.js@14.14.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + discord.js@14.17.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@discordjs/builders': 1.7.0 + '@discordjs/builders': 1.10.0 '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.3.3 - '@discordjs/rest': 2.2.0 - '@discordjs/util': 1.0.2 - '@discordjs/ws': 1.0.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@sapphire/snowflake': 3.5.1 - '@types/ws': 8.5.9 - discord-api-types: 0.37.61 + '@discordjs/formatters': 0.6.0 + '@discordjs/rest': 2.4.2 + '@discordjs/util': 1.1.1 + '@discordjs/ws': 1.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.37.115 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 - tslib: 2.6.2 - undici: 5.27.2 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + tslib: 2.8.1 + undici: 6.19.8 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -15302,7 +14084,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -15320,9 +14102,15 @@ snapshots: dtrace-provider@0.8.8: dependencies: - nan: 2.19.0 + nan: 2.22.0 optional: true + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer3@0.1.5: {} duplexify@3.7.1: @@ -15352,11 +14140,15 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.6.0 + semver: 7.6.3 ee-first@1.1.1: {} - electron-to-chromium@1.4.750: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.78: {} emittery@0.13.1: {} @@ -15397,35 +14189,30 @@ snapshots: encodeurl@1.0.2: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - end-of-stream@1.4.4: dependencies: once: 1.4.0 - engine.io-parser@5.2.2: {} + engine.io-parser@5.2.3: {} - engine.io@6.5.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + engine.io@6.6.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.12.7 + '@types/node': 20.17.12 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.4(supports-color@5.5.0) - engine.io-parser: 5.2.2 - ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.16.0: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -15435,7 +14222,12 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - ent@2.2.0: {} + ent@2.2.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + punycode: 1.4.1 + safe-regex-test: 1.1.0 entities@2.2.0: {} @@ -15444,76 +14236,80 @@ snapshots: erlpack@0.1.4: dependencies: bindings: 1.5.0 - nan: 2.19.0 + nan: 2.22.0 error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.5.2: {} + es-module-lexer@1.6.0: {} es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -15521,11 +14317,11 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es5-ext@0.10.64: dependencies: @@ -15554,33 +14350,34 @@ snapshots: es6-iterator: 2.0.3 es6-symbol: 3.1.4 - esbuild@0.19.12: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - escalade@3.1.2: {} + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} escape-goat@2.1.1: {} @@ -15592,95 +14389,91 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0))(eslint@8.57.0): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) - object.assign: 4.1.5 + eslint: 8.57.1 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + object.assign: 4.1.7 object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-typescript@16.2.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0))(eslint@8.57.0): + eslint-config-airbnb-typescript@16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) + eslint: 8.57.1 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) - eslint-config-prettier@8.10.0(eslint@8.57.0): + eslint-config-prettier@8.10.0(eslint@8.57.1): dependencies: - eslint: 8.57.0 + eslint: 8.57.1 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@8.57.1): dependencies: - eslint: 8.57.0 + eslint: 8.57.1 eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7(supports-color@5.5.0) - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) debug: 3.2.7(supports-color@5.5.0) - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) - eslint: 8.57.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1): dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2): dependencies: - eslint: 8.57.0 - prettier: 3.2.5 + eslint: 8.57.1 + eslint-config-prettier: 8.10.0(eslint@8.57.1) + prettier: 3.4.2 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - optionalDependencies: - '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@8.57.0) + synckit: 0.9.2 - eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2): dependencies: - eslint: 8.57.0 - prettier: 3.3.3 + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 - optionalDependencies: - '@types/eslint': 8.56.10 - eslint-config-prettier: 8.10.0(eslint@8.57.0) eslint-scope@5.1.1: dependencies: @@ -15694,26 +14487,26 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.1 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@5.5.0) + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -15721,7 +14514,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -15742,17 +14535,17 @@ snapshots: d: 1.0.2 es5-ext: 0.10.64 event-emitter: 0.3.5 - type: 2.7.2 + type: 2.7.3 espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -15773,8 +14566,6 @@ snapshots: d: 1.0.2 es5-ext: 0.10.64 - event-lite@0.1.3: {} - event-target-shim@5.0.1: {} eventemitter3@3.1.2: {} @@ -15797,7 +14588,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -15898,7 +14689,7 @@ snapshots: ext@1.7.0: dependencies: - type: 2.7.2 + type: 2.7.3 extend-shallow@2.0.1: dependencies: @@ -15906,17 +14697,19 @@ snapshots: extend@3.0.2: {} + fast-content-type-parse@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -15930,21 +14723,19 @@ snapshots: fast-text-encoding@1.0.6: {} - fast-xml-parser@4.2.5: - dependencies: - strnum: 1.0.5 + fast-uri@3.0.5: {} fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 - fast-xml-parser@4.5.0: + fast-xml-parser@4.5.1: dependencies: strnum: 1.0.5 fastest-levenshtein@1.0.16: {} - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -15960,7 +14751,11 @@ snapshots: file-uri-to-path@1.0.0: {} - fill-range@7.0.1: + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -16008,32 +14803,33 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.1: {} + flatted@3.3.2: {} fn.name@1.1.0: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@2.5.1: + form-data@2.5.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + safe-buffer: 5.2.1 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -16050,7 +14846,7 @@ snapshots: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.12.1 + qs: 6.13.1 forwarded@0.2.0: {} @@ -16066,7 +14862,7 @@ snapshots: dependencies: minipass: 2.9.0 - fs-monkey@1.0.5: {} + fs-monkey@1.0.6: {} fs.realpath@1.0.0: {} @@ -16075,12 +14871,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -16095,63 +14893,63 @@ snapshots: strip-ansi: 3.0.1 wide-align: 1.1.5 - gaxios@3.2.0(encoding@0.1.13): + gaxios@3.2.0: dependencies: abort-controller: 3.0.0 extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - supports-color - gaxios@4.3.3(encoding@0.1.13): + gaxios@4.3.3: dependencies: abort-controller: 3.0.0 extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - supports-color - gaxios@6.7.1(encoding@0.1.13): + gaxios@6.7.1: dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.6 is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@4.3.1(encoding@0.1.13): + gcp-metadata@4.3.1: dependencies: - gaxios: 4.3.3(encoding@0.1.13) + gaxios: 4.3.3 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@6.1.0(encoding@0.1.13): + gcp-metadata@6.1.0: dependencies: - gaxios: 6.7.1(encoding@0.1.13) + gaxios: 6.7.1 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - gcs-resumable-upload@3.6.0(encoding@0.1.13): + gcs-resumable-upload@3.6.0: dependencies: abort-controller: 3.0.0 async-retry: 1.3.3 configstore: 5.0.1 extend: 3.0.2 - gaxios: 4.3.3(encoding@0.1.13) - google-auth-library: 7.14.1(encoding@0.1.13) + gaxios: 4.3.3 + google-auth-library: 7.14.1 pumpify: 2.0.1 stream-events: 1.0.5 transitivePeerDependencies: @@ -16166,35 +14964,45 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: + get-intrinsic@1.2.7: dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 get-package-type@0.1.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + get-stream@3.0.0: {} get-stream@4.1.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 get-stream@6.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 - get-tsconfig@4.7.3: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -16208,13 +15016,14 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.12: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.2 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 glob@6.0.4: dependencies: @@ -16247,41 +15056,42 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - google-auth-library@7.14.1(encoding@0.1.13): + google-auth-library@7.14.1: dependencies: arrify: 2.0.1 base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 fast-text-encoding: 1.0.6 - gaxios: 4.3.3(encoding@0.1.13) - gcp-metadata: 4.3.1(encoding@0.1.13) - gtoken: 5.3.2(encoding@0.1.13) + gaxios: 4.3.3 + gcp-metadata: 4.3.1 + gtoken: 5.3.2 jws: 4.0.0 lru-cache: 6.0.0 transitivePeerDependencies: - encoding - supports-color - google-auth-library@9.14.2(encoding@0.1.13): + google-auth-library@9.15.0: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1(encoding@0.1.13) - gcp-metadata: 6.1.0(encoding@0.1.13) - gtoken: 7.1.0(encoding@0.1.13) + gaxios: 6.7.1 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -16291,9 +15101,7 @@ snapshots: dependencies: node-forge: 1.3.1 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} got@9.6.0: dependencies: @@ -16324,24 +15132,24 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - gtoken@5.3.2(encoding@0.1.13): + gtoken@5.3.2: dependencies: - gaxios: 4.3.3(encoding@0.1.13) + gaxios: 4.3.3 google-p12-pem: 3.1.4 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - gtoken@7.1.0(encoding@0.1.13): + gtoken@7.1.0: dependencies: - gaxios: 6.7.1(encoding@0.1.13) + gaxios: 6.7.1 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -16349,15 +15157,17 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} @@ -16371,7 +15181,7 @@ snapshots: he@1.2.0: {} - heap-js@2.5.0: {} + heap-js@2.6.0: {} helmet@4.1.1: {} @@ -16423,7 +15233,7 @@ snapshots: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 entities: 4.5.0 http-cache-semantics@4.1.1: {} @@ -16456,7 +15266,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16465,14 +15275,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.4: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 - debug: 4.3.7 + agent-base: 7.1.3 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16498,23 +15308,23 @@ snapshots: dependencies: minimatch: 3.1.2 - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.8.1: + import-in-the-middle@1.11.2: dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) - cjs-module-lexer: 1.3.1 + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 import-lazy@2.1.0: {} - import-local@3.1.0: + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 @@ -16538,40 +15348,44 @@ snapshots: ini@2.0.0: {} - int64-buffer@0.1.10: {} - - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 invert-kv@1.0.0: {} ipaddr.js@1.9.1: {} - ipaddr.js@2.2.0: {} - - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-bigint@1.0.4: + is-async-function@2.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} @@ -16582,16 +15396,19 @@ snapshots: dependencies: ci-info: 2.0.0 - is-core-module@2.13.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-docker@2.2.1: {} @@ -16602,6 +15419,10 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 @@ -16612,6 +15433,13 @@ snapshots: is-generator-fn@2.1.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -16628,14 +15456,15 @@ snapshots: is-interactive@1.0.0: {} - is-negative-zero@2.0.3: {} + is-map@2.0.3: {} is-npm@4.0.0: {} is-npm@5.0.0: {} - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -16648,40 +15477,54 @@ snapshots: is-promise@2.2.2: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-retry-allowed@1.2.0: {} - is-shared-array-buffer@1.0.3: + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 is-stream@1.1.0: {} is-stream@2.0.1: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} - is-weakref@1.0.2: + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-what@4.1.16: {} @@ -16707,7 +15550,7 @@ snapshots: isomorphic-form-data@2.0.0: dependencies: - form-data: 2.5.1 + form-data: 2.5.2 istanbul-lib-coverage@3.2.0: {} @@ -16715,21 +15558,21 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.2: + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -16741,7 +15584,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7 + debug: 4.4.0(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -16754,12 +15597,19 @@ snapshots: iterate-object@1.3.4: {} - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + javascript-natural-sort@0.7.1: {} jest-changed-files@29.7.0: @@ -16774,7 +15624,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -16794,16 +15644,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@18.0.6): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@18.0.6) exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.0.6) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16813,12 +15663,13 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@18.0.6): dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.4) + '@types/node': 18.0.6 + babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -16832,24 +15683,22 @@ snapshots: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.0.6 - ts-node: 10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@20.17.12): dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.4) + '@types/node': 20.17.12 + babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -16863,14 +15712,11 @@ snapshots: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.12.7 - ts-node: 10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -16899,7 +15745,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -16909,14 +15755,14 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.12.7 + '@types/node': 20.17.12 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -16935,12 +15781,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -16948,11 +15794,11 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: + dependencies: jest-resolve: 29.7.0 jest-regex-util@29.6.3: {} @@ -16972,8 +15818,8 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + resolve: 1.22.10 + resolve.exports: 2.0.3 slash: 3.0.0 jest-runner@29.7.0: @@ -16983,7 +15829,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -17011,9 +15857,9 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 - cjs-module-lexer: 1.3.1 + cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -17031,15 +15877,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.24.4 - '@babel/generator': 7.24.4 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - '@babel/types': 7.24.0 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.3 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -17050,14 +15896,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -17076,7 +15922,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.17.12 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -17085,23 +15931,23 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)): + jest@29.7.0(@types/node@18.0.6): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.0.6) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -17112,15 +15958,15 @@ snapshots: join-component@1.1.0: {} - jose@4.15.5: {} + jose@4.15.9: {} js-beautify@1.15.1: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.3.12 + glob: 10.4.5 js-cookie: 3.0.5 - nopt: 7.2.0 + nopt: 7.2.1 js-cookie@3.0.5: {} @@ -17137,10 +15983,12 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@0.5.0: {} - jsesc@2.5.2: {} + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 @@ -17162,7 +16010,7 @@ snapshots: code-error-fragment: 0.0.230 grapheme-splitter: 1.0.4 - json11@1.1.2: {} + json11@2.0.0: {} json2csv@5.0.7: dependencies: @@ -17208,7 +16056,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.0 + semver: 7.6.3 jwa@1.4.1: dependencies: @@ -17225,11 +16073,11 @@ snapshots: jwks-rsa@3.1.0: dependencies: '@types/express': 4.17.21 - '@types/jsonwebtoken': 9.0.6 - debug: 4.3.4(supports-color@5.5.0) - jose: 4.15.5 + '@types/jsonwebtoken': 9.0.7 + debug: 4.4.0(supports-color@5.5.0) + jose: 4.15.9 limiter: 1.1.5 - lru-memoizer: 2.2.0 + lru-memoizer: 2.3.0 transitivePeerDependencies: - supports-color @@ -17366,12 +16214,7 @@ snapshots: lowercase-keys@2.0.0: {} - lru-cache@10.2.2: {} - - lru-cache@4.0.2: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + lru-cache@10.4.3: {} lru-cache@4.1.5: dependencies: @@ -17390,10 +16233,10 @@ snapshots: lru-cache@9.1.2: {} - lru-memoizer@2.2.0: + lru-memoizer@2.3.0: dependencies: lodash.clonedeep: 4.5.0 - lru-cache: 4.0.2 + lru-cache: 6.0.0 lru-queue@0.1.0: dependencies: @@ -17409,7 +16252,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.3 make-error@1.3.6: {} @@ -17421,6 +16264,8 @@ snapshots: dependencies: iterate-object: 1.3.4 + math-intrinsics@1.1.0: {} + md5@2.3.0: dependencies: charenc: 0.0.2 @@ -17433,14 +16278,14 @@ snapshots: dependencies: mimic-fn: 1.2.0 - memfs@4.11.1: + memfs@4.15.3: dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.6.2) - '@jsonjoy.com/util': 1.3.0(tslib@2.6.2) - tree-dump: 1.0.2(tslib@2.6.2) - tslib: 2.6.2 + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 - memoizee@0.4.15: + memoizee@0.4.17: dependencies: d: 1.0.2 es5-ext: 0.10.64 @@ -17449,7 +16294,7 @@ snapshots: is-promise: 2.2.2 lru-queue: 0.1.0 next-tick: 1.1.0 - timers-ext: 0.1.7 + timers-ext: 0.1.8 merge-descriptors@1.0.1: {} @@ -17461,13 +16306,15 @@ snapshots: methods@1.1.2: {} - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} + mime-db@1.53.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -17490,6 +16337,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 @@ -17498,7 +16349,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -17509,7 +16360,7 @@ snapshots: safe-buffer: 5.2.1 yallist: 3.1.1 - minipass@7.0.4: {} + minipass@7.1.2: {} minizlib@1.3.3: dependencies: @@ -17523,7 +16374,7 @@ snapshots: module-details-from-path@1.0.3: {} - moment-timezone@0.5.45: + moment-timezone@0.5.46: dependencies: moment: 2.29.4 @@ -17537,19 +16388,10 @@ snapshots: ms@2.1.1: {} - ms@2.1.2: {} - ms@2.1.3: {} ms@3.0.0-canary.1: {} - msgpack-lite@0.1.26: - dependencies: - event-lite: 0.1.3 - ieee754: 1.2.1 - int64-buffer: 0.1.10 - isarray: 1.0.0 - mute-stream@0.0.8: {} mv@2.1.1: @@ -17564,9 +16406,9 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.19.0: {} + nan@2.22.0: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare-lite@1.4.0: {} @@ -17585,7 +16427,7 @@ snapshots: dependencies: debug: 3.2.7(supports-color@5.5.0) iconv-lite: 0.4.24 - sax: 1.3.0 + sax: 1.4.1 transitivePeerDependencies: - supports-color @@ -17599,8 +16441,6 @@ snapshots: next-tick@1.1.0: {} - node-abort-controller@3.1.1: {} - node-addon-api@3.2.1: {} node-addon-api@6.1.0: {} @@ -17609,17 +16449,15 @@ snapshots: dependencies: http2-client: 1.3.5 - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 node-forge@1.3.1: {} node-gyp-build@3.9.0: {} - node-gyp-build@4.8.0: {} + node-gyp-build@4.8.4: {} node-html-markdown@1.3.0: dependencies: @@ -17663,7 +16501,7 @@ snapshots: dependencies: es6-promise: 3.3.1 - node-releases@2.0.14: {} + node-releases@2.0.19: {} nodemon@2.0.22: dependencies: @@ -17675,7 +16513,7 @@ snapshots: semver: 5.7.2 simple-update-notifier: 1.1.0 supports-color: 5.5.0 - touch: 3.1.0 + touch: 3.1.1 undefsafe: 2.0.5 nodemon@2.0.4: @@ -17687,21 +16525,21 @@ snapshots: pstree.remy: 1.1.8 semver: 5.7.2 supports-color: 5.5.0 - touch: 3.1.0 + touch: 3.1.1 undefsafe: 2.0.5 update-notifier: 4.1.3 - nodemon@3.1.0: + nodemon@3.1.9: dependencies: chokidar: 3.6.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.6.0 + semver: 7.6.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 - touch: 3.1.0 + touch: 3.1.1 undefsafe: 2.0.5 noms@0.0.0: @@ -17709,23 +16547,19 @@ snapshots: inherits: 2.0.4 readable-stream: 1.0.34 - nopt@1.0.10: - dependencies: - abbrev: 1.1.1 - nopt@4.0.3: dependencies: abbrev: 1.1.1 osenv: 0.1.5 - nopt@7.2.0: + nopt@7.2.1: dependencies: abbrev: 2.0.0 normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -17776,12 +16610,12 @@ snapshots: should: 13.2.3 yaml: 1.10.2 - oas-normalize@6.0.0(encoding@0.1.13)(openapi-types@12.1.3): + oas-normalize@6.0.0(openapi-types@12.1.3): dependencies: - '@readme/openapi-parser': 2.5.1(openapi-types@12.1.3) + '@readme/openapi-parser': 2.6.0(openapi-types@12.1.3) js-yaml: 4.1.0 - node-fetch: 2.7.0(encoding@0.1.13) - swagger2openapi: 7.0.8(encoding@0.1.13) + node-fetch: 2.7.0 + swagger2openapi: 7.0.8 transitivePeerDependencies: - encoding - openapi-types @@ -17813,41 +16647,44 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} + object-inspect@1.13.3: {} object-keys@0.4.0: {} object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -17926,6 +16763,12 @@ snapshots: os-homedir: 1.0.2 os-tmpdir: 1.0.2 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-cancelable@1.1.0: {} p-finally@1.0.0: {} @@ -17972,6 +16815,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-json@6.5.0: dependencies: got: 9.6.0 @@ -17989,7 +16834,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -18091,14 +16936,14 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.2: + path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 - minipass: 7.0.4 + lru-cache: 10.4.3 + minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.12: {} - path-to-regexp@0.1.8: {} + path-to-regexp@0.1.7: {} path-type@2.0.0: dependencies: @@ -18120,35 +16965,36 @@ snapshots: pg-cloudflare@1.1.1: optional: true - pg-connection-string@2.6.4: {} + pg-connection-string@2.7.0: {} - pg-cursor@2.12.0(pg@8.11.5): + pg-cursor@2.12.1(pg@8.13.1): dependencies: - pg: 8.11.5 + pg: 8.13.1 pg-int8@1.0.1: {} - pg-minify@1.6.3: {} + pg-minify@1.6.5: {} - pg-pool@3.6.2(pg@8.11.5): + pg-pool@3.7.0(pg@8.13.1): dependencies: - pg: 8.11.5 + pg: 8.13.1 - pg-promise@11.6.0: + pg-promise@11.10.2(pg-query-stream@4.7.1): dependencies: - assert-options: 0.8.1 - pg: 8.11.5 - pg-minify: 1.6.3 - spex: 3.3.0 + assert-options: 0.8.2 + pg: 8.13.1 + pg-minify: 1.6.5 + pg-query-stream: 4.7.1(pg@8.13.1) + spex: 3.4.0 transitivePeerDependencies: - pg-native - pg-protocol@1.6.1: {} + pg-protocol@1.7.0: {} - pg-query-stream@4.7.0(pg@8.11.5): + pg-query-stream@4.7.1(pg@8.13.1): dependencies: - pg: 8.11.5 - pg-cursor: 2.12.0(pg@8.11.5) + pg: 8.13.1 + pg-cursor: 2.12.1(pg@8.13.1) pg-types@2.2.0: dependencies: @@ -18158,11 +17004,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.11.5: + pg@8.13.1: dependencies: - pg-connection-string: 2.6.4 - pg-pool: 3.6.2(pg@8.11.5) - pg-protocol: 1.6.1 + pg-connection-string: 2.7.0 + pg-pool: 3.7.0(pg@8.13.1) + pg-protocol: 1.7.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -18172,7 +17018,7 @@ snapshots: dependencies: split2: 4.2.0 - picocolors@1.0.0: {} + picocolors@1.1.1: {} picomatch-browser@2.2.6: {} @@ -18190,11 +17036,11 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss@8.4.38: + postcss@8.4.49: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 postgres-array@2.0.0: {} @@ -18216,9 +17062,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.2.5: {} - - prettier@3.3.3: {} + prettier@3.4.2: {} pretty-format@29.7.0: dependencies: @@ -18239,9 +17083,9 @@ snapshots: proto3-json-serializer@2.0.2: dependencies: - protobufjs: 7.2.6 + protobufjs: 7.4.0 - protobufjs@7.2.6: + protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -18253,7 +17097,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.12.7 + '@types/node': 20.17.12 long: 5.2.3 proxy-addr@2.0.7: @@ -18267,7 +17111,7 @@ snapshots: pstree.remy@1.1.8: {} - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -18276,10 +17120,12 @@ snapshots: dependencies: duplexify: 4.1.3 inherits: 2.0.4 - pump: 3.0.0 + pump: 3.0.2 punycode@1.3.2: {} + punycode@1.4.1: {} + punycode@2.3.1: {} pupa@2.1.1: @@ -18294,15 +17140,15 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 - qs@6.12.1: + qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 - qs@6.13.0: + qs@6.13.1: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.7.0: {} @@ -18346,29 +17192,29 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - rdme@7.5.0(encoding@0.1.13)(openapi-types@12.1.3): + rdme@7.5.0(openapi-types@12.1.3): dependencies: - '@actions/core': 1.10.1 + '@actions/core': 1.11.1 chalk: 4.1.2 cli-table: 0.3.11 command-line-args: 5.2.1 command-line-usage: 6.1.3 - config: 3.3.11 + config: 3.3.12 configstore: 5.0.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) editor: 1.0.0 enquirer: 2.4.1 - form-data: 4.0.0 + form-data: 4.0.1 gray-matter: 4.0.3 isemail: 3.2.0 mime-types: 2.1.35 - node-fetch: 2.7.0(encoding@0.1.13) - oas-normalize: 6.0.0(encoding@0.1.13)(openapi-types@12.1.3) + node-fetch: 2.7.0 + oas-normalize: 6.0.0(openapi-types@12.1.3) open: 8.4.2 ora: 5.4.1 parse-link-header: 2.0.0 read: 1.0.7 - semver: 7.6.0 + semver: 7.6.3 tmp-promise: 3.0.3 update-notifier: 5.1.0 transitivePeerDependencies: @@ -18420,20 +17266,31 @@ snapshots: dependencies: picomatch: 2.3.1 - redis@4.6.13: + redis@4.7.0: dependencies: - '@redis/bloom': 1.2.0(@redis/client@1.5.14) - '@redis/client': 1.5.14 - '@redis/graph': 1.1.1(@redis/client@1.5.14) - '@redis/json': 1.0.6(@redis/client@1.5.14) - '@redis/search': 1.1.6(@redis/client@1.5.14) - '@redis/time-series': 1.0.5(@redis/client@1.5.14) + '@redis/bloom': 1.2.0(@redis/client@1.6.0) + '@redis/client': 1.6.0 + '@redis/graph': 1.1.1(@redis/client@1.6.0) + '@redis/json': 1.0.7(@redis/client@1.6.0) + '@redis/search': 1.2.0(@redis/client@1.6.0) + '@redis/time-series': 1.1.0(@redis/client@1.6.0) reduce-flatten@2.0.0: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + reftools@1.1.9: {} - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -18443,23 +17300,25 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.26.0 - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@5.3.2: + regexpu-core@6.2.0: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 registry-auth-token@4.2.2: dependencies: @@ -18469,9 +17328,11 @@ snapshots: dependencies: rc: 1.2.8 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.12.0: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 remove-trailing-slash@0.1.1: {} @@ -18493,11 +17354,11 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: {} + resolve.exports@2.0.3: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -18516,16 +17377,16 @@ snapshots: retry-request@4.2.2: dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) extend: 3.0.2 transitivePeerDependencies: - supports-color - retry-request@7.0.2(encoding@0.1.13): + retry-request@7.0.2: dependencies: '@types/request': 2.48.12 extend: 3.0.2 - teeny-request: 9.0.0(encoding@0.1.13) + teeny-request: 9.0.0 transitivePeerDependencies: - encoding - supports-color @@ -18534,6 +17395,8 @@ snapshots: reusify@1.0.4: {} + rfdc@1.4.1: {} + rimraf@2.4.5: dependencies: glob: 6.0.4 @@ -18552,13 +17415,14 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} @@ -18568,28 +17432,33 @@ snapshots: safe-json-stringify@1.2.0: optional: true - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} - sanitize-html@2.13.0: + sanitize-html@2.14.0: dependencies: deepmerge: 4.3.1 escape-string-regexp: 4.0.0 htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.4.38 + postcss: 8.4.49 sax@1.2.1: {} - sax@1.3.0: {} + sax@1.4.1: {} schema-utils@3.3.0: dependencies: @@ -18597,6 +17466,13 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -18622,9 +17498,7 @@ snapshots: semver@7.0.0: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.3: {} send@0.17.1: dependencies: @@ -18669,32 +17543,31 @@ snapshots: fs-extra: 4.0.3 js-beautify: 1.15.1 lodash: 4.17.21 - resolve: 1.22.8 + resolve: 1.22.10 umzug: 2.3.0 yargs: 8.0.2 sequelize-pool@7.1.0: {} - sequelize@6.21.2(pg@8.11.5): + sequelize@6.21.2(pg@8.13.1): dependencies: '@types/debug': 4.1.12 - '@types/validator': 13.11.9 - debug: 4.3.4(supports-color@5.5.0) + '@types/validator': 13.12.2 + debug: 4.4.0(supports-color@5.5.0) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 moment: 2.29.4 - moment-timezone: 0.5.45 - pg-connection-string: 2.6.4 + moment-timezone: 0.5.46 + pg: 8.13.1 + pg-connection-string: 2.7.0 retry-as-promised: 5.0.0 - semver: 7.6.0 + semver: 7.6.3 sequelize-pool: 7.1.0 toposort-class: 1.0.1 uuid: 8.3.2 - validator: 13.11.0 + validator: 13.12.0 wkx: 0.5.0 - optionalDependencies: - pg: 8.11.5 transitivePeerDependencies: - supports-color @@ -18727,8 +17600,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -18738,6 +17611,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + setprototypeof@1.1.1: {} setprototypeof@1.2.0: {} @@ -18754,7 +17633,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.2: {} should-equal@2.0.0: dependencies: @@ -18782,12 +17661,33 @@ snapshots: should-type-adaptors: 1.1.0 should-util: 1.0.1 - side-channel@1.0.6: + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 signal-exit@3.0.7: {} @@ -18805,7 +17705,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.3 sisteransi@1.0.5: {} @@ -18815,12 +17715,12 @@ snapshots: snakeize@0.1.0: {} - snowflake-sdk@1.15.0(asn1.js@5.4.1)(encoding@0.1.13): + snowflake-sdk@1.15.0(asn1.js@5.4.1): dependencies: - '@aws-sdk/client-s3': 3.689.0 + '@aws-sdk/client-s3': 3.723.0 '@aws-sdk/node-http-handler': 3.374.0 - '@azure/storage-blob': 12.18.0(encoding@0.1.13) - '@google-cloud/storage': 7.14.0(encoding@0.1.13) + '@azure/storage-blob': 12.18.0 + '@google-cloud/storage': 7.14.0 '@techteamer/ocsp': 1.0.1 asn1.js: 5.4.1 asn1.js-rfc2560: 5.0.1(asn1.js@5.4.1) @@ -18832,16 +17732,16 @@ snapshots: bn.js: 5.2.1 browser-request: 0.3.3 expand-tilde: 2.0.2 - fast-xml-parser: 4.2.5 + fast-xml-parser: 4.5.1 fastest-levenshtein: 1.0.16 generic-pool: 3.9.0 - glob: 10.3.12 - https-proxy-agent: 7.0.4 + glob: 10.4.5 + https-proxy-agent: 7.0.6 jsonwebtoken: 9.0.2 mime-types: 2.1.35 mkdirp: 1.0.4 moment: 2.29.4 - moment-timezone: 0.5.45 + moment-timezone: 0.5.46 open: 7.4.2 python-struct: 1.1.3 simple-lru-cache: 0.0.2 @@ -18854,10 +17754,10 @@ snapshots: - encoding - supports-color - socket.io-adapter@2.5.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - debug: 4.3.4(supports-color@5.5.0) - ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + debug: 4.3.7 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -18866,31 +17766,31 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color - socket.io@4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10): + socket.io@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@5.5.0) - engine.io: 6.5.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) - socket.io-adapter: 2.5.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + debug: 4.3.7 + engine.io: 6.6.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} - source-map-loader@4.0.2(webpack@5.91.0(@swc/core@1.4.17)): + source-map-loader@4.0.2(webpack@5.97.1): dependencies: iconv-lite: 0.6.3 - source-map-js: 1.2.0 - webpack: 5.91.0(@swc/core@1.4.17) + source-map-js: 1.2.1 + webpack: 5.97.1(@swc/core@1.10.4) source-map-support@0.5.13: dependencies: @@ -18911,18 +17811,18 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.20 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.17: {} + spdx-license-ids@3.0.20: {} - spex@3.3.0: {} + spex@3.4.0: {} split2@4.2.0: {} @@ -18977,22 +17877,26 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -19020,7 +17924,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom-string@1.0.0: {} @@ -19044,14 +17948,14 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) fast-safe-stringify: 2.1.1 - form-data: 4.0.0 + form-data: 4.0.1 formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.12.1 - semver: 7.6.0 + qs: 6.13.1 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -19076,10 +17980,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swagger2openapi@7.0.8(encoding@0.1.13): + swagger2openapi@7.0.8: dependencies: call-me-maybe: 1.0.2 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 node-fetch-h2: 2.3.0 node-readfiles: 0.2.0 oas-kit-common: 1.0.8 @@ -19092,21 +17996,16 @@ snapshots: transitivePeerDependencies: - encoding - swc-loader@0.2.6(@swc/core@1.4.17)(webpack@5.91.0(@swc/core@1.4.17)): + swc-loader@0.2.6(@swc/core@1.10.4)(webpack@5.97.1): dependencies: - '@swc/core': 1.4.17 + '@swc/core': 1.10.4 '@swc/counter': 0.1.3 - webpack: 5.91.0(@swc/core@1.4.17) - - synckit@0.8.8: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 + webpack: 5.97.1(@swc/core@1.10.4) synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tslib: 2.8.1 table-layout@1.0.2: dependencies: @@ -19127,22 +18026,22 @@ snapshots: safe-buffer: 5.2.1 yallist: 3.1.1 - teeny-request@7.2.0(encoding@0.1.13): + teeny-request@7.2.0: dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 stream-events: 1.0.5 uuid: 8.3.2 transitivePeerDependencies: - encoding - supports-color - teeny-request@9.0.0(encoding@0.1.13): + teeny-request@9.0.0: dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 stream-events: 1.0.5 uuid: 9.0.1 transitivePeerDependencies: @@ -19151,21 +18050,20 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.4.17)(webpack@5.91.0(@swc/core@1.4.17)): + terser-webpack-plugin@5.3.11(@swc/core@1.10.4)(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 + '@swc/core': 1.10.4 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.0 serialize-javascript: 6.0.2 - terser: 5.30.4 - webpack: 5.91.0(@swc/core@1.4.17) - optionalDependencies: - '@swc/core': 1.4.17 + terser: 5.37.0 + webpack: 5.97.1(@swc/core@1.10.4) - terser@5.30.4: + terser@5.37.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19187,25 +18085,25 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.6.2): + thingies@1.21.0(tslib@2.8.1): dependencies: - tslib: 2.6.2 + tslib: 2.8.1 through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - timers-ext@0.1.7: + timers-ext@0.1.8: dependencies: es5-ext: 0.10.64 next-tick: 1.1.0 - tldts-core@6.1.18: {} + tldts-core@6.1.71: {} - tldts@6.1.18: + tldts@6.1.71: dependencies: - tldts-core: 6.1.18 + tldts-core: 6.1.71 tlhunter-sorted-set@0.1.0: {} @@ -19233,81 +18131,54 @@ snapshots: toposort-class@1.0.1: {} - touch@3.1.0: - dependencies: - nopt: 1.0.10 + touch@3.1.1: {} tr46@0.0.3: {} - tree-dump@1.0.2(tslib@2.6.2): + tree-dump@1.0.2(tslib@2.8.1): dependencies: - tslib: 2.6.2 + tslib: 2.8.1 triple-beam@1.4.1: {} - ts-api-utils@1.3.0(typescript@5.6.3): + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: - typescript: 5.6.3 + typescript: 5.7.2 - ts-jest@29.1.2(@babel/core@7.24.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.4))(jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)))(typescript@5.6.3): + ts-jest@29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.2): dependencies: + '@babel/core': 7.26.0 bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3)) + jest: 29.7.0(@types/node@18.0.6) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 - typescript: 5.6.3 + semver: 7.6.3 + typescript: 5.7.2 yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.24.4 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.4) ts-mixer@6.0.4: {} - ts-node@10.9.2(@swc/core@1.4.17)(@types/node@18.0.6)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.0.6 - acorn: 8.11.3 - acorn-walk: 8.3.2 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.17 - optional: true - - ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.7)(typescript@5.6.3): + ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.7 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 20.17.12 + acorn: 8.14.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.17 tsconfig-paths@3.15.0: dependencies: @@ -19324,17 +18195,17 @@ snapshots: tslib@1.14.1: {} - tslib@2.6.2: {} + tslib@2.8.1: {} - tsutils@3.21.0(typescript@5.6.3): + tsutils@3.21.0(typescript@5.7.2): dependencies: tslib: 1.14.1 - typescript: 5.6.3 + typescript: 5.7.2 - tsx@4.7.3: + tsx@4.19.2: dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.3 + esbuild: 0.23.1 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -19357,39 +18228,40 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type@2.7.2: {} + type@2.7.3: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 typedarray-to-buffer@3.1.5: dependencies: @@ -19399,7 +18271,7 @@ snapshots: typescript@4.9.5: {} - typescript@5.6.3: {} + typescript@5.7.2: {} typical@4.0.0: {} @@ -19411,47 +18283,49 @@ snapshots: dependencies: bluebird: 3.7.2 - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 undefsafe@2.0.5: {} undici-types@5.26.5: {} - undici@5.27.2: - dependencies: - '@fastify/busboy': 2.1.1 + undici-types@6.19.8: {} + + undici-types@6.21.0: {} undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - unicode-canonical-property-names-ecmascript@2.0.0: {} + undici@6.19.8: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} unionfs@4.5.4: dependencies: - fs-monkey: 1.0.5 + fs-monkey: 1.0.6 unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - universal-github-app-jwt@1.1.2: + universal-github-app-jwt@1.2.0: dependencies: - '@types/jsonwebtoken': 9.0.6 + '@types/jsonwebtoken': 9.0.7 jsonwebtoken: 9.0.2 universal-user-agent@6.0.1: {} @@ -19464,11 +18338,11 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 update-notifier@4.1.3: dependencies: @@ -19499,7 +18373,7 @@ snapshots: is-yarn-global: 0.3.0 latest-version: 5.1.0 pupa: 2.1.1 - semver: 7.6.0 + semver: 7.6.3 semver-diff: 3.1.1 xdg-basedir: 4.0.0 @@ -19518,7 +18392,7 @@ snapshots: utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.4 util-deprecate@1.0.2: {} @@ -19532,7 +18406,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.2.0: + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 @@ -19543,7 +18417,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validator@13.11.0: {} + validator@13.12.0: {} vary@1.1.2: {} @@ -19551,14 +18425,14 @@ snapshots: vm2@3.9.19: dependencies: - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.14.0 + acorn-walk: 8.3.4 walker@1.0.8: dependencies: makeerror: 1.0.12 - watchpack@2.4.1: + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -19571,19 +18445,18 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.91.0(@swc/core@1.4.17): + webpack@5.97.1(@swc/core@1.10.4): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.2 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -19594,8 +18467,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.17)(webpack@5.91.0(@swc/core@1.4.17)) - watchpack: 2.4.1 + terser-webpack-plugin: 5.3.11(@swc/core@1.10.4)(webpack@5.97.1) + watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -19607,22 +18480,46 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 which-module@2.0.1: {} - which-typed-array@1.1.15: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -19639,7 +18536,7 @@ snapshots: wide-align@1.1.5: dependencies: - string-width: 4.2.3 + string-width: 1.0.2 widest-line@3.1.0: dependencies: @@ -19655,7 +18552,7 @@ snapshots: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 - async: 3.2.5 + async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 one-time: 1.0.0 @@ -19667,7 +18564,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.12.7 + '@types/node': 20.17.12 word-wrap@1.2.5: {} @@ -19713,14 +18610,14 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 + ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + bufferutil: 4.0.9 utf-8-validate: 5.0.10 xcase@2.0.1: {} @@ -19734,7 +18631,7 @@ snapshots: xml2js@0.5.0: dependencies: - sax: 1.3.0 + sax: 1.4.1 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} @@ -19791,7 +18688,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -19801,7 +18698,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -19830,4 +18727,4 @@ snapshots: zlib-sync@0.1.9: dependencies: - nan: 2.19.0 + nan: 2.22.0 diff --git a/scripts/services/docker/Dockerfile.activities_worker.dockerignore b/scripts/services/docker/Dockerfile.activities_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.activities_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.activities_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.automations_worker.dockerignore b/scripts/services/docker/Dockerfile.automations_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.automations_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.automations_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.backend.dockerignore b/scripts/services/docker/Dockerfile.backend.dockerignore index 7d3d398633..da8df20a99 100644 --- a/scripts/services/docker/Dockerfile.backend.dockerignore +++ b/scripts/services/docker/Dockerfile.backend.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.cache_worker.dockerignore b/scripts/services/docker/Dockerfile.cache_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.cache_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.cache_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.data_sink_worker.dockerignore b/scripts/services/docker/Dockerfile.data_sink_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.data_sink_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.data_sink_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.emails_worker.dockerignore b/scripts/services/docker/Dockerfile.emails_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.emails_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.emails_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.entity_merging_worker.dockerignore b/scripts/services/docker/Dockerfile.entity_merging_worker.dockerignore index 55c4d8ce1d..861b618556 100644 --- a/scripts/services/docker/Dockerfile.entity_merging_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.entity_merging_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.exports_worker.dockerignore b/scripts/services/docker/Dockerfile.exports_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.exports_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.exports_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.integration_run_worker.dockerignore b/scripts/services/docker/Dockerfile.integration_run_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.integration_run_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.integration_run_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.integration_stream_worker.dockerignore b/scripts/services/docker/Dockerfile.integration_stream_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.integration_stream_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.integration_stream_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore b/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.members_enrichment_worker.dockerignore b/scripts/services/docker/Dockerfile.members_enrichment_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.members_enrichment_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.members_enrichment_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.merge_suggestions_worker.dockerignore b/scripts/services/docker/Dockerfile.merge_suggestions_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.merge_suggestions_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.merge_suggestions_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.organizations_enrichment_worker.dockerignore b/scripts/services/docker/Dockerfile.organizations_enrichment_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.organizations_enrichment_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.organizations_enrichment_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.profiles_worker.dockerignore b/scripts/services/docker/Dockerfile.profiles_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.profiles_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.profiles_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.script_executor.dockerignore b/scripts/services/docker/Dockerfile.script_executor.dockerignore index 8a04cbbb71..63c8501fd3 100644 --- a/scripts/services/docker/Dockerfile.script_executor.dockerignore +++ b/scripts/services/docker/Dockerfile.script_executor.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.script_executor_worker.dockerignore b/scripts/services/docker/Dockerfile.script_executor_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.script_executor_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.script_executor_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.search_sync_api.dockerignore b/scripts/services/docker/Dockerfile.search_sync_api.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.search_sync_api.dockerignore +++ b/scripts/services/docker/Dockerfile.search_sync_api.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.search_sync_worker.dockerignore b/scripts/services/docker/Dockerfile.search_sync_worker.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.search_sync_worker.dockerignore +++ b/scripts/services/docker/Dockerfile.search_sync_worker.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/scripts/services/docker/Dockerfile.webhook_api.dockerignore b/scripts/services/docker/Dockerfile.webhook_api.dockerignore index f78c82d71c..4eaeed9149 100644 --- a/scripts/services/docker/Dockerfile.webhook_api.dockerignore +++ b/scripts/services/docker/Dockerfile.webhook_api.dockerignore @@ -8,8 +8,6 @@ **/.idea **/.vscode **/dist -backend/server-config/ -backend/util/ backend/src/serverless/microservices/python .vscode/ .github/ diff --git a/services/apps/cache_worker/src/activities.ts b/services/apps/cache_worker/src/activities.ts index 96a4701ca3..071fcfcd59 100644 --- a/services/apps/cache_worker/src/activities.ts +++ b/services/apps/cache_worker/src/activities.ts @@ -25,7 +25,6 @@ import { getAllTenants, getProjectGroupLeafSegments, getProjectLeafSegments, - isSegmentsEnabled, } from './activities/getTenantSegmentInfo' export { @@ -47,7 +46,6 @@ export { getActivePlatforms, findNewActivityPlatforms, updateMemberMergeSuggestionsLastGeneratedAt, - isSegmentsEnabled, getOrgIdsFromRedis, dropOrgIdFromRedis, checkOrganizationExists, diff --git a/services/apps/cache_worker/src/workflows/spawnDashboardCacheRefreshForAllTenants.ts b/services/apps/cache_worker/src/workflows/spawnDashboardCacheRefreshForAllTenants.ts index 3e2c3b91e9..113010eb65 100644 --- a/services/apps/cache_worker/src/workflows/spawnDashboardCacheRefreshForAllTenants.ts +++ b/services/apps/cache_worker/src/workflows/spawnDashboardCacheRefreshForAllTenants.ts @@ -3,7 +3,6 @@ import { ParentClosePolicy, executeChild, proxyActivities, - startChild, workflowInfo, } from '@temporalio/workflow' @@ -17,112 +16,84 @@ const activity = proxyActivities({ startToCloseTimeout: '1 mi export async function spawnDashboardCacheRefreshForAllTenants(): Promise { const tenants = await activity.getAllTenants() - const segmentsEnabled = await activity.isSegmentsEnabled() const info = workflowInfo() - if (segmentsEnabled) { - // we should spawn refreshDashboardCache for each tenant-segment couples + const SEGMENT_PAGE_SIZE = 250 - const SEGMENT_PAGE_SIZE = 250 + for (const tenant of tenants) { + // get all segments in tenant + let offset = 0 + let segments: ISegment[] + const segmentLeafIdMap = new Map() - for (const tenant of tenants) { - // get all segments in tenant - let offset = 0 - let segments: ISegment[] - const segmentLeafIdMap = new Map() + do { + segments = await activity.getAllSegments(tenant.tenantId, SEGMENT_PAGE_SIZE, offset) - do { - segments = await activity.getAllSegments(tenant.tenantId, SEGMENT_PAGE_SIZE, offset) - - // find each segment's associated leaf segment - for (const segment of segments) { - if (segment.slug && segment.parentSlug && segment.grandparentSlug) { - // it's already a leaf segment, add itself to leaf segment id map - segmentLeafIdMap.set(segment.segmentId, [segment.segmentId]) - } else if (segment.slug && segment.parentSlug && !segment.grandparentSlug) { - // it's a parent segment, find its leafs - const leafs = await activity.getProjectLeafSegments(segment.slug, tenant.tenantId) - if (leafs && leafs.length > 0) { - segmentLeafIdMap.set( - segment.segmentId, - leafs.map((l) => l.segmentId), - ) - } - } else if (segment.slug && !segment.parentSlug && !segment.grandparentSlug) { - // it's a grandparent segment, find its leafs - const leafs = await activity.getProjectGroupLeafSegments(segment.slug, tenant.tenantId) - if (leafs && leafs.length > 0) { - segmentLeafIdMap.set( - segment.segmentId, - leafs.map((l) => l.segmentId), - ) - } + // find each segment's associated leaf segment + for (const segment of segments) { + if (segment.slug && segment.parentSlug && segment.grandparentSlug) { + // it's already a leaf segment, add itself to leaf segment id map + segmentLeafIdMap.set(segment.segmentId, [segment.segmentId]) + } else if (segment.slug && segment.parentSlug && !segment.grandparentSlug) { + // it's a parent segment, find its leafs + const leafs = await activity.getProjectLeafSegments(segment.slug, tenant.tenantId) + if (leafs && leafs.length > 0) { + segmentLeafIdMap.set( + segment.segmentId, + leafs.map((l) => l.segmentId), + ) + } + } else if (segment.slug && !segment.parentSlug && !segment.grandparentSlug) { + // it's a grandparent segment, find its leafs + const leafs = await activity.getProjectGroupLeafSegments(segment.slug, tenant.tenantId) + if (leafs && leafs.length > 0) { + segmentLeafIdMap.set( + segment.segmentId, + leafs.map((l) => l.segmentId), + ) } } + } - offset += SEGMENT_PAGE_SIZE - } while (segments.length > 0) + offset += SEGMENT_PAGE_SIZE + } while (segments.length > 0) - // execute each child with batcheds of 50 - const CHUNK_SIZE = 50 - const entries = [...segmentLeafIdMap] // Convert map entries into an Array - const chunked: Map[] = [] + // execute each child with batcheds of 50 + const CHUNK_SIZE = 50 + const entries = [...segmentLeafIdMap] // Convert map entries into an Array + const chunked: Map[] = [] - for (let i = 0; i < entries.length; i += CHUNK_SIZE) { - const chunk = new Map(entries.slice(i, i + CHUNK_SIZE)) // Create new Map(s) with the chunked entries - chunked.push(chunk) - } + for (let i = 0; i < entries.length; i += CHUNK_SIZE) { + const chunk = new Map(entries.slice(i, i + CHUNK_SIZE)) // Create new Map(s) with the chunked entries + chunked.push(chunk) + } - for (const chunk of chunked) { - // create a workflow for each tenantId-segmentId couple - await Promise.all( - Array.from(chunk).map(([segmentId, leafSegmentIds]) => { - return executeChild(refreshDashboardCache, { - workflowId: `${info.workflowId}/${tenant.tenantId}/${segmentId}`, - cancellationType: ChildWorkflowCancellationType.ABANDON, - parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON, - retry: { - backoffCoefficient: 2, - initialInterval: 2 * 1000, - maximumInterval: 30 * 1000, - }, - args: [ - { - tenantId: tenant.tenantId, - segmentId, - leafSegmentIds, - }, - ], - searchAttributes: { - TenantId: [tenant.tenantId], + for (const chunk of chunked) { + // create a workflow for each tenantId-segmentId couple + await Promise.all( + Array.from(chunk).map(([segmentId, leafSegmentIds]) => { + return executeChild(refreshDashboardCache, { + workflowId: `${info.workflowId}/${tenant.tenantId}/${segmentId}`, + cancellationType: ChildWorkflowCancellationType.ABANDON, + parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON, + retry: { + backoffCoefficient: 2, + initialInterval: 2 * 1000, + maximumInterval: 30 * 1000, + }, + args: [ + { + tenantId: tenant.tenantId, + segmentId, + leafSegmentIds, }, - }) - }), - ) - } - } - } else { - await Promise.all( - tenants.map((tenant) => { - return startChild(refreshDashboardCache, { - workflowId: `${info.workflowId}/${tenant.tenantId}`, - cancellationType: ChildWorkflowCancellationType.ABANDON, - parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON, - retry: { - backoffCoefficient: 2, - initialInterval: 2 * 1000, - maximumInterval: 30 * 1000, - }, - args: [ - { - tenantId: tenant.tenantId, + ], + searchAttributes: { + TenantId: [tenant.tenantId], }, - ], - searchAttributes: { - TenantId: [tenant.tenantId], - }, - }) - }), - ) + }) + }), + ) + } } } diff --git a/services/apps/exports_worker/src/activities.ts b/services/apps/exports_worker/src/activities.ts index e9d643c693..17959dbcf8 100644 --- a/services/apps/exports_worker/src/activities.ts +++ b/services/apps/exports_worker/src/activities.ts @@ -2,12 +2,10 @@ import { buildAndUploadMembersCSV } from './activities/members' import { buildAndUploadOrganizationsCSV } from './activities/organizations' import { getPresignedUrl } from './activities/s3' import { exportSendEmail } from './activities/sendEmail' -import { decrementUsage } from './activities/usage' export { buildAndUploadMembersCSV, buildAndUploadOrganizationsCSV, getPresignedUrl, exportSendEmail, - decrementUsage, } diff --git a/services/apps/exports_worker/src/activities/usage.ts b/services/apps/exports_worker/src/activities/usage.ts deleted file mode 100644 index 9dd12e654d..0000000000 --- a/services/apps/exports_worker/src/activities/usage.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey, ITriggerCSVExport } from '@crowd/types' - -import { svc } from '../main' - -const csvCountCache = new RedisCache(FeatureFlagRedisKey.CSV_EXPORT_COUNT, svc.redis, svc.log) - -/* -decrementUsage is a Temporal activity that decrements the CSV export usage of a -tenant. This activity is triggered only if the workflow failed. -*/ -export async function decrementUsage(input: ITriggerCSVExport): Promise { - try { - await csvCountCache.decrement(input.tenantId, 1) - } catch (err) { - throw new Error(err) - } -} diff --git a/services/apps/exports_worker/src/workflows/members.ts b/services/apps/exports_worker/src/workflows/members.ts index ef688dff6e..8320e53cee 100644 --- a/services/apps/exports_worker/src/workflows/members.ts +++ b/services/apps/exports_worker/src/workflows/members.ts @@ -21,14 +21,6 @@ const { exportSendEmail } = proxyActivities({ }, }) -// Configure timeouts and retry policies related to Redis for usage count. -const { decrementUsage } = proxyActivities({ - startToCloseTimeout: '5 seconds', - retry: { - maximumAttempts: 5, - }, -}) - /* exportMembersToCSV is a Temporal workflow: - [Activity]: Build and upload the CSV to S3 containing all members returned @@ -60,10 +52,6 @@ export async function exportMembersToCSV(input: ITriggerCSVExport): Promise({ }, }) -// Configure timeouts and retry policies related to Redis for usage count. -const { decrementUsage } = proxyActivities({ - startToCloseTimeout: '5 seconds', - retry: { - maximumAttempts: 5, - }, -}) - /* exportOrganizationsToCSV is a Temporal workflow: - [Activity]: Build and upload the CSV to S3 containing all organizations returned @@ -60,10 +52,6 @@ export async function exportOrganizationsToCSV(input: ITriggerCSVExport): Promis } } - if (hasFailed) { - await decrementUsage(input) - } - try { await exportSendEmail({ sendTo: input.sendTo, diff --git a/services/apps/integration_run_worker/src/conf/index.ts b/services/apps/integration_run_worker/src/conf/index.ts index c116304b5e..fd5717c7eb 100644 --- a/services/apps/integration_run_worker/src/conf/index.ts +++ b/services/apps/integration_run_worker/src/conf/index.ts @@ -1,6 +1,5 @@ import config from 'config' -import { SERVICE } from '@crowd/common' import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' diff --git a/services/libs/common/src/i18n/en.ts b/services/libs/common/src/i18n/en.ts index 1964e032cb..01144fd9af 100644 --- a/services/libs/common/src/i18n/en.ts +++ b/services/libs/common/src/i18n/en.ts @@ -134,9 +134,6 @@ const en = { csvExport: { planLimitExceeded: 'You have exceeded # of csv exports you can have per month in your plan.', }, - featureFlag: { - notEnabled: 'This feature is not enabled for your account', - }, noNangoToken: { message: 'No Nango token found!', }, diff --git a/services/libs/types/src/enums/featureFlags.ts b/services/libs/types/src/enums/featureFlags.ts deleted file mode 100644 index 0080ff5d2e..0000000000 --- a/services/libs/types/src/enums/featureFlags.ts +++ /dev/null @@ -1,27 +0,0 @@ -export enum FeatureFlag { - AUTOMATIONS = 'automations', - EAGLE_EYE = 'eagle-eye', - CSV_EXPORT = 'csv-export', - LINKEDIN = 'linkedin', - HUBSPOT = 'hubspot', - MEMBER_ENRICHMENT = 'member-enrichment', - ORGANIZATION_ENRICHMENT = 'organization-enrichment', - SEGMENTS = 'segments', - PRIORITIZED_QUEUES = 'prioritized-queues', - FIND_GITHUB = 'find-github', - - // opensearch - SYNCHRONOUS_OPENSEARCH_UPDATES = 'synchronous-opensearch-updates', - - // temporal - TEMPORAL_MEMBERS_ENRICHMENT = 'temporal-members-enrichment', - TEMPORAL_MEMBER_MERGE_SUGGESTIONS = 'temporal-member-merge-suggestions', - TEMPORAL_ORGANIZATION_ENRICHMENT = 'temporal-organization-enrichment', - SERVE_PROFILES_OPENSEARCH = 'serve-profiles-opensearch', -} - -export enum FeatureFlagRedisKey { - CSV_EXPORT_COUNT = 'csvExportCount', - MEMBER_ENRICHMENT_COUNT = 'memberEnrichmentCount', - ORGANIZATION_ENRICHMENT_COUNT = 'organizationEnrichmentCount', -} diff --git a/services/libs/types/src/enums/index.ts b/services/libs/types/src/enums/index.ts index 0e4e1c3646..40f7926615 100644 --- a/services/libs/types/src/enums/index.ts +++ b/services/libs/types/src/enums/index.ts @@ -1,7 +1,6 @@ export * from './customViews' export * from './edition' export * from './entities' -export * from './featureFlags' export * from './integrations' export * from './members' export * from './opensearch' @@ -9,7 +8,6 @@ export * from './organizations' export * from './platforms' export * from './priorities' export * from './temporal' -export * from './tenants' export * from './webhooks' export * from './dashboard' export * from './merging' From fd23468b98a77d529e0bc1ecb3ec3f4393bcfe7e Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 7 Jan 2025 14:58:33 +0530 Subject: [PATCH 04/25] rm unnecessary modules in package.json --- backend/package.json | 5 +- pnpm-lock.yaml | 248 ++++++++++++++++++++++--------------------- 2 files changed, 130 insertions(+), 123 deletions(-) diff --git a/backend/package.json b/backend/package.json index be9fdfc2db..c7730e9ee3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,7 +8,7 @@ "start:job-generator": "SERVICE=job-generator TS_NODE_TRANSPILE_ONLY=true tsx src/bin/job-generator.ts", "start:job-generator:dev": "nodemon --watch \"src/**/*.ts\" --watch ../services/libs -e ts,json --exec \"pnpm run start:job-generator\"", "start:job-generator:dev:local": "set -a && . ./.env.dist.local && . ./.env.override.local && set +a && pnpm run start:job-generator:dev", - "build": "tsc && pnpm run build:documentation && cp package*json dist/ && cp .sequelizerc dist/.sequelizerc ", + "build": "tsc && cp package*json dist/ && cp .sequelizerc dist/.sequelizerc ", "test": "../scripts/cli scaffold up-test && jest --clearCache && set -a && . ./.env.dist.local && . ./.env.test && set +a && NODE_ENV=test SERVICE=test jest --runInBand --verbose --forceExit", "sequelize-cli:source": "pnpm run build && npx sequelize --config src/database/sequelize-cli-config.ts --migrations-source-path src/database/migrations", "sequelize-cli:build": "npx sequelize --config database/sequelize-cli-config.js --migrations-compiled-path database/migrations", @@ -18,7 +18,6 @@ "tsc-check": "tsc --noEmit", "script": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx", "script:continue-run": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/continue-run.ts", - "script:change-tenant-plan": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/change-tenant-plan.ts", "script:trigger-webhook": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/trigger-webhook.ts", "script:send-weekly-analytics-email": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/send-weekly-analytics-email.ts", "script:merge-organizations": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true tsx src/bin/scripts/merge-organizations.ts", @@ -59,8 +58,6 @@ "@octokit/graphql": "^4.8.0", "@octokit/request": "^5.6.3", "@opensearch-project/opensearch": "^2.11.0", - "@sendgrid/eventwebhook": "^7.7.0", - "@sendgrid/mail": "7.2.6", "@slack/web-api": "^6.7.2", "@superfaceai/one-sdk": "^1.3.0", "@superfaceai/passport-twitter-oauth2": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f41455cb3b..967cb435cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,7 +26,7 @@ importers: version: 20.17.12 '@typescript-eslint/eslint-plugin': specifier: ^6.7.4 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.7.2) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^6.7.4 version: 6.21.0(eslint@8.57.1)(typescript@5.7.2) @@ -41,13 +41,13 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.0.0 - version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2) + version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) prettier: specifier: ^3.0.3 version: 3.4.2 ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@20.17.12)(typescript@5.7.2) + version: 10.9.2(@swc/core@1.10.4)(@types/node@20.17.12)(typescript@5.7.2) typescript: specifier: ^5.6.3 version: 5.7.2 @@ -132,12 +132,6 @@ importers: '@opensearch-project/opensearch': specifier: ^2.11.0 version: 2.13.0 - '@sendgrid/eventwebhook': - specifier: ^7.7.0 - version: 7.7.0 - '@sendgrid/mail': - specifier: 7.2.6 - version: 7.2.6 '@slack/web-api': specifier: ^6.7.2 version: 6.13.0 @@ -299,7 +293,7 @@ importers: version: 8.13.1 pg-promise: specifier: ^11.4.3 - version: 11.10.2(pg-query-stream@4.7.1) + version: 11.10.2(pg-query-stream@4.7.1(pg@8.13.1)) sanitize-html: specifier: ^2.7.1 version: 2.14.0 @@ -381,7 +375,7 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^5.17.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^5.17.0 version: 5.62.0(eslint@8.57.1)(typescript@5.7.2) @@ -399,19 +393,19 @@ importers: version: 8.57.1 eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: ^16.1.4 - version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) eslint-config-prettier: specifier: ^8.5.0 version: 8.10.0(eslint@8.57.1) eslint-plugin-import: specifier: ^2.25.4 - version: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@18.0.6) + version: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) node-mocks-http: specifier: 1.9.0 version: 1.9.0 @@ -429,7 +423,7 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.2) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)))(typescript@5.7.2) tsx: specifier: ^4.7.1 version: 4.19.2 @@ -444,7 +438,7 @@ importers: version: 4.3.0(prettier@3.4.2) '@typescript-eslint/eslint-plugin': specifier: ^5.59.2 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^5.59.2 version: 5.62.0(eslint@8.57.1)(typescript@5.7.2) @@ -456,7 +450,7 @@ importers: version: 8.10.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2) + version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) prettier: specifier: ^3.3.3 version: 3.4.2 @@ -1543,7 +1537,7 @@ importers: version: 2.2.4 pg-promise: specifier: ^11.4.3 - version: 11.10.2(pg-query-stream@4.7.1) + version: 11.10.2(pg-query-stream@4.7.1(pg@8.13.1)) devDependencies: '@types/config': specifier: ^3.3.1 @@ -1719,7 +1713,7 @@ importers: version: 2.29.4 pg-promise: specifier: ^11.4.3 - version: 11.10.2(pg-query-stream@4.7.1) + version: 11.10.2(pg-query-stream@4.7.1(pg@8.13.1)) pg-query-stream: specifier: ^4.7.0 version: 4.7.1(pg@8.13.1) @@ -1750,7 +1744,7 @@ importers: version: link:../logging pg-promise: specifier: ^11.4.3 - version: 11.10.2(pg-query-stream@4.7.1) + version: 11.10.2(pg-query-stream@4.7.1(pg@8.13.1)) devDependencies: '@types/node': specifier: ^18.16.3 @@ -1904,7 +1898,7 @@ importers: version: 3.0.0 pg-promise: specifier: ^11.4.3 - version: 11.10.2(pg-query-stream@4.7.1) + version: 11.10.2(pg-query-stream@4.7.1(pg@8.13.1)) devDependencies: '@types/node': specifier: ^18.16.3 @@ -3611,10 +3605,6 @@ packages: resolution: {integrity: sha512-VxZoQ82MpxmjSXLR3ZAE2OWxvQIW2k2G24UeRPr/SYX8HqWLV/8UBN15T2WmjjnEb5XSmFImTJOKDzzSeKr9YQ==} engines: {node: '>=12.*'} - '@sendgrid/eventwebhook@7.7.0': - resolution: {integrity: sha512-L2C6nzZgG6YZ/jfXCEqn5l8K8+6oxvhaQ9v/cIM6aXxRHwmTAia9s20snafgTLa27w//vcs+W+MDEm8x4sN+xg==} - engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/helpers@7.7.0': resolution: {integrity: sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==} engines: {node: '>= 6.0.0'} @@ -3623,10 +3613,6 @@ packages: resolution: {integrity: sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==} engines: {node: '>= 12.0.0'} - '@sendgrid/mail@7.2.6': - resolution: {integrity: sha512-eP9MuqEZIgt4bHaoufWqKGUY4Bo7FUgST3WGNYIDXIe1rP2dV6/JR7Ac2Dl9iW22gy15nc58fLGIGa41XbwtuA==} - engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/mail@7.7.0': resolution: {integrity: sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==} engines: {node: 6.* || 8.* || >=10.*} @@ -6790,9 +6776,6 @@ packages: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} - js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7295,7 +7278,6 @@ packages: needle@https://codeload.github.com/clearbit/needle/tar.gz/84d28b5f2c3916db1e7eb84aeaa9d976cc40054b: resolution: {tarball: https://codeload.github.com/clearbit/needle/tar.gz/84d28b5f2c3916db1e7eb84aeaa9d976cc40054b} - name: needle version: 0.7.10 engines: {node: '>= 0.10.x'} hasBin: true @@ -8494,9 +8476,6 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - starkbank-ecdsa@1.1.5: - resolution: {integrity: sha512-5O9CJ0QF6pTrtDg6dmaHy1GC/2wA1tcXsYanWOCzg+2cZrCDylEvEl6krzI4Zy8ryar00lHErRTT2Q61w/MUVA==} - statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -9383,7 +9362,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-host-header': 3.723.0 '@aws-sdk/middleware-logger': 3.723.0 '@aws-sdk/middleware-recursion-detection': 3.723.0 @@ -9435,7 +9414,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-host-header': 3.723.0 '@aws-sdk/middleware-logger': 3.723.0 '@aws-sdk/middleware-recursion-detection': 3.723.0 @@ -9484,7 +9463,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-bucket-endpoint': 3.723.0 '@aws-sdk/middleware-expect-continue': 3.723.0 '@aws-sdk/middleware-flexible-checksums': 3.723.0 @@ -9546,7 +9525,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-host-header': 3.723.0 '@aws-sdk/middleware-logger': 3.723.0 '@aws-sdk/middleware-recursion-detection': 3.723.0 @@ -9593,7 +9572,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-host-header': 3.723.0 '@aws-sdk/middleware-logger': 3.723.0 '@aws-sdk/middleware-recursion-detection': 3.723.0 @@ -9681,7 +9660,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/core': 3.723.0 - '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-node': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/middleware-host-header': 3.723.0 '@aws-sdk/middleware-logger': 3.723.0 '@aws-sdk/middleware-recursion-detection': 3.723.0 @@ -9755,14 +9734,14 @@ snapshots: '@smithy/util-stream': 4.0.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0)': + '@aws-sdk/credential-provider-ini@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0)': dependencies: '@aws-sdk/client-sts': 3.723.0 '@aws-sdk/core': 3.723.0 '@aws-sdk/credential-provider-env': 3.723.0 '@aws-sdk/credential-provider-http': 3.723.0 '@aws-sdk/credential-provider-process': 3.723.0 - '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0)) '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/types': 3.723.0 '@smithy/credential-provider-imds': 4.0.0 @@ -9774,13 +9753,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0)': + '@aws-sdk/credential-provider-node@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0)': dependencies: '@aws-sdk/credential-provider-env': 3.723.0 '@aws-sdk/credential-provider-http': 3.723.0 - '@aws-sdk/credential-provider-ini': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0)(@aws-sdk/client-sts@3.723.0) + '@aws-sdk/credential-provider-ini': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))(@aws-sdk/client-sts@3.723.0) '@aws-sdk/credential-provider-process': 3.723.0 - '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/credential-provider-sso': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0)) '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/types': 3.723.0 '@smithy/credential-provider-imds': 4.0.0 @@ -9802,11 +9781,11 @@ snapshots: '@smithy/types': 4.0.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)': + '@aws-sdk/credential-provider-sso@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))': dependencies: '@aws-sdk/client-sso': 3.723.0 '@aws-sdk/core': 3.723.0 - '@aws-sdk/token-providers': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0) + '@aws-sdk/token-providers': 3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0)) '@aws-sdk/types': 3.723.0 '@smithy/property-provider': 4.0.0 '@smithy/shared-ini-file-loader': 4.0.0 @@ -9970,7 +9949,7 @@ snapshots: '@smithy/types': 4.0.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.723.0(@aws-sdk/client-sso-oidc@3.723.0)': + '@aws-sdk/token-providers@3.723.0(@aws-sdk/client-sso-oidc@3.723.0(@aws-sdk/client-sts@3.723.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.723.0(@aws-sdk/client-sts@3.723.0) '@aws-sdk/types': 3.723.0 @@ -11230,7 +11209,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -11244,7 +11223,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.12) + jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -11826,10 +11805,6 @@ snapshots: transitivePeerDependencies: - debug - '@sendgrid/eventwebhook@7.7.0': - dependencies: - starkbank-ecdsa: 1.1.5 - '@sendgrid/helpers@7.7.0': dependencies: deepmerge: 4.3.1 @@ -11838,13 +11813,6 @@ snapshots: dependencies: deepmerge: 4.3.1 - '@sendgrid/mail@7.2.6': - dependencies: - '@sendgrid/client': 7.7.0 - '@sendgrid/helpers': 7.7.0 - transitivePeerDependencies: - - debug - '@sendgrid/mail@7.7.0': dependencies: '@sendgrid/client': 7.7.0 @@ -12435,9 +12403,9 @@ snapshots: memfs: 4.15.3 rxjs: 7.8.1 source-map: 0.7.4 - source-map-loader: 4.0.2(webpack@5.97.1) + source-map-loader: 4.0.2(webpack@5.97.1(@swc/core@1.10.4)) supports-color: 8.1.1 - swc-loader: 0.2.6(@swc/core@1.10.4)(webpack@5.97.1) + swc-loader: 0.2.6(@swc/core@1.10.4)(webpack@5.97.1(@swc/core@1.10.4)) unionfs: 4.5.4 webpack: 5.97.1(@swc/core@1.10.4) transitivePeerDependencies: @@ -12703,7 +12671,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) @@ -12717,11 +12685,12 @@ snapshots: natural-compare-lite: 1.4.0 semver: 7.6.3 tsutils: 3.21.0(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.2) @@ -12736,6 +12705,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.3 ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12747,6 +12717,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12759,6 +12730,7 @@ snapshots: '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12780,6 +12752,7 @@ snapshots: debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12791,6 +12764,7 @@ snapshots: debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12808,6 +12782,7 @@ snapshots: is-glob: 4.0.3 semver: 7.6.3 tsutils: 3.21.0(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12822,6 +12797,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.3 ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -12987,11 +12963,11 @@ snapshots: agent-base@7.1.3: {} ajv-draft-04@1.0.0(ajv@8.17.1): - dependencies: + optionalDependencies: ajv: 8.17.1 ajv-formats@2.1.1(ajv@8.17.1): - dependencies: + optionalDependencies: ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): @@ -13810,13 +13786,13 @@ snapshots: create-error@0.3.1: {} - create-jest@29.7.0(@types/node@18.0.6): + create-jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.0.6) + jest-config: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13946,6 +13922,7 @@ snapshots: debug@3.2.7(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: supports-color: 5.5.0 debug@4.3.7: @@ -13955,6 +13932,7 @@ snapshots: debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: supports-color: 5.5.0 decamelize@1.2.0: {} @@ -14389,22 +14367,22 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) object.assign: 4.1.7 object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-typescript@16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-config-airbnb-typescript@16.2.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) eslint-config-prettier@8.10.0(eslint@8.57.1): dependencies: @@ -14422,19 +14400,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) debug: 3.2.7(supports-color@5.5.0) + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.3 @@ -14443,7 +14421,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14454,26 +14432,32 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2): + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): dependencies: eslint: 8.57.1 - eslint-config-prettier: 8.10.0(eslint@8.57.1) prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 8.10.0(eslint@8.57.1) - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2): + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): dependencies: eslint: 8.57.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) eslint-scope@5.1.1: dependencies: @@ -15644,16 +15628,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.0.6): + jest-cli@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.0.6) + create-jest: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.0.6) + jest-config: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -15663,12 +15647,11 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.0.6): + jest-config@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.0.6 babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 @@ -15688,16 +15671,18 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.0.6 + ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.12): + jest-config@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.12 babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 @@ -15717,6 +15702,9 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.17.12 + ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15798,7 +15786,7 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@29.6.3: {} @@ -15942,12 +15930,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.0.6): + jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.0.6) + jest-cli: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15970,8 +15958,6 @@ snapshots: js-cookie@3.0.5: {} - js-sha256@0.9.0: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -16979,7 +16965,7 @@ snapshots: dependencies: pg: 8.13.1 - pg-promise@11.10.2(pg-query-stream@4.7.1): + pg-promise@11.10.2(pg-query-stream@4.7.1(pg@8.13.1)): dependencies: assert-options: 0.8.2 pg: 8.13.1 @@ -17559,7 +17545,6 @@ snapshots: lodash: 4.17.21 moment: 2.29.4 moment-timezone: 0.5.46 - pg: 8.13.1 pg-connection-string: 2.7.0 retry-as-promised: 5.0.0 semver: 7.6.3 @@ -17568,6 +17553,8 @@ snapshots: uuid: 8.3.2 validator: 13.12.0 wkx: 0.5.0 + optionalDependencies: + pg: 8.13.1 transitivePeerDependencies: - supports-color @@ -17786,7 +17773,7 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@4.0.2(webpack@5.97.1): + source-map-loader@4.0.2(webpack@5.97.1(@swc/core@1.10.4)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 @@ -17834,11 +17821,6 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 - starkbank-ecdsa@1.1.5: - dependencies: - big-integer: 1.6.52 - js-sha256: 0.9.0 - statuses@1.5.0: {} statuses@2.0.1: {} @@ -17996,7 +17978,7 @@ snapshots: transitivePeerDependencies: - encoding - swc-loader@0.2.6(@swc/core@1.10.4)(webpack@5.97.1): + swc-loader@0.2.6(@swc/core@1.10.4)(webpack@5.97.1(@swc/core@1.10.4)): dependencies: '@swc/core': 1.10.4 '@swc/counter': 0.1.3 @@ -18050,15 +18032,16 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.11(@swc/core@1.10.4)(webpack@5.97.1): + terser-webpack-plugin@5.3.11(@swc/core@1.10.4)(webpack@5.97.1(@swc/core@1.10.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 - '@swc/core': 1.10.4 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 webpack: 5.97.1(@swc/core@1.10.4) + optionalDependencies: + '@swc/core': 1.10.4 terser@5.37.0: dependencies: @@ -18145,13 +18128,12 @@ snapshots: dependencies: typescript: 5.7.2 - ts-jest@29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.2): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)))(typescript@5.7.2): dependencies: - '@babel/core': 7.26.0 bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.0.6) + jest: 29.7.0(@types/node@18.0.6)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -18159,10 +18141,36 @@ snapshots: semver: 7.6.3 typescript: 5.7.2 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2): + ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.0.6 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.4 + optional: true + + ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.12)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -18179,6 +18187,8 @@ snapshots: typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.4 tsconfig-paths@3.15.0: dependencies: @@ -18467,7 +18477,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.10.4)(webpack@5.97.1) + terser-webpack-plugin: 5.3.11(@swc/core@1.10.4)(webpack@5.97.1(@swc/core@1.10.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -18611,12 +18621,12 @@ snapshots: signal-exit: 3.0.7 ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: + optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: + optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 From 2eb1c3517aa1c7d096f09d22be353e0dff837d1d Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 8 Jan 2025 16:14:35 +0530 Subject: [PATCH 05/25] rm weekly emails and unused user endpoints --- .../config/custom-environment-variables.json | 12 +- backend/config/default.json | 7 - backend/src/api/user/index.ts | 4 - backend/src/api/user/userCreate.ts | 16 - backend/src/api/user/userDestroy.ts | 15 - backend/src/api/user/userEdit.ts | 15 - backend/src/api/user/userImport.ts | 13 - backend/src/conf/configTypes.ts | 28 -- backend/src/conf/index.ts | 9 - backend/src/security/permissions.ts | 16 - backend/src/services/auth/authService.ts | 145 +------ backend/src/services/emailSender.ts | 93 ----- .../src/services/user/permissionChecker.ts | 7 - backend/src/services/user/userCreator.ts | 174 -------- backend/src/services/user/userDestroyer.ts | 81 ---- backend/src/services/user/userEditor.ts | 134 ------- backend/src/services/user/userImporter.ts | 47 --- pnpm-lock.yaml | 111 ----- scripts/builders/emails-worker.env | 4 - scripts/cli | 8 +- .../services/docker/Dockerfile.emails_worker | 23 -- .../Dockerfile.emails_worker.dockerignore | 19 - scripts/services/emails-worker.yaml | 65 --- services/apps/emails_worker/package.json | 37 -- services/apps/emails_worker/src/activities.ts | 74 ---- .../activities/eagleeye-digest/buildEmail.ts | 105 ----- .../eagleeye-digest/getNextEmails.ts | 20 - .../activities/eagleeye-digest/sendEmail.ts | 39 -- .../eagleeye-digest/updateEmailHistory.ts | 22 - .../src/activities/updateEmailHistory.ts | 22 - .../buildEmailFromPostgreSQL.ts | 182 --------- .../weekly-analytics/buildEmailFromQuestDB.ts | 378 ------------------ .../weekly-analytics/getNextEmails.ts | 43 -- .../activities/weekly-analytics/sendEmail.ts | 38 -- services/apps/emails_worker/src/main.ts | 57 --- services/apps/emails_worker/src/schedules.ts | 4 - .../src/schedules/emailAnalyticsWeekly.ts | 32 -- .../src/schedules/emailEagleEyeDigest.ts | 36 -- .../apps/emails_worker/src/types/analytics.ts | 21 - .../apps/emails_worker/src/types/email.ts | 16 - services/apps/emails_worker/src/types/user.ts | 18 - .../apps/emails_worker/src/utils/analytics.ts | 33 -- services/apps/emails_worker/src/utils/date.ts | 68 ---- services/apps/emails_worker/src/workflows.ts | 11 - .../eagleye-digest/getAndSendNextEmails.ts | 48 --- .../sendEmailAndUpdateHistory.ts | 84 ---- .../weekly-analytics/getAndSendNextEmails.ts | 63 --- .../sendEmailAndUpdateHistory.ts | 207 ---------- services/apps/emails_worker/tsconfig.json | 4 - 49 files changed, 6 insertions(+), 2702 deletions(-) delete mode 100644 backend/src/api/user/userCreate.ts delete mode 100644 backend/src/api/user/userDestroy.ts delete mode 100644 backend/src/api/user/userEdit.ts delete mode 100644 backend/src/api/user/userImport.ts delete mode 100644 backend/src/services/emailSender.ts delete mode 100644 backend/src/services/user/userCreator.ts delete mode 100644 backend/src/services/user/userDestroyer.ts delete mode 100644 backend/src/services/user/userEditor.ts delete mode 100644 backend/src/services/user/userImporter.ts delete mode 100644 scripts/builders/emails-worker.env delete mode 100644 scripts/services/docker/Dockerfile.emails_worker delete mode 100644 scripts/services/docker/Dockerfile.emails_worker.dockerignore delete mode 100644 scripts/services/emails-worker.yaml delete mode 100644 services/apps/emails_worker/package.json delete mode 100644 services/apps/emails_worker/src/activities.ts delete mode 100644 services/apps/emails_worker/src/activities/eagleeye-digest/buildEmail.ts delete mode 100644 services/apps/emails_worker/src/activities/eagleeye-digest/getNextEmails.ts delete mode 100644 services/apps/emails_worker/src/activities/eagleeye-digest/sendEmail.ts delete mode 100644 services/apps/emails_worker/src/activities/eagleeye-digest/updateEmailHistory.ts delete mode 100644 services/apps/emails_worker/src/activities/updateEmailHistory.ts delete mode 100644 services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromPostgreSQL.ts delete mode 100644 services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromQuestDB.ts delete mode 100644 services/apps/emails_worker/src/activities/weekly-analytics/getNextEmails.ts delete mode 100644 services/apps/emails_worker/src/activities/weekly-analytics/sendEmail.ts delete mode 100644 services/apps/emails_worker/src/main.ts delete mode 100644 services/apps/emails_worker/src/schedules.ts delete mode 100644 services/apps/emails_worker/src/schedules/emailAnalyticsWeekly.ts delete mode 100644 services/apps/emails_worker/src/schedules/emailEagleEyeDigest.ts delete mode 100644 services/apps/emails_worker/src/types/analytics.ts delete mode 100644 services/apps/emails_worker/src/types/email.ts delete mode 100644 services/apps/emails_worker/src/types/user.ts delete mode 100644 services/apps/emails_worker/src/utils/analytics.ts delete mode 100644 services/apps/emails_worker/src/utils/date.ts delete mode 100644 services/apps/emails_worker/src/workflows.ts delete mode 100644 services/apps/emails_worker/src/workflows/eagleye-digest/getAndSendNextEmails.ts delete mode 100644 services/apps/emails_worker/src/workflows/eagleye-digest/sendEmailAndUpdateHistory.ts delete mode 100644 services/apps/emails_worker/src/workflows/weekly-analytics/getAndSendNextEmails.ts delete mode 100644 services/apps/emails_worker/src/workflows/weekly-analytics/sendEmailAndUpdateHistory.ts delete mode 100644 services/apps/emails_worker/tsconfig.json diff --git a/backend/config/custom-environment-variables.json b/backend/config/custom-environment-variables.json index 666581c176..96395f9c92 100644 --- a/backend/config/custom-environment-variables.json +++ b/backend/config/custom-environment-variables.json @@ -63,23 +63,13 @@ "clearbit": { "apiKey": "CROWD_CLEARBIT_API_KEY" }, - "netlify": { - "apiKey": "CROWD_NETLIFY_API_KEY", - "siteDomain": "CROWD_NETLIFY_SITE_DOMAIN" - }, "sendgrid": { "key": "CROWD_SENDGRID_KEY", "webhookSigningSecret": "CROWD_SENDGRID_WEBHOOK_SIGNING_SECRET", "emailFrom": "CROWD_SENDGRID_EMAIL_FROM", "nameFrom": "CROWD_SENDGRID_NAME_FROM", - "templateEmailAddressVerification": "CROWD_SENDGRID_TEMPLATE_EMAIL_ADDRESS_VERIFICATION", - "templateInvitation": "CROWD_SENDGRID_TEMPLATE_INVITATION", - "templatePasswordReset": "CROWD_SENDGRID_TEMPLATE_PASSWORD_RESET", - "templateWeeklyAnalytics": "CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS", - "templateIntegrationDone": "CROWD_SENDGRID_TEMPLATE_INTEGRATION_DONE", "templateCsvExport": "CROWD_SENDGRID_TEMPLATE_CSV_EXPORT", - "templateEagleEyeDigest": "CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST", - "weeklyAnalyticsUnsubscribeGroupId": "CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID" + "templateEagleEyeDigest": "CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST" }, "twitter": { "clientId": "CROWD_TWITTER_CLIENT_ID", diff --git a/backend/config/default.json b/backend/config/default.json index d6f5ccad63..8f5753a3e7 100644 --- a/backend/config/default.json +++ b/backend/config/default.json @@ -18,7 +18,6 @@ "aws": {} }, "clearbit": {}, - "netlify": {}, "sendgrid": {}, "twitter": { "maxRetrospectInSeconds": 7380, @@ -42,12 +41,6 @@ "slackAlerting": { "url": "" }, - "sampleData": { - "tenantId": "" - }, - "weeklyEmails": { - "enabled": "true" - }, "auth0": {}, "sso": {}, "crowdAnalytics": { diff --git a/backend/src/api/user/index.ts b/backend/src/api/user/index.ts index c21a3639cb..7271f4bdd2 100644 --- a/backend/src/api/user/index.ts +++ b/backend/src/api/user/index.ts @@ -1,10 +1,6 @@ import { safeWrap } from '../../middlewares/errorMiddleware' export default (app) => { - app.post(`/tenant/:tenantId/user`, safeWrap(require('./userCreate').default)) - app.put(`/tenant/:tenantId/user`, safeWrap(require('./userEdit').default)) - app.post(`/tenant/:tenantId/user/import`, safeWrap(require('./userImport').default)) - app.delete(`/tenant/:tenantId/user`, safeWrap(require('./userDestroy').default)) app.get(`/tenant/:tenantId/user`, safeWrap(require('./userList').default)) app.get(`/tenant/:tenantId/user/autocomplete`, safeWrap(require('./userAutocomplete').default)) app.get(`/tenant/:tenantId/user/:id`, safeWrap(require('./userFind').default)) diff --git a/backend/src/api/user/userCreate.ts b/backend/src/api/user/userCreate.ts deleted file mode 100644 index ea6046589a..0000000000 --- a/backend/src/api/user/userCreate.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import PermissionChecker from '../../services/user/permissionChecker' -import UserCreator from '../../services/user/userCreator' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.userCreate) - - const creator = new UserCreator(req) - - const payload = await creator.execute(req.body) - - track('User Invited', { ...req.body }, { ...req }) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/user/userDestroy.ts b/backend/src/api/user/userDestroy.ts deleted file mode 100644 index 21412d2f96..0000000000 --- a/backend/src/api/user/userDestroy.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Permissions from '../../security/permissions' -import PermissionChecker from '../../services/user/permissionChecker' -import UserDestroyer from '../../services/user/userDestroyer' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.userDestroy) - - const remover = new UserDestroyer(req) - - await remover.destroyAll(req.query) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/user/userEdit.ts b/backend/src/api/user/userEdit.ts deleted file mode 100644 index 5d06660df3..0000000000 --- a/backend/src/api/user/userEdit.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Permissions from '../../security/permissions' -import PermissionChecker from '../../services/user/permissionChecker' -import UserEditor from '../../services/user/userEditor' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.userEdit) - - const editor = new UserEditor(req) - - await editor.update(req.body) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/user/userImport.ts b/backend/src/api/user/userImport.ts deleted file mode 100644 index 382a668d8f..0000000000 --- a/backend/src/api/user/userImport.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Permissions from '../../security/permissions' -import PermissionChecker from '../../services/user/permissionChecker' -import UserImporter from '../../services/user/userImporter' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.userImport) - - await new UserImporter(req).import(req.body, req.body.importHash) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/conf/configTypes.ts b/backend/src/conf/configTypes.ts index 46c04e25a1..ba7517ead0 100644 --- a/backend/src/conf/configTypes.ts +++ b/backend/src/conf/configTypes.ts @@ -112,14 +112,6 @@ export interface GoogleConfiguration { callbackUrl: string } -export interface DiscordConfiguration { - token: string - token2: string - maxRetrospectInSeconds: number - globalLimit?: number - limitResetFrequencyDays?: number -} - export interface GithubConfiguration { appId: string clientId: string @@ -131,26 +123,6 @@ export interface GithubConfiguration { callbackUrl: string } -export interface SendgridConfiguration { - key: string - webhookSigningSecret: string - emailFrom: string - nameFrom: string - templateEmailAddressVerification: string - templateInvitation: string - templatePasswordReset: string - templateWeeklyAnalytics: string - templateIntegrationDone: string - templateCsvExport: string - templateEagleEyeDigest: string - weeklyAnalyticsUnsubscribeGroupId: string -} - -export interface NetlifyConfiguration { - apiKey: string - siteDomain: string -} - export interface NangoConfiguration { url: string secretKey: string diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index b9e5e14c21..ebd8f0bed1 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -13,7 +13,6 @@ import { ComprehendConfiguration, CrowdAnalyticsConfiguration, DbConfiguration, - DiscordConfiguration, EagleEyeConfiguration, EncryptionConfiguration, EnrichmentConfiguration, @@ -27,13 +26,11 @@ import { IRedditConfig, IntegrationProcessingConfiguration, NangoConfiguration, - NetlifyConfiguration, OrganizationEnrichmentConfiguration, S3Configuration, SSOConfiguration, SampleDataConfiguration, SegmentConfiguration, - SendgridConfiguration, ServiceType, SlackAlertingConfiguration, SlackConfiguration, @@ -109,8 +106,6 @@ export const SLACK_NOTIFIER_CONFIG: SlackNotifierConfiguration = export const GOOGLE_CONFIG: GoogleConfiguration = config.get('google') -export const DISCORD_CONFIG: DiscordConfiguration = config.get('discord') - export const GITHUB_CONFIG: GithubConfiguration = config.get('github') export const GITHUB_ISSUE_REPORTER_CONFIG: IGithubIssueReporterConfiguration = @@ -119,10 +114,6 @@ export const GITHUB_ISSUE_REPORTER_CONFIG: IGithubIssueReporterConfiguration = export const JIRA_ISSUE_REPORTER_CONFIG: IJiraIssueReporterConfiguration = config.get('jiraIssueReporter') -export const SENDGRID_CONFIG: SendgridConfiguration = config.get('sendgrid') - -export const NETLIFY_CONFIG: NetlifyConfiguration = config.get('netlify') - export const NANGO_CONFIG: NangoConfiguration = config.get('nango') export const ENRICHMENT_CONFIG: EnrichmentConfiguration = diff --git a/backend/src/security/permissions.ts b/backend/src/security/permissions.ts index 5664d26766..0e5bd490eb 100644 --- a/backend/src/security/permissions.ts +++ b/backend/src/security/permissions.ts @@ -15,22 +15,6 @@ class Permissions { id: 'tenantDestroy', allowedRoles: [roles.admin, roles.projectAdmin], }, - userEdit: { - id: 'userEdit', - allowedRoles: [roles.admin, roles.projectAdmin], - }, - userDestroy: { - id: 'userDestroy', - allowedRoles: [roles.admin, roles.projectAdmin], - }, - userCreate: { - id: 'userCreate', - allowedRoles: [roles.admin, roles.projectAdmin], - }, - userImport: { - id: 'userImport', - allowedRoles: [roles.admin, roles.projectAdmin], - }, userRead: { id: 'userRead', allowedRoles: [roles.admin, roles.projectAdmin], diff --git a/backend/src/services/auth/authService.ts b/backend/src/services/auth/authService.ts index 028f29d108..585b21d22e 100644 --- a/backend/src/services/auth/authService.ts +++ b/backend/src/services/auth/authService.ts @@ -7,15 +7,12 @@ import { getServiceChildLogger } from '@crowd/logging' import { API_CONFIG, SSO_CONFIG } from '../../conf' import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import TenantRepository from '../../database/repositories/tenantRepository' import TenantUserRepository from '../../database/repositories/tenantUserRepository' import UserRepository from '../../database/repositories/userRepository' import Roles from '../../security/roles' import identify from '../../segment/identify' import track from '../../segment/track' -import EmailSender from '../emailSender' import TenantService from '../tenantService' -import { tenantSubdomain } from '../tenantSubdomain' const BCRYPT_SALT_ROUNDS = 12 @@ -80,33 +77,6 @@ class AuthService { }, ) - // Email may have been alreadyverified using the invitation token - const isEmailVerified = Boolean( - await UserRepository.count( - { - emailVerified: true, - id: existingUser.id, - }, - { - ...options, - transaction, - }, - ), - ) - - if (!isEmailVerified && EmailSender.isConfigured) { - await this.sendEmailAddressVerificationEmail( - options.language, - existingUser.email, - tenantId, - { - ...options, - transaction, - bypassPermissionValidation: true, - }, - ) - } - const token = jwt.sign({ id: existingUser.id }, API_CONFIG.jwtSecret, { expiresIn: API_CONFIG.jwtExpiresIn, }) @@ -158,27 +128,6 @@ class AuthService { }, ) - // Email may have been alreadyverified using the invitation token - const isEmailVerified = Boolean( - await UserRepository.count( - { - emailVerified: true, - id: newUser.id, - }, - { - ...options, - transaction, - }, - ), - ) - - if (!isEmailVerified && EmailSender.isConfigured) { - await this.sendEmailAddressVerificationEmail(options.language, newUser.email, tenantId, { - ...options, - transaction, - }) - } - // Identify in Segment identify(newUser) track( @@ -355,9 +304,7 @@ class AuthService { return } - // If the email sender id not configured, - // removes the need for email verification. - if (user && !EmailSender.isConfigured) { + if (user) { user.emailVerified = true } @@ -368,96 +315,6 @@ class AuthService { }) } - static async sendEmailAddressVerificationEmail(language, email, tenantId, options) { - if (!EmailSender.isConfigured) { - throw new Error400(language, 'email.error') - } - - let link - try { - let tenant - - if (tenantId) { - tenant = await TenantRepository.findById(tenantId, { - ...options, - }) - } - - email = email.toLowerCase() - const token = await UserRepository.generateEmailVerificationToken(email, options) - link = `${tenantSubdomain.frontendUrl(tenant)}/auth/verify-email?token=${token}` - } catch (error) { - log.error(error, 'Error sending email address verification email!') - throw new Error400(language, 'auth.emailAddressVerificationEmail.error') - } - - return new EmailSender(EmailSender.TEMPLATES.EMAIL_ADDRESS_VERIFICATION, { link }).sendTo(email) - } - - static async sendPasswordResetEmail(language, email, tenantId, options) { - if (!EmailSender.isConfigured) { - throw new Error400(language, 'email.error') - } - - let link - - try { - let tenant - - if (tenantId) { - tenant = await TenantRepository.findById(tenantId, { - ...options, - }) - } - - email = email.toLowerCase() - const token = await UserRepository.generatePasswordResetToken(email, options) - - link = `${tenantSubdomain.frontendUrl(tenant)}/auth/password-reset?token=${token}` - } catch (error) { - log.error(error, 'Error sending password reset email') - throw new Error400(language, 'auth.passwordReset.error') - } - - return new EmailSender(EmailSender.TEMPLATES.PASSWORD_RESET, { link }).sendTo(email) - } - - static async verifyEmail(token, options) { - const { currentUser } = options - - const user = await UserRepository.findByEmailVerificationToken(token, options) - - if (!user) { - throw new Error400(options.language, 'auth.emailAddressVerificationEmail.invalidToken') - } - - if (currentUser && currentUser.id && currentUser.id !== user.id) { - throw new Error400( - options.language, - 'auth.emailAddressVerificationEmail.signedInAsWrongUser', - user.email, - currentUser.email, - ) - } - - return UserRepository.markEmailVerified(user.id, options) - } - - static async passwordReset(token, password, options: any = {}) { - const user = await UserRepository.findByPasswordResetToken(token, options) - - if (!user) { - throw new Error400(options.language, 'auth.passwordReset.invalidToken') - } - - const hashedPassword = await bcrypt.hash(password, BCRYPT_SALT_ROUNDS) - - return UserRepository.updatePassword(user.id, hashedPassword, true, { - ...options, - bypassPermissionValidation: true, - }) - } - static async changePassword(oldPassword, newPassword, options) { const { currentUser } = options const currentPassword = await UserRepository.findPassword(options.currentUser.id, options) diff --git a/backend/src/services/emailSender.ts b/backend/src/services/emailSender.ts deleted file mode 100644 index 5e46f3c191..0000000000 --- a/backend/src/services/emailSender.ts +++ /dev/null @@ -1,93 +0,0 @@ -import sendgridMail from '@sendgrid/mail' -import assert from 'assert' - -import { LoggerBase } from '@crowd/logging' - -import { API_CONFIG, SENDGRID_CONFIG } from '../conf' - -import { AdvancedSuppressionManager } from './helpers/sendgridAsmType' - -export default class EmailSender extends LoggerBase { - templateId: string - - variables: any - - tenantId: string - - constructor(templateId, variables, tenantId = null) { - super() - this.templateId = templateId - this.variables = variables - this.tenantId = tenantId - if (SENDGRID_CONFIG.key) { - sendgridMail.setApiKey(SENDGRID_CONFIG.key) - } - } - - static get TEMPLATES() { - if (!EmailSender.isConfigured) { - return {} - } - - return { - EMAIL_ADDRESS_VERIFICATION: SENDGRID_CONFIG.templateEmailAddressVerification, - INVITATION: SENDGRID_CONFIG.templateInvitation, - PASSWORD_RESET: SENDGRID_CONFIG.templatePasswordReset, - WEEKLY_ANALYTICS: SENDGRID_CONFIG.templateWeeklyAnalytics, - INTEGRATION_DONE: SENDGRID_CONFIG.templateIntegrationDone, - CSV_EXPORT: SENDGRID_CONFIG.templateCsvExport, - EAGLE_EYE_DIGEST: SENDGRID_CONFIG.templateEagleEyeDigest, - } - } - - /** - * Sends an email to given recipient using sendgrid dynamic templates. - * @param {string} recipient recipient email address - * @param asm sendgrid advanced suppression manager for managing unsubscribe groups - * @returns - */ - async sendTo(recipient: string, asm?: AdvancedSuppressionManager): Promise { - if (!EmailSender.isConfigured) { - this.log.error('Email provider is not configured.') - return undefined - } - - assert(recipient, 'to is required') - assert(SENDGRID_CONFIG.emailFrom, 'SENDGRID_EMAIL_FROM is required') - assert(this.templateId, 'templateId is required') - - const msg = { - to: recipient, - from: { - name: SENDGRID_CONFIG.nameFrom, - email: SENDGRID_CONFIG.emailFrom, - }, - templateId: this.templateId, - dynamicTemplateData: { - ...this.variables, - appHost: API_CONFIG.frontendUrl, - }, - } as any - - if (this.tenantId) { - msg.custom_args = { - tenantId: this.tenantId, - } - } - - if (asm) { - msg.asm = asm - } - - try { - return await sendgridMail.send(msg) - } catch (error) { - this.log.error(error, 'Error sending SendGrid email.') - throw error - } - } - - static get isConfigured() { - return Boolean(SENDGRID_CONFIG.emailFrom && SENDGRID_CONFIG.key) - } -} diff --git a/backend/src/services/user/permissionChecker.ts b/backend/src/services/user/permissionChecker.ts index 05e42d47a0..5ae7db264a 100644 --- a/backend/src/services/user/permissionChecker.ts +++ b/backend/src/services/user/permissionChecker.ts @@ -5,7 +5,6 @@ import { Error400, Error403 } from '@crowd/common' import Permissions from '../../security/permissions' import Roles from '../../security/roles' -import EmailSender from '../emailSender' const roles = Roles.values @@ -144,12 +143,6 @@ export default class PermissionChecker { } private get isEmailVerified() { - // Only checks if the email is verified - // if the email system is on - if (!EmailSender.isConfigured) { - return true - } - return this.currentUser.emailVerified } diff --git a/backend/src/services/user/userCreator.ts b/backend/src/services/user/userCreator.ts deleted file mode 100644 index d3d6ddb705..0000000000 --- a/backend/src/services/user/userCreator.ts +++ /dev/null @@ -1,174 +0,0 @@ -import assert from 'assert' - -import { Error409 } from '@crowd/common' - -import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import TenantUserRepository from '../../database/repositories/tenantUserRepository' -import UserRepository from '../../database/repositories/userRepository' -import { IServiceOptions } from '../IServiceOptions' -import EmailSender from '../emailSender' -import { tenantSubdomain } from '../tenantSubdomain' - -export default class UserCreator { - options: IServiceOptions - - transaction - - data - - emailsToInvite: Array = [] - - emails: any = [] - - sendInvitationEmails = true - - constructor(options) { - this.options = options - } - - /** - * Creates new user(s) via the User page. - * Sends Invitation Emails if flagged. - */ - async execute(data, sendInvitationEmails = true) { - this.data = data - this.sendInvitationEmails = sendInvitationEmails - - await this._validate() - - try { - this.transaction = await SequelizeRepository.createTransaction(this.options) - - await this._addOrUpdateAll() - - await SequelizeRepository.commitTransaction(this.transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(this.transaction) - throw error - } - - if (this._hasEmailsToInvite) { - await this._sendAllInvitationEmails() - } else { - throw new Error409('en', 'user.errors.userAlreadyExists') - } - - return this.emailsToInvite - } - - get _roles() { - if (this.data.roles && !Array.isArray(this.data.roles)) { - return [this.data.roles] - } - const uniqueRoles = [...new Set(this.data.roles)] - return uniqueRoles - } - - get _emails() { - if (this.data.emails && !Array.isArray(this.data.emails)) { - this.emails = [this.data.emails] - } else { - const uniqueEmails = [...new Set(this.data.emails)] - this.emails = uniqueEmails - } - - return this.emails.map((email) => email.trim()) - } - - /** - * Creates or updates many users at once. - */ - async _addOrUpdateAll() { - return Promise.all(this.emails.map((email) => this._addOrUpdate(email))) - } - - /** - * Creates or updates the user passed. - * If the user already exists, it only adds the role to the user. - */ - async _addOrUpdate(email) { - let user = await UserRepository.findByEmailWithoutAvatar(email, { - ...this.options, - transaction: this.transaction, - }) - - if (!user) { - user = await UserRepository.create( - { email }, - { - ...this.options, - transaction: this.transaction, - }, - ) - } - - const isUserAlreadyInTenant = user.tenants.some( - (userTenant) => userTenant.tenant.id === this.options.currentTenant.id, - ) - - const tenantUser = await TenantUserRepository.updateRoles( - this.options.currentTenant.id, - user.id, - this._roles, - { - ...this.options, - addRoles: true, - transaction: this.transaction, - }, - true, - ) - - if (!isUserAlreadyInTenant) { - this.emailsToInvite.push({ - email, - token: tenantUser.invitationToken, - }) - } - } - - /** - * Verify if there are emails to invite. - */ - get _hasEmailsToInvite() { - return this.emailsToInvite && this.emailsToInvite.length - } - - /** - * Sends all invitation emails. - */ - async _sendAllInvitationEmails() { - if (!this.sendInvitationEmails) { - return undefined - } - - return Promise.all( - this.emailsToInvite.map((emailToInvite) => { - const link = `${tenantSubdomain.frontendUrl( - this.options.currentTenant, - )}/auth/invitation?token=${emailToInvite.token}` - - return new EmailSender(EmailSender.TEMPLATES.INVITATION, { - tenant: this.options.currentTenant, - link, - }).sendTo(emailToInvite.email) - }), - ) - } - - /** - * Validates the user(s) data. - */ - async _validate() { - assert(this.options.currentUser, 'currentUser is required') - - assert(this.options.currentTenant.id, 'tenantId is required') - - assert(this.options.currentUser.id, 'currentUser.id is required') - - assert(this.options.currentUser.email, 'currentUser.email is required') - - assert(this._emails && this._emails.length, 'emails is required') - - assert(this._roles && this._roles.length, 'roles is required') - } -} diff --git a/backend/src/services/user/userDestroyer.ts b/backend/src/services/user/userDestroyer.ts deleted file mode 100644 index 312ad3280e..0000000000 --- a/backend/src/services/user/userDestroyer.ts +++ /dev/null @@ -1,81 +0,0 @@ -import assert from 'assert' - -import { Error400 } from '@crowd/common' - -import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import TenantUserRepository from '../../database/repositories/tenantUserRepository' -import UserRepository from '../../database/repositories/userRepository' -import { IServiceOptions } from '../IServiceOptions' - -/** - * Handles removing the permissions of the users. - */ -export default class UserDestroyer { - options: IServiceOptions - - transaction - - data - - constructor(options) { - this.options = options - } - - /** - * Removes all passed users. - */ - async destroyAll(data) { - this.data = data - - await this._validate() - - try { - this.transaction = await SequelizeRepository.createTransaction(this.options) - - await Promise.all(this._ids.map((id) => this._destroy(id))) - - return await SequelizeRepository.commitTransaction(this.transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(this.transaction) - throw error - } - } - - get _ids() { - let ids - - if (this.data.ids && !Array.isArray(this.data.ids)) { - ids = [this.data.ids] - } else { - const uniqueIds = [...new Set(this.data.ids)] - ids = uniqueIds - } - - return ids.map((id) => id.trim()) - } - - async _destroy(id) { - const user = await UserRepository.findByIdWithoutAvatar(id, this.options) - - await TenantUserRepository.destroy(this.options.currentTenant.id, user.id, this.options) - } - - /** - * Checks if the user is removing himself - */ - _isRemovingHimself() { - return this._ids.includes(String(this.options.currentUser.id)) - } - - async _validate() { - assert(this.options.currentTenant.id, 'tenantId is required') - assert(this.options.currentUser, 'currentUser is required') - assert(this.options.currentUser.id, 'currentUser.id is required') - assert(this.options.currentUser.email, 'currentUser.email is required') - assert(this._ids && this._ids.length, 'ids is required') - - if (this._isRemovingHimself()) { - throw new Error400(this.options.language, 'user.errors.destroyingHimself') - } - } -} diff --git a/backend/src/services/user/userEditor.ts b/backend/src/services/user/userEditor.ts deleted file mode 100644 index aa00e8aab7..0000000000 --- a/backend/src/services/user/userEditor.ts +++ /dev/null @@ -1,134 +0,0 @@ -import assert from 'assert' - -import { Error400 } from '@crowd/common' - -import SequelizeRepository from '../../database/repositories/sequelizeRepository' -import TenantUserRepository from '../../database/repositories/tenantUserRepository' -import UserRepository from '../../database/repositories/userRepository' -import Roles from '../../security/roles' -import { IServiceOptions } from '../IServiceOptions' - -/** - * Handles the edition of the user(s) via the User page. - */ -export default class UserEditor { - options: IServiceOptions - - data - - transaction - - user - - constructor(options) { - this.options = options - } - - /** - * Updates a user via the User page. - */ - async update(data) { - this.data = data - - await this._validate() - - try { - this.transaction = await SequelizeRepository.createTransaction(this.options) - - await this._loadUser() - await this._updateAtDatabase() - - await SequelizeRepository.commitTransaction(this.transaction) - } catch (error) { - await SequelizeRepository.rollbackTransaction(this.transaction) - - throw error - } - } - - get _roles() { - if (this.data.roles && !Array.isArray(this.data.roles)) { - return [this.data.roles] - } - const uniqueRoles = [...new Set(this.data.roles)] - return uniqueRoles - } - - /** - * Loads the user and validate that it exists. - */ - async _loadUser() { - this.user = await UserRepository.findById(this.data.id, this.options) - - if (!this.user) { - throw new Error400(this.options.language, 'user.errors.userNotFound') - } - } - - /** - * Updates the user at the database. - */ - async _updateAtDatabase() { - await TenantUserRepository.updateRoles( - this.options.currentTenant.id, - this.data.id, - this.data.roles, - this.options, - ) - } - - /** - * Checks if the user is removing the responsable for the plan - */ - async _isRemovingPlanUser() { - if (this._roles.includes(Roles.values.admin)) { - return false - } - - const { currentTenant } = this.options - - if (!currentTenant.planUserId) { - return false - } - - return String(this.data.id) === String(currentTenant.planUserId) - } - - /** - * Checks if the user is removing it's own admin role - */ - async _isRemovingOwnAdminRole() { - if (this._roles.includes(Roles.values.admin)) { - return false - } - - if (String(this.data.id) !== String(this.options.currentUser.id)) { - return false - } - - const tenantUser = this.options.currentUser.tenants.find( - (userTenant) => userTenant.tenant.id === this.options.currentTenant.id, - ) - - return tenantUser.roles.includes(Roles.values.admin) - } - - async _validate() { - assert(this.options.currentTenant.id, 'tenantId is required') - - assert(this.options.currentUser, 'currentUser is required') - assert(this.options.currentUser.id, 'currentUser.id is required') - assert(this.options.currentUser.email, 'currentUser.email is required') - - assert(this.data.id, 'id is required') - assert(this._roles, 'roles is required (can be empty)') - - if (await this._isRemovingPlanUser()) { - throw new Error400(this.options.language, 'user.errors.revokingPlanUser') - } - - if (await this._isRemovingOwnAdminRole()) { - throw new Error400(this.options.language, 'user.errors.revokingOwnPermission') - } - } -} diff --git a/backend/src/services/user/userImporter.ts b/backend/src/services/user/userImporter.ts deleted file mode 100644 index 2f78436b82..0000000000 --- a/backend/src/services/user/userImporter.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Error400 } from '@crowd/common' - -import UserRepository from '../../database/repositories/userRepository' -import { IServiceOptions } from '../IServiceOptions' - -import UserCreator from './userCreator' - -/** - * Flags if should send invitation emails for imported users. - */ -const SEND_INVITATION_EMAIL = false - -export default class UserImporter { - options: IServiceOptions - - constructor(options) { - this.options = options - } - - async import(data, importHash) { - if (!importHash) { - throw new Error400(this.options.language, 'importer.errors.importHashRequired') - } - - if (await this._isImportHashExistent(importHash)) { - throw new Error400(this.options.language, 'importer.errors.importHashExistent') - } - - const dataToCreate = { - emails: [data.email], - ...data, - importHash, - } - - return new UserCreator(this.options).execute(dataToCreate, SEND_INVITATION_EMAIL) - } - - async _isImportHashExistent(importHash) { - const count = await UserRepository.count( - { - importHash, - }, - this.options, - ) - return count > 0 - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 967cb435cb..e6a2ea6e40 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -675,67 +675,6 @@ importers: specifier: ^2.0.22 version: 2.0.22 - services/apps/emails_worker: - dependencies: - '@crowd/archetype-standard': - specifier: workspace:* - version: link:../../archetypes/standard - '@crowd/archetype-worker': - specifier: workspace:* - version: link:../../archetypes/worker - '@crowd/common': - specifier: workspace:* - version: link:../../libs/common - '@crowd/data-access-layer': - specifier: workspace:* - version: link:../../libs/data-access-layer - '@crowd/integrations': - specifier: workspace:* - version: link:../../libs/integrations - '@crowd/types': - specifier: workspace:* - version: link:../../libs/types - '@sendgrid/mail': - specifier: ~7.7.0 - version: 7.7.0 - '@temporalio/client': - specifier: ~1.11.1 - version: 1.11.5 - '@temporalio/workflow': - specifier: ~1.11.1 - version: 1.11.5 - axios: - specifier: ~1.5.1 - version: 1.5.1 - html-to-text: - specifier: ~9.0.5 - version: 9.0.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - moment: - specifier: ~2.29.4 - version: 2.29.4 - tsx: - specifier: ^4.7.1 - version: 4.19.2 - typescript: - specifier: ^5.6.3 - version: 5.7.2 - uuid: - specifier: ~9.0.1 - version: 9.0.1 - devDependencies: - '@types/node': - specifier: ^20.8.2 - version: 20.17.12 - '@types/uuid': - specifier: ~9.0.6 - version: 9.0.8 - nodemon: - specifier: ^3.0.1 - version: 3.1.9 - services/apps/entity_merging_worker: dependencies: '@crowd/archetype-standard': @@ -3597,26 +3536,14 @@ packages: '@selderee/plugin-htmlparser2@0.6.0': resolution: {integrity: sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==} - '@sendgrid/client@7.7.0': - resolution: {integrity: sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==} - engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/client@8.1.4': resolution: {integrity: sha512-VxZoQ82MpxmjSXLR3ZAE2OWxvQIW2k2G24UeRPr/SYX8HqWLV/8UBN15T2WmjjnEb5XSmFImTJOKDzzSeKr9YQ==} engines: {node: '>=12.*'} - '@sendgrid/helpers@7.7.0': - resolution: {integrity: sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==} - engines: {node: '>= 6.0.0'} - '@sendgrid/helpers@8.0.0': resolution: {integrity: sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==} engines: {node: '>= 12.0.0'} - '@sendgrid/mail@7.7.0': - resolution: {integrity: sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==} - engines: {node: 6.* || 8.* || >=10.*} - '@sendgrid/mail@8.1.4': resolution: {integrity: sha512-MUpIZykD9ARie8LElYCqbcBhGGMaA/E6I7fEcG7Hc2An26QJyLtwOaKQ3taGp8xO8BICPJrSKuYV4bDeAJKFGQ==} engines: {node: '>=12.*'} @@ -4661,15 +4588,9 @@ packages: axios-retry@3.2.0: resolution: {integrity: sha512-RK2cLMgIsAQBDhlIsJR5dOhODPigvel18XUv1dDXW+4k1FzebyfRk+C+orot6WPZOYFKSfhLwHPwVmTVOODQ5w==} - axios@0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} - axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.5.1: - resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} - axios@1.6.8: resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} @@ -11791,13 +11712,6 @@ snapshots: domhandler: 4.3.1 selderee: 0.6.0 - '@sendgrid/client@7.7.0': - dependencies: - '@sendgrid/helpers': 7.7.0 - axios: 0.26.1 - transitivePeerDependencies: - - debug - '@sendgrid/client@8.1.4': dependencies: '@sendgrid/helpers': 8.0.0 @@ -11805,21 +11719,10 @@ snapshots: transitivePeerDependencies: - debug - '@sendgrid/helpers@7.7.0': - dependencies: - deepmerge: 4.3.1 - '@sendgrid/helpers@8.0.0': dependencies: deepmerge: 4.3.1 - '@sendgrid/mail@7.7.0': - dependencies: - '@sendgrid/client': 7.7.0 - '@sendgrid/helpers': 7.7.0 - transitivePeerDependencies: - - debug - '@sendgrid/mail@8.1.4': dependencies: '@sendgrid/client': 8.1.4 @@ -13177,12 +13080,6 @@ snapshots: dependencies: is-retry-allowed: 1.2.0 - axios@0.26.1: - dependencies: - follow-redirects: 1.15.9 - transitivePeerDependencies: - - debug - axios@0.27.2: dependencies: follow-redirects: 1.15.9 @@ -13190,14 +13087,6 @@ snapshots: transitivePeerDependencies: - debug - axios@1.5.1: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.6.8: dependencies: follow-redirects: 1.15.9 diff --git a/scripts/builders/emails-worker.env b/scripts/builders/emails-worker.env deleted file mode 100644 index c9c5583269..0000000000 --- a/scripts/builders/emails-worker.env +++ /dev/null @@ -1,4 +0,0 @@ -DOCKERFILE="./services/docker/Dockerfile.emails_worker" -CONTEXT="../" -REPO="crowddotdev/emails-worker" -SERVICES="emails-worker" \ No newline at end of file diff --git a/scripts/cli b/scripts/cli index a68ccee589..d972808c0d 100755 --- a/scripts/cli +++ b/scripts/cli @@ -761,7 +761,7 @@ while test $# -gt 0; do exit ;; start-dev) - INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker" "automations-worker") DEV=1 start exit @@ -772,7 +772,7 @@ while test $# -gt 0; do exit ;; clean-start-dev) - # INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + # INGORED_SERVICES=("python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker" "automations-worker") CLEAN_START=1 DEV=1 start @@ -857,14 +857,14 @@ while test $# -gt 0; do exit ;; service-restart-fe-dev) - IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker" "automations-worker") DEV=1 kill_all_containers service_start exit ;; clean-start-fe-dev) - INGORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("frontend" "python-worker" "job-generator" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker" "automations-worker") CLEAN_START=1 DEV=1 start diff --git a/scripts/services/docker/Dockerfile.emails_worker b/scripts/services/docker/Dockerfile.emails_worker deleted file mode 100644 index 8778e588d7..0000000000 --- a/scripts/services/docker/Dockerfile.emails_worker +++ /dev/null @@ -1,23 +0,0 @@ -FROM node:20-alpine as builder - -RUN apk add --no-cache python3 make g++ - -WORKDIR /usr/crowd/app -RUN corepack enable - -COPY ./pnpm-workspace.yaml ./pnpm-lock.yaml ./ -RUN pnpm fetch - -COPY ./services ./services -RUN pnpm i --frozen-lockfile - -FROM node:20-bookworm-slim as runner - -WORKDIR /usr/crowd/app -RUN corepack enable && apt update && apt install -y ca-certificates --no-install-recommends && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /usr/crowd/app/node_modules ./node_modules -COPY --from=builder /usr/crowd/app/services/base.tsconfig.json ./services/base.tsconfig.json -COPY --from=builder /usr/crowd/app/services/libs ./services/libs -COPY --from=builder /usr/crowd/app/services/archetypes/ ./services/archetypes -COPY --from=builder /usr/crowd/app/services/apps/emails_worker/ ./services/apps/emails_worker diff --git a/scripts/services/docker/Dockerfile.emails_worker.dockerignore b/scripts/services/docker/Dockerfile.emails_worker.dockerignore deleted file mode 100644 index 4eaeed9149..0000000000 --- a/scripts/services/docker/Dockerfile.emails_worker.dockerignore +++ /dev/null @@ -1,19 +0,0 @@ -**/.git -**/node_modules -**/venv* -**/.webpack -**/.serverless -**/.env -**/.env.* -**/.idea -**/.vscode -**/dist -backend/src/serverless/microservices/python -.vscode/ -.github/ -frontend/ -scripts/ -.flake8 -*.md -Makefile -backend/ \ No newline at end of file diff --git a/scripts/services/emails-worker.yaml b/scripts/services/emails-worker.yaml deleted file mode 100644 index b55108a19d..0000000000 --- a/scripts/services/emails-worker.yaml +++ /dev/null @@ -1,65 +0,0 @@ -version: '3.1' - -x-env-args: &env-args - DOCKER_BUILDKIT: 1 - NODE_ENV: docker - SERVICE: emails-worker - CROWD_TEMPORAL_TASKQUEUE: emails - SHELL: /bin/sh - -services: - emails-worker: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.emails_worker - command: 'pnpm run start' - working_dir: /usr/crowd/app/services/apps/emails_worker - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - restart: always - networks: - - crowd-bridge - - emails-worker-dev: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.emails_worker - command: 'pnpm run dev' - working_dir: /usr/crowd/app/services/apps/emails_worker - # user: '${USER_ID}:${GROUP_ID}' - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - hostname: emails-worker - networks: - - crowd-bridge - volumes: - - ../../services/libs/audit-logs/src:/usr/crowd/app/services/libs/audit-logs/src - - ../../services/libs/common/src:/usr/crowd/app/services/libs/common/src - - ../../services/libs/common_services/src:/usr/crowd/app/services/libs/common_services/src - - ../../services/libs/data-access-layer/src:/usr/crowd/app/services/libs/data-access-layer/src - - ../../services/libs/database/src:/usr/crowd/app/services/libs/database/src - - ../../services/libs/feature-flags/src:/usr/crowd/app/services/libs/feature-flags/src - - ../../services/libs/integrations/src:/usr/crowd/app/services/libs/integrations/src - - ../../services/libs/logging/src:/usr/crowd/app/services/libs/logging/src - - ../../services/libs/opensearch/src:/usr/crowd/app/services/libs/opensearch/src - - ../../services/libs/questdb/src:/usr/crowd/app/services/libs/questdb/src - - ../../services/libs/queue/src:/usr/crowd/app/services/libs/queue/src - - ../../services/libs/redis/src:/usr/crowd/app/services/libs/redis/src - - ../../services/libs/telemetry/src:/usr/crowd/app/services/libs/telemetry/src - - ../../services/libs/temporal/src:/usr/crowd/app/services/libs/temporal/src - - ../../services/libs/types/src:/usr/crowd/app/services/libs/types/src - - ../../services/apps/emails_worker/src:/usr/crowd/app/services/apps/emails_worker/src - -networks: - crowd-bridge: - external: true diff --git a/services/apps/emails_worker/package.json b/services/apps/emails_worker/package.json deleted file mode 100644 index b636790aa0..0000000000 --- a/services/apps/emails_worker/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@crowd/emails-worker", - "scripts": { - "start": "CROWD_TEMPORAL_TASKQUEUE=emails SERVICE=emails-worker tsx src/main.ts", - "start:debug:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && CROWD_TEMPORAL_TASKQUEUE=emails SERVICE=emails-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9232 src/main.ts", - "start:debug": "CROWD_TEMPORAL_TASKQUEUE=emails SERVICE=emails-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9232 src/main.ts", - "dev:local": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug:local", - "dev": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug", - "lint": "npx eslint --ext .ts src --max-warnings=0", - "format": "npx prettier --write \"src/**/*.ts\"", - "format-check": "npx prettier --check .", - "tsc-check": "tsc --noEmit" - }, - "dependencies": { - "@crowd/archetype-standard": "workspace:*", - "@crowd/archetype-worker": "workspace:*", - "@crowd/common": "workspace:*", - "@crowd/data-access-layer": "workspace:*", - "@crowd/integrations": "workspace:*", - "@crowd/types": "workspace:*", - "@sendgrid/mail": "~7.7.0", - "@temporalio/client": "~1.11.1", - "@temporalio/workflow": "~1.11.1", - "axios": "~1.5.1", - "html-to-text": "~9.0.5", - "lodash": "~4.17.21", - "moment": "~2.29.4", - "tsx": "^4.7.1", - "typescript": "^5.6.3", - "uuid": "~9.0.1" - }, - "devDependencies": { - "@types/node": "^20.8.2", - "@types/uuid": "~9.0.6", - "nodemon": "^3.0.1" - } -} diff --git a/services/apps/emails_worker/src/activities.ts b/services/apps/emails_worker/src/activities.ts deleted file mode 100644 index 353461b57f..0000000000 --- a/services/apps/emails_worker/src/activities.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - eagleeyeBuildEmailContent, - eagleeyeFetchFromDatabase, - eagleeyeFetchFromEagleEye, -} from './activities/eagleeye-digest/buildEmail' -import { eagleeyeGetNextEmails } from './activities/eagleeye-digest/getNextEmails' -import { eagleeyeSendEmail } from './activities/eagleeye-digest/sendEmail' -import { eagleeyeUpdateNextEmailAt } from './activities/eagleeye-digest/updateEmailHistory' -import { updateEmailHistory } from './activities/updateEmailHistory' -import { - getActiveTenantIntegrations, - getNewMembersPreviousWeek, - getNewMembersThisWeek, - getNewOrganizationsPreviousWeek, - getNewOrganizationsThisWeek, - getSegments, - getTenantUsers, - getTotalMembersPreviousWeek, - getTotalMembersThisWeek, - getTotalOrganizationsPreviousWeek, - getTotalOrganizationsThisWeek, -} from './activities/weekly-analytics/buildEmailFromPostgreSQL' -import { - getActiveMembersPreviousWeek, - getActiveMembersThisWeek, - getActiveOrganizationsPreviousWeek, - getActiveOrganizationsThisWeek, - getConversations, - getMostActiveMembersThisWeek, - getMostActiveOrganizationsThisWeek, - getNewActivitiesPreviousWeek, - getNewActivitiesThisWeek, - getTopActivityTypes, - getTotalActivitiesPreviousWeek, - getTotalActivitiesThisWeek, -} from './activities/weekly-analytics/buildEmailFromQuestDB' -import { calculateTimes, weeklyGetNextEmails } from './activities/weekly-analytics/getNextEmails' -import { weeklySendEmail } from './activities/weekly-analytics/sendEmail' - -export { - updateEmailHistory, - eagleeyeGetNextEmails, - eagleeyeBuildEmailContent, - eagleeyeUpdateNextEmailAt, - eagleeyeSendEmail, - eagleeyeFetchFromDatabase, - eagleeyeFetchFromEagleEye, - getTotalMembersThisWeek, - getTotalMembersPreviousWeek, - getActiveMembersThisWeek, - getActiveMembersPreviousWeek, - getNewMembersThisWeek, - getNewMembersPreviousWeek, - getTotalOrganizationsThisWeek, - getTotalOrganizationsPreviousWeek, - getActiveOrganizationsThisWeek, - getActiveOrganizationsPreviousWeek, - getNewOrganizationsThisWeek, - getNewOrganizationsPreviousWeek, - getTotalActivitiesThisWeek, - getTotalActivitiesPreviousWeek, - getNewActivitiesThisWeek, - getNewActivitiesPreviousWeek, - getTenantUsers, - getSegments, - getMostActiveMembersThisWeek, - getMostActiveOrganizationsThisWeek, - getTopActivityTypes, - getConversations, - getActiveTenantIntegrations, - weeklyGetNextEmails, - calculateTimes, - weeklySendEmail, -} diff --git a/services/apps/emails_worker/src/activities/eagleeye-digest/buildEmail.ts b/services/apps/emails_worker/src/activities/eagleeye-digest/buildEmail.ts deleted file mode 100644 index 08ba390a82..0000000000 --- a/services/apps/emails_worker/src/activities/eagleeye-digest/buildEmail.ts +++ /dev/null @@ -1,105 +0,0 @@ -import axios, { AxiosResponse } from 'axios' -import moment from 'moment' - -import * as eagleeye from '@crowd/data-access-layer/src/old/apps/emails_worker/eagleeye' -import { EagleEyePostWithActions, EagleEyeRawPost } from '@crowd/types' - -import { svc } from '../../main' -import { Content } from '../../types/email' -import { UserTenant } from '../../types/user' -import { switchDate } from '../../utils/date' - -/* -eagleeyeFetchFromEagleEye is a Temporal activity that fetches the content to push -inside an email coming from EagleEye API. -*/ -export async function eagleeyeFetchFromEagleEye(user: UserTenant): Promise { - const feedSettings = user.settings.eagleEye.feed - - const keywords = feedSettings.keywords ? feedSettings.keywords.join(',') : '' - const exactKeywords = feedSettings.exactKeywords ? feedSettings.exactKeywords.join(',') : '' - const excludedKeywords = feedSettings.excludedKeywords - ? feedSettings.excludedKeywords.join(',') - : '' - - const afterDate = moment.utc().format('YYYY-MM-DD') - const config = { - method: 'get', - maxBodyLength: Infinity, - url: process.env['CROWD_EAGLE_EYE_URL'], - params: { - platforms: feedSettings.platforms.join(','), - keywords: keywords, - exact_keywords: exactKeywords, - exclude_keywords: excludedKeywords, - after_date: afterDate, - }, - headers: { - Authorization: `Bearer ${process.env['CROWD_EAGLE_EYE_API_KEY']}`, - }, - } - - let response: AxiosResponse - try { - response = await axios(config) - } catch (err) { - throw new Error(err) - } - - return response.data -} - -/* -eagleeyeFetchFromDatabase is a Temporal activity that fetches the content to push -inside an email coming from the database. -*/ -export async function eagleeyeFetchFromDatabase(user: UserTenant): Promise { - const feedSettings = user.settings.eagleEye.emailDigest.feed || user.settings.eagleEye.feed - const actualdate = switchDate(feedSettings.publishedDate, 90) - - let posts: EagleEyeRawPost[] - try { - posts = await eagleeye.fetchFromDatabase(svc.postgres.reader, user.tenantId, actualdate) - } catch (err) { - throw new Error(err) - } - - return posts -} - -/* -eagleeyeBuildEmailContent is a Temporal activity that builds the content of an -email based on posts previously fetched from EagleEye API and the database. -*/ -export async function eagleeyeBuildEmailContent( - posts: Content, -): Promise { - const interactedMap = {} - for (const item of posts.fromDatabase) { - interactedMap[item.url] = item - } - - const out: EagleEyePostWithActions[] = [] - for (const item of posts.fromEagleEye as EagleEyeRawPost[]) { - const post = { - description: item.description, - thumbnail: item.thumbnail, - title: item.title, - } - - out.push({ - url: item.url, - postedAt: item.date, - post, - platform: item.platform, - actions: interactedMap[item.url] ? interactedMap[item.url].actions : [], - }) - } - - const content = out.slice(0, 10).map((c: EagleEyePostWithActions) => { - c.post.thumbnail = null - return c - }) - - return content -} diff --git a/services/apps/emails_worker/src/activities/eagleeye-digest/getNextEmails.ts b/services/apps/emails_worker/src/activities/eagleeye-digest/getNextEmails.ts deleted file mode 100644 index e3ca04c4bc..0000000000 --- a/services/apps/emails_worker/src/activities/eagleeye-digest/getNextEmails.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as eagleeye from '@crowd/data-access-layer/src/old/apps/emails_worker/eagleeye' - -import { svc } from '../../main' -import { UserTenant } from '../../types/user' - -/* -eagleeyeGetNextEmails is a Temporal activity that fetches all users along their -EagleEye settings to send emails to. This relies on some settings, such as when -the next email should send at. -*/ -export async function eagleeyeGetNextEmails(): Promise { - let rows: UserTenant[] = [] - try { - rows = await eagleeye.getNextEmails(svc.postgres.reader) - } catch (err) { - throw new Error(err) - } - - return rows -} diff --git a/services/apps/emails_worker/src/activities/eagleeye-digest/sendEmail.ts b/services/apps/emails_worker/src/activities/eagleeye-digest/sendEmail.ts deleted file mode 100644 index b3965673a2..0000000000 --- a/services/apps/emails_worker/src/activities/eagleeye-digest/sendEmail.ts +++ /dev/null @@ -1,39 +0,0 @@ -import sendgrid, { MailDataRequired } from '@sendgrid/mail' -import moment from 'moment' - -import { EmailSent, EmailToSend } from '../../types/email' - -/* -eagleeyeSendEmail is a Temporal activity that sends an EagleEye digest email to -a user's email address using the SendGrid API. -*/ -export async function eagleeyeSendEmail(toSend: EmailToSend): Promise { - const email: MailDataRequired = { - to: toSend.settings.eagleEye.emailDigest?.email || toSend.email, - from: { - name: process.env['CROWD_SENDGRID_NAME_FROM'], - email: process.env['CROWD_SENDGRID_EMAIL_FROM'], - }, - templateId: process.env['CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST'], - dynamicTemplateData: { - content: toSend.content, - frequency: toSend.settings.eagleEye.emailDigest.frequency, - date: moment.utc().format('D MMM YYYY'), - appHost: process.env['CROWD_API_FRONTEND_URL'], - }, - customArgs: { - tenantId: toSend.tenantId, - userId: toSend.userId, - }, - } - - try { - await sendgrid.send(email) - } catch (err) { - throw new Error(err) - } - - return { - sentAt: new Date(), - } -} diff --git a/services/apps/emails_worker/src/activities/eagleeye-digest/updateEmailHistory.ts b/services/apps/emails_worker/src/activities/eagleeye-digest/updateEmailHistory.ts deleted file mode 100644 index c4168dc6f3..0000000000 --- a/services/apps/emails_worker/src/activities/eagleeye-digest/updateEmailHistory.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as eagleeye from '@crowd/data-access-layer/src/old/apps/emails_worker/eagleeye' - -import { svc } from '../../main' -import { UserTenantWithEmailSent } from '../../types/user' -import { nextEmailAt } from '../../utils/date' - -/* -eagleeyeUpdateNextEmailAt is a Temporal activity that updates when the next daily -or weekly EagleEye digest email should be send at, depending on the user's settings. -*/ -export async function eagleeyeUpdateNextEmailAt(emailSent: UserTenantWithEmailSent): Promise { - try { - await eagleeye.updateNextEmailAt( - svc.postgres.writer, - emailSent.tenantId, - emailSent.userId, - nextEmailAt(emailSent.settings.eagleEye.emailDigest), - ) - } catch (err) { - throw new Error(err) - } -} diff --git a/services/apps/emails_worker/src/activities/updateEmailHistory.ts b/services/apps/emails_worker/src/activities/updateEmailHistory.ts deleted file mode 100644 index 8142e687c8..0000000000 --- a/services/apps/emails_worker/src/activities/updateEmailHistory.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { updateRecurringEmailsHistory } from '@crowd/data-access-layer/src/old/apps/emails_worker/emails' - -import { svc } from '../main' -import { UserTenantWithEmailSent } from '../types/user' - -/* -updateEmailHistory is a Temporal activity that inserts a new row in the database -informing a new recurring email has been sent to the user. -*/ -export async function updateEmailHistory(emailSent: UserTenantWithEmailSent): Promise { - try { - const db = svc.postgres.writer - const type = emailSent.type - const tenantId = emailSent.tenantId - const sentAt = emailSent.sentAt - const emails = emailSent.emails - const weekOfYear = emailSent.weekOfYear || null - await updateRecurringEmailsHistory(db, type, tenantId, sentAt, emails, weekOfYear) - } catch (err) { - throw new Error(err) - } -} diff --git a/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromPostgreSQL.ts b/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromPostgreSQL.ts deleted file mode 100644 index fa631d90b4..0000000000 --- a/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromPostgreSQL.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { getNumberOfNewMembers } from '@crowd/data-access-layer' -import { - fetchActiveIntegrations, - fetchSegments, - fetchTenantUsers, -} from '@crowd/data-access-layer/src/old/apps/emails_worker/tenants' -import { SegmentRawData } from '@crowd/types' - -import { svc } from '../../main' -import { InputAnalyticsWithSegments, InputAnalyticsWithTimes } from '../../types/analytics' -import { UserTenant } from '../../types/user' - -const db = svc.postgres.reader - -/* -getSegments is a Temporal activity that returns the tenant's segments. -*/ -export async function getSegments(input: InputAnalyticsWithTimes): Promise { - let rows: SegmentRawData[] - - try { - rows = await fetchSegments(db, input.tenantId) - } catch (err) { - throw new Error(err) - } - - return rows -} - -/* -getTenantUsers is a Temporal activity that returns the tenant's users. -*/ -export async function getTenantUsers(input: InputAnalyticsWithTimes): Promise { - let rows: UserTenant[] - - try { - rows = await fetchTenantUsers(db, input.tenantId) - } catch (err) { - throw new Error(err) - } - - return rows -} - -/* -getActiveTenantIntegrations is a Temporal activity that returns the tenant's -active integrations, useful to know if it's required to send a weekly email or -not. -*/ -export async function getActiveTenantIntegrations( - input: InputAnalyticsWithSegments, -): Promise { - let integrations: object[] - - try { - integrations = await fetchActiveIntegrations(db, input.tenantId) - } catch (err) { - throw new Error(err) - } - - return integrations -} - -/* -totalMembersThisWeek is a Temporal activity that returns the total number of -members for a tenant as of this week. -*/ -export async function getTotalMembersThisWeek(input: InputAnalyticsWithTimes): Promise { - let result: number - - try { - result = await getNumberOfNewMembers(db, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.unixEpoch)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - }) - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -totalMembersPreviousWeek is a Temporal activity that returns the total number of -members for a tenant as of last week. -*/ -export async function getTotalMembersPreviousWeek(input: InputAnalyticsWithTimes): Promise { - let result: number - - try { - result = await getNumberOfNewMembers(db, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.unixEpoch)), - before: new Date(Date.parse(input.dateTimeEndPreviousWeek)), - }) - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -newMembersThisWeek is a Temporal activity that returns the number of new members -for a tenant for the current week. -*/ -export async function getNewMembersThisWeek(input: InputAnalyticsWithTimes): Promise { - let result: number - - try { - result = await getNumberOfNewMembers(db, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - }) - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -newMembersPreviousWeek is a Temporal activity that returns the number of new members -for a tenant for the past week. -*/ -export async function getNewMembersPreviousWeek(input: InputAnalyticsWithTimes): Promise { - let result: number - - try { - result = await getNumberOfNewMembers(db, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartPreviousWeek)), - before: new Date(Date.parse(input.dateTimeEndPreviousWeek)), - }) - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -totalOrganizationsThisWeek is a Temporal activity that returns the number of -organizations for a tenant as of the current week. -*/ -export async function getTotalOrganizationsThisWeek( - input: InputAnalyticsWithTimes, // eslint-disable-line @typescript-eslint/no-unused-vars -): Promise { - return 0 -} - -/* -totalOrganizationsPreviousWeek is a Temporal activity that returns the number of -organizations for a tenant as of the past week. -*/ -export async function getTotalOrganizationsPreviousWeek( - input: InputAnalyticsWithTimes, // eslint-disable-line @typescript-eslint/no-unused-vars -): Promise { - return 0 -} - -/* -newOrganizationsThisWeek is a Temporal activity that returns the number of new -organizations for a tenant of the current. -*/ -export async function getNewOrganizationsThisWeek( - input: InputAnalyticsWithTimes, // eslint-disable-line @typescript-eslint/no-unused-vars -): Promise { - return 0 -} - -/* -newOrganizationsPreviousWeek is a Temporal activity that returns the number of new -organizations for a tenant of the past. -*/ -export async function getNewOrganizationsPreviousWeek( - input: InputAnalyticsWithTimes, // eslint-disable-line @typescript-eslint/no-unused-vars -): Promise { - return 0 -} diff --git a/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromQuestDB.ts b/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromQuestDB.ts deleted file mode 100644 index 6142cccbf5..0000000000 --- a/services/apps/emails_worker/src/activities/weekly-analytics/buildEmailFromQuestDB.ts +++ /dev/null @@ -1,378 +0,0 @@ -import { - ActivityType, - IConversationWithActivities, - INumberOfActivitiesPerMember, - INumberOfActivitiesPerOrganization, - IQueryActivityResult, - findConversationsWithActivities, - findTopActivityTypes, - getMemberById, - getMostActiveMembers, - getMostActiveOrganizations, - queryActivities, -} from '@crowd/data-access-layer' -import { findOrgById } from '@crowd/data-access-layer/src/organizations' -import { dbStoreQx } from '@crowd/data-access-layer/src/queryExecutor' -import { IMember, IOrganization, PageData } from '@crowd/types' - -import { svc } from '../../main' -import { InputAnalyticsWithSegments, InputAnalyticsWithTimes } from '../../types/analytics' - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -const db = svc.postgres.reader -const qdb = svc.questdbSQL - -/* -totalActivitiesThisWeek is a Temporal activity that returns the number of total -activities for a tenant for the current week from QuestDB. -*/ -export async function getTotalActivitiesThisWeek(input: InputAnalyticsWithTimes): Promise { - let result: PageData - - try { - result = await queryActivities(qdb, { - tenantId: input.tenantId, - segmentIds: input.segmentIds, - countOnly: true, - filter: { - and: [ - { - timestamp: { - gte: input.unixEpoch, - }, - }, - { - timestamp: { - lte: input.dateTimeEndThisWeek, - }, - }, - ], - }, - }) - } catch (err) { - throw new Error(err) - } - - return result.count -} - -/* -totalActivitiesPreviousWeek is a Temporal activity that returns the number of -total activities for a tenant for the past week from QuestDB. -*/ -export async function getTotalActivitiesPreviousWeek( - input: InputAnalyticsWithTimes, -): Promise { - let result: PageData - - try { - result = await queryActivities(qdb, { - tenantId: input.tenantId, - segmentIds: input.segmentIds, - countOnly: true, - filter: { - and: [ - { - timestamp: { - gte: input.unixEpoch, - }, - }, - { - timestamp: { - lte: input.dateTimeEndPreviousWeek, - }, - }, - ], - }, - }) - } catch (err) { - throw new Error(err) - } - - return result.count -} - -/* -newActivitiesThisWeek is a Temporal activity that returns the number of new -activities for a tenant for the current week from QuestDB. -*/ -export async function getNewActivitiesThisWeek(input: InputAnalyticsWithTimes): Promise { - let result: PageData - - try { - result = await queryActivities(qdb, { - tenantId: input.tenantId, - segmentIds: input.segmentIds, - countOnly: true, - filter: { - and: [ - { - timestamp: { - gte: input.dateTimeStartThisWeek, - }, - }, - { - timestamp: { - lte: input.dateTimeEndThisWeek, - }, - }, - ], - }, - }) - } catch (err) { - throw new Error(err) - } - - return result.count -} - -/* -newActivitiesPreviousWeek is a Temporal activity that returns the number of -new activities for a tenant for the past week from QuestDB. -*/ -export async function getNewActivitiesPreviousWeek( - input: InputAnalyticsWithTimes, -): Promise { - let result: PageData - - try { - result = await queryActivities(qdb, { - tenantId: input.tenantId, - segmentIds: input.segmentIds, - countOnly: true, - filter: { - and: [ - { - timestamp: { - gte: input.dateTimeStartPreviousWeek, - }, - }, - { - timestamp: { - lte: input.dateTimeEndPreviousWeek, - }, - }, - ], - }, - }) - } catch (err) { - throw new Error(err) - } - - return result.count -} - -/* -getMostActiveMembersThisWeek is a Temporal activity that returns the tenant's most active -members for the current week. -*/ -export async function getMostActiveMembersThisWeek( - input: InputAnalyticsWithSegments, -): Promise { - let rows: INumberOfActivitiesPerMember[] = [] - - try { - rows = await getMostActiveMembers(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - limit: 5, - }) - } catch (err) { - throw new Error(err) - } - - const members: IMember[] = [] - for (const row of rows) { - const member = await getMemberById(db, row.memberId) - member.activityCount = rows.filter((row) => row.memberId === member.id)[0].count - - // Backward compatibility since the Sendgrid dynamic email template use "name" - // and not "displayName". - member.name = member.displayName - - members.push(member) - } - - return members -} - -/* -getMostActiveOrganizationsThisWeek is a Temporal activity that returns the tenant's most -active organizations for the current week. -*/ -export async function getMostActiveOrganizationsThisWeek( - input: InputAnalyticsWithSegments, -): Promise { - let rows: INumberOfActivitiesPerOrganization[] = [] - - try { - rows = await getMostActiveOrganizations(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - limit: 5, - }) - } catch (err) { - throw new Error(err) - } - - const orgs: IOrganization[] = [] - for (const row of rows) { - const org = await findOrgById(dbStoreQx(db), row.organizationId) - - const data = org as any - data.activityCount = rows.filter((row) => row.organizationId === org.id)[0].count - - // Backward compatibility since the Sendgrid dynamic email template use "name" - // and not "displayName". - data.name = org.displayName - - orgs.push(data) - } - - return orgs -} - -/* -getTopActivityTypes is a Temporal activity that returns the tenant's top activity -types for the current week. -*/ -export async function getTopActivityTypes( - input: InputAnalyticsWithSegments, -): Promise { - let types: ActivityType[] - - try { - types = await findTopActivityTypes(qdb, { - tenantId: input.tenantId, - segments: input.segments, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - limit: 5, - }) - } catch (err) { - throw new Error(err) - } - - return types -} - -/* -getConversations is a Temporal activity that returns the tenant's conversations -for the current week. -*/ -export async function getConversations( - input: InputAnalyticsWithSegments, -): Promise { - let result: IConversationWithActivities[] - - try { - await findConversationsWithActivities(qdb, { - tenantId: input.tenantId, - segments: input.segments, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - limit: 3, - }) - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -activeMembersThisWeek is a Temporal activity that returns the number of active -members for a tenant for the current week from QuestDB. -*/ -export async function getActiveMembersThisWeek(input: InputAnalyticsWithTimes): Promise { - let result = 0 - - try { - const rows: INumberOfActivitiesPerMember[] = await getMostActiveMembers(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - }) - - result = rows.length - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -activeMembersPreviousWeek is a Temporal activity that returns the number of active -members for a tenant for the past week from QuestDB. -*/ -export async function getActiveMembersPreviousWeek( - input: InputAnalyticsWithTimes, -): Promise { - let result = 0 - - try { - const rows: INumberOfActivitiesPerMember[] = await getMostActiveMembers(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartPreviousWeek)), - before: new Date(Date.parse(input.dateTimeEndPreviousWeek)), - }) - - result = rows.length - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -activeOrganizationsThisWeek is a Temporal activity that returns the number of -active organizations for a tenant for the current week from QuestDB. -*/ -export async function getActiveOrganizationsThisWeek( - input: InputAnalyticsWithTimes, -): Promise { - let result = 0 - - try { - const rows: INumberOfActivitiesPerOrganization[] = await getMostActiveOrganizations(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartThisWeek)), - before: new Date(Date.parse(input.dateTimeEndThisWeek)), - }) - - result = rows.length - } catch (err) { - throw new Error(err) - } - - return result -} - -/* -activeOrganizationsPreviousWeek is a Temporal activity that returns the number of -active organizations for a tenant for the past week from QuestDB. -*/ -export async function getActiveOrganizationsPreviousWeek( - input: InputAnalyticsWithTimes, -): Promise { - let result = 0 - - try { - const rows: INumberOfActivitiesPerOrganization[] = await getMostActiveOrganizations(qdb, { - tenantId: input.tenantId, - after: new Date(Date.parse(input.dateTimeStartPreviousWeek)), - before: new Date(Date.parse(input.dateTimeEndPreviousWeek)), - }) - - result = rows.length - } catch (err) { - throw new Error(err) - } - - return result -} diff --git a/services/apps/emails_worker/src/activities/weekly-analytics/getNextEmails.ts b/services/apps/emails_worker/src/activities/weekly-analytics/getNextEmails.ts deleted file mode 100644 index f435d0c387..0000000000 --- a/services/apps/emails_worker/src/activities/weekly-analytics/getNextEmails.ts +++ /dev/null @@ -1,43 +0,0 @@ -import moment from 'moment' - -import { dbWeeklyGetNextEmails } from '@crowd/data-access-layer/src/old/apps/emails_worker/tenants' - -import { svc } from '../../main' -import { AnalyticsWithTimes, InputAnalytics } from '../../types/analytics' - -/* -calculateTimes is a Temporal activity that calculates the time of the current -and past week, allowing to then be passed across all activities to retrieve -numbers of the current and past week. -*/ -export async function calculateTimes(): Promise { - const unixEpoch = moment.unix(0) - - const dateTimeEndThisWeek = moment().utc().startOf('isoWeek') - const dateTimeStartThisWeek = moment().utc().startOf('isoWeek').subtract(7, 'days') - - const dateTimeEndPreviousWeek = dateTimeStartThisWeek.clone() - const dateTimeStartPreviousWeek = dateTimeStartThisWeek.clone().subtract(7, 'days') - - return { - unixEpoch: unixEpoch.toISOString(), - dateTimeEndThisWeek: dateTimeEndThisWeek.toISOString(), - dateTimeStartThisWeek: dateTimeStartThisWeek.toISOString(), - dateTimeEndPreviousWeek: dateTimeEndPreviousWeek.toISOString(), - dateTimeStartPreviousWeek: dateTimeStartPreviousWeek.toISOString(), - } -} - -/* -weeklyGetNextEmails is a Temporal activity that fetches all users for a tenant. -*/ -export async function weeklyGetNextEmails(): Promise { - let rows: InputAnalytics[] = [] - try { - rows = await dbWeeklyGetNextEmails(svc.postgres.reader) - } catch (err) { - throw new Error(err) - } - - return rows -} diff --git a/services/apps/emails_worker/src/activities/weekly-analytics/sendEmail.ts b/services/apps/emails_worker/src/activities/weekly-analytics/sendEmail.ts deleted file mode 100644 index beb5b5a60c..0000000000 --- a/services/apps/emails_worker/src/activities/weekly-analytics/sendEmail.ts +++ /dev/null @@ -1,38 +0,0 @@ -import sendgrid, { MailDataRequired } from '@sendgrid/mail' - -import { EmailSent, EmailToSend } from '../../types/email' - -/* -weeklySendEmail is a Temporal activity that sends an email to a user's email address -using the SendGrid API. -*/ -export async function weeklySendEmail(toSend: EmailToSend): Promise { - const email: MailDataRequired = { - to: toSend.email, - from: { - name: process.env['CROWD_SENDGRID_NAME_FROM'], - email: process.env['CROWD_SENDGRID_EMAIL_FROM'], - }, - templateId: process.env['CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS'], - dynamicTemplateData: { - ...toSend.content, - appHost: process.env['CROWD_API_FRONTEND_URL'], - }, - asm: { - groupId: parseInt(process.env['CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID'], 10), - groupsToDisplay: [ - parseInt(process.env['CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID'], 10), - ], - }, - } - - try { - await sendgrid.send(email) - } catch (err) { - throw new Error(err) - } - - return { - sentAt: new Date(), - } -} diff --git a/services/apps/emails_worker/src/main.ts b/services/apps/emails_worker/src/main.ts deleted file mode 100644 index 4f59d7c178..0000000000 --- a/services/apps/emails_worker/src/main.ts +++ /dev/null @@ -1,57 +0,0 @@ -import sendgrid from '@sendgrid/mail' - -import { Config } from '@crowd/archetype-standard' -import { Options, ServiceWorker } from '@crowd/archetype-worker' - -import { scheduleEmailAnalyticsWeekly, scheduleEmailEagleEyeDigest } from './schedules' - -const config: Config = { - envvars: [ - 'CROWD_API_FRONTEND_URL', - 'CROWD_EAGLE_EYE_URL', - 'CROWD_EAGLE_EYE_API_KEY', - 'CROWD_SENDGRID_KEY', - 'CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST', - 'CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS', - 'CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID', - 'CROWD_SENDGRID_NAME_FROM', - 'CROWD_SENDGRID_EMAIL_FROM', - ], - producer: { - enabled: false, - }, - temporal: { - enabled: true, - }, - questdb: { - enabled: true, - }, - redis: { - enabled: false, - }, -} - -const options: Options = { - maxTaskQueueActivitiesPerSecond: process.env['CROWD_TEMPORAL_TASKQUEUE_EMAILS_MAX_ACTIVITIES'] - ? Number(process.env['CROWD_TEMPORAL_TASKQUEUE_EMAILS_MAX_ACTIVITIES']) - : Infinity, - postgres: { - enabled: true, - }, - opensearch: { - enabled: false, - }, -} - -export const svc = new ServiceWorker(config, options) - -setImmediate(async () => { - await svc.init() - - sendgrid.setApiKey(process.env['CROWD_SENDGRID_KEY']) - - await scheduleEmailEagleEyeDigest() - await scheduleEmailAnalyticsWeekly() - - await svc.start() -}) diff --git a/services/apps/emails_worker/src/schedules.ts b/services/apps/emails_worker/src/schedules.ts deleted file mode 100644 index 82555ad00e..0000000000 --- a/services/apps/emails_worker/src/schedules.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { scheduleEmailAnalyticsWeekly } from './schedules/emailAnalyticsWeekly' -import { scheduleEmailEagleEyeDigest } from './schedules/emailEagleEyeDigest' - -export { scheduleEmailAnalyticsWeekly, scheduleEmailEagleEyeDigest } diff --git a/services/apps/emails_worker/src/schedules/emailAnalyticsWeekly.ts b/services/apps/emails_worker/src/schedules/emailAnalyticsWeekly.ts deleted file mode 100644 index ffbe8e7b4b..0000000000 --- a/services/apps/emails_worker/src/schedules/emailAnalyticsWeekly.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ScheduleAlreadyRunning, ScheduleOverlapPolicy } from '@temporalio/client' - -import { svc } from '../main' -import { weeklyGetAndSendNextEmails } from '../workflows' - -export const scheduleEmailAnalyticsWeekly = async () => { - try { - await svc.temporal.schedule.create({ - scheduleId: 'email-analytics-weekly', - spec: { - cronExpressions: ['0 8 * * MON'], - }, - policies: { - overlap: ScheduleOverlapPolicy.BUFFER_ONE, - catchupWindow: '1 minute', - }, - action: { - type: 'startWorkflow', - workflowType: weeklyGetAndSendNextEmails, - taskQueue: 'emails', - workflowExecutionTimeout: '5 minutes', - }, - }) - } catch (err) { - if (err instanceof ScheduleAlreadyRunning) { - svc.log.info('Schedule already registered in Temporal.') - svc.log.info('Configuration may have changed since. Please make sure they are in sync.') - } else { - throw new Error(err) - } - } -} diff --git a/services/apps/emails_worker/src/schedules/emailEagleEyeDigest.ts b/services/apps/emails_worker/src/schedules/emailEagleEyeDigest.ts deleted file mode 100644 index 06dd3205a0..0000000000 --- a/services/apps/emails_worker/src/schedules/emailEagleEyeDigest.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ScheduleAlreadyRunning, ScheduleOverlapPolicy } from '@temporalio/client' - -import { svc } from '../main' -import { eagleeyeGetAndSendNextEmails } from '../workflows' - -export const scheduleEmailEagleEyeDigest = async () => { - try { - await svc.temporal.schedule.create({ - scheduleId: 'email-eagleeye-digest', - spec: { - intervals: [ - { - every: '30 minutes', - }, - ], - }, - policies: { - overlap: ScheduleOverlapPolicy.BUFFER_ONE, - catchupWindow: '1 minute', - }, - action: { - type: 'startWorkflow', - workflowType: eagleeyeGetAndSendNextEmails, - taskQueue: 'emails', - workflowExecutionTimeout: '5 minutes', - }, - }) - } catch (err) { - if (err instanceof ScheduleAlreadyRunning) { - svc.log.info('Schedule already registered in Temporal.') - svc.log.info('Configuration may have changed since. Please make sure they are in sync.') - } else { - throw new Error(err) - } - } -} diff --git a/services/apps/emails_worker/src/types/analytics.ts b/services/apps/emails_worker/src/types/analytics.ts deleted file mode 100644 index 7abf8a56dc..0000000000 --- a/services/apps/emails_worker/src/types/analytics.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SegmentRawData } from '@crowd/types' - -export interface InputAnalytics { - tenantId: string - tenantName: string - segmentIds?: string[] -} - -export interface InputAnalyticsWithTimes extends InputAnalytics, AnalyticsWithTimes {} - -export interface AnalyticsWithTimes { - unixEpoch: string - dateTimeEndThisWeek: string - dateTimeStartThisWeek: string - dateTimeEndPreviousWeek: string - dateTimeStartPreviousWeek: string -} - -export interface InputAnalyticsWithSegments extends InputAnalyticsWithTimes { - segments: SegmentRawData[] -} diff --git a/services/apps/emails_worker/src/types/email.ts b/services/apps/emails_worker/src/types/email.ts deleted file mode 100644 index cdb5258611..0000000000 --- a/services/apps/emails_worker/src/types/email.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { EagleEyePostWithActions, EagleEyeRawPost } from '@crowd/types' - -import { UserTenant } from './user' - -export interface Content { - fromDatabase: EagleEyeRawPost[] - fromEagleEye: EagleEyeRawPost[] -} - -export interface EmailToSend extends UserTenant { - content: EagleEyePostWithActions[] | object -} - -export interface EmailSent { - sentAt: Date -} diff --git a/services/apps/emails_worker/src/types/user.ts b/services/apps/emails_worker/src/types/user.ts deleted file mode 100644 index 66655b65f9..0000000000 --- a/services/apps/emails_worker/src/types/user.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { EagleEyeSettings } from '@crowd/types' - -export interface UserTenant { - userId?: string - tenantId: string - email?: string - firstName?: string - settings?: { - eagleEye: EagleEyeSettings - } -} - -export interface UserTenantWithEmailSent extends UserTenant { - type: string - sentAt: Date - emails: string[] - weekOfYear?: string -} diff --git a/services/apps/emails_worker/src/utils/analytics.ts b/services/apps/emails_worker/src/utils/analytics.ts deleted file mode 100644 index 971ea6fe48..0000000000 --- a/services/apps/emails_worker/src/utils/analytics.ts +++ /dev/null @@ -1,33 +0,0 @@ -export function getChangeAndDirection(thisWeekValue: number, previousWeekValue: number) { - let changeAndDirection: { - changeVsLastWeek: number - changeVsLastWeekPercentage: string - changeVsLastWeekDerivative: 'increasing' | 'equal' | 'decreasing' - } - - if (thisWeekValue > previousWeekValue) { - changeAndDirection = { - changeVsLastWeek: thisWeekValue - previousWeekValue, - changeVsLastWeekPercentage: Number( - ((thisWeekValue - previousWeekValue) / thisWeekValue) * 100, - ).toFixed(2), - changeVsLastWeekDerivative: 'increasing', - } - } else if (thisWeekValue === previousWeekValue) { - changeAndDirection = { - changeVsLastWeek: 0, - changeVsLastWeekPercentage: '0', - changeVsLastWeekDerivative: 'equal', - } - } else { - changeAndDirection = { - changeVsLastWeek: previousWeekValue - thisWeekValue, - changeVsLastWeekPercentage: Number( - ((previousWeekValue - thisWeekValue) / previousWeekValue) * 100, - ).toFixed(2), - changeVsLastWeekDerivative: 'decreasing', - } - } - - return changeAndDirection -} diff --git a/services/apps/emails_worker/src/utils/date.ts b/services/apps/emails_worker/src/utils/date.ts deleted file mode 100644 index cc18e64314..0000000000 --- a/services/apps/emails_worker/src/utils/date.ts +++ /dev/null @@ -1,68 +0,0 @@ -import moment from 'moment' - -import { - EagleEyeEmailDigestFrequency, - EagleEyeEmailDigestSettings, - EagleEyePublishedDates, -} from '@crowd/types' - -export function switchDate(date: string, offset = 0) { - let dateMoment: moment.Moment - - switch (date) { - case EagleEyePublishedDates.LAST_24_HOURS: - dateMoment = moment().subtract(1, 'days') - break - case EagleEyePublishedDates.LAST_7_DAYS: - dateMoment = moment().subtract(7, 'days') - break - case EagleEyePublishedDates.LAST_14_DAYS: - dateMoment = moment().subtract(14, 'days') - break - case EagleEyePublishedDates.LAST_30_DAYS: - dateMoment = moment().subtract(30, 'days') - break - case EagleEyePublishedDates.LAST_90_DAYS: - dateMoment = moment().subtract(90, 'days') - break - default: - return null - } - - return dateMoment.subtract(offset, 'days').format('YYYY-MM-DD') -} - -export function nextEmailAt(settings: EagleEyeEmailDigestSettings): string { - const now = moment() - - let nextEmailAt = '' - const [hour, minute] = settings.time.split(':') - const startOfWeek = moment() - .startOf('isoWeek') - .set('hour', parseInt(hour, 10)) - .set('minute', parseInt(minute, 10)) - .subtract(5, 'minutes') - - switch (settings.frequency) { - case EagleEyeEmailDigestFrequency.DAILY: - nextEmailAt = moment(settings.time, 'HH:mm').subtract(5, 'minutes').toISOString() - - // if send time has passed for today, set it to next day - if (now > moment(settings.time, 'HH:mm')) { - nextEmailAt = moment(nextEmailAt).add(1, 'day').toISOString() - } - break - case EagleEyeEmailDigestFrequency.WEEKLY: - nextEmailAt = startOfWeek.toISOString() - - // if send time has passed for this week, set it to next week - if (now > startOfWeek) { - nextEmailAt = startOfWeek.add(1, 'week').toISOString() - } - break - default: - throw new Error(`Unknown email digest frequency: ${settings.frequency}`) - } - - return nextEmailAt -} diff --git a/services/apps/emails_worker/src/workflows.ts b/services/apps/emails_worker/src/workflows.ts deleted file mode 100644 index 88b63ce0d8..0000000000 --- a/services/apps/emails_worker/src/workflows.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { eagleeyeGetAndSendNextEmails } from './workflows/eagleye-digest/getAndSendNextEmails' -import { eagleeyeSendEmailAndUpdateHistory } from './workflows/eagleye-digest/sendEmailAndUpdateHistory' -import { weeklyGetAndSendNextEmails } from './workflows/weekly-analytics/getAndSendNextEmails' -import { weeklySendEmailAndUpdateHistory } from './workflows/weekly-analytics/sendEmailAndUpdateHistory' - -export { - eagleeyeGetAndSendNextEmails, - eagleeyeSendEmailAndUpdateHistory, - weeklyGetAndSendNextEmails, - weeklySendEmailAndUpdateHistory, -} diff --git a/services/apps/emails_worker/src/workflows/eagleye-digest/getAndSendNextEmails.ts b/services/apps/emails_worker/src/workflows/eagleye-digest/getAndSendNextEmails.ts deleted file mode 100644 index fe3781334f..0000000000 --- a/services/apps/emails_worker/src/workflows/eagleye-digest/getAndSendNextEmails.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - ChildWorkflowCancellationType, - ParentClosePolicy, - proxyActivities, - startChild, - workflowInfo, -} from '@temporalio/workflow' - -import * as activities from '../../activities/eagleeye-digest/getNextEmails' - -import { eagleeyeSendEmailAndUpdateHistory } from './sendEmailAndUpdateHistory' - -// Configure timeouts and retry policies to fetch emails to send. -const { eagleeyeGetNextEmails } = proxyActivities({ - startToCloseTimeout: '10 seconds', -}) - -/* -eagleeyeGetAndSendNextEmails is a Temporal workflow that: - - [Activity]: Get address emails to send a new email digest to. - - [Child Workflow]: Build and send the email for each user found in the - previous activity. Child workflows are completely "detached" from the parent - workflow, meaning they will continue to run and not be cancelled even if this - one is. -*/ -export async function eagleeyeGetAndSendNextEmails(): Promise { - const users = await eagleeyeGetNextEmails() - const info = workflowInfo() - - await Promise.all( - users.map((user) => { - return startChild(eagleeyeSendEmailAndUpdateHistory, { - workflowId: `${info.workflowId}/${user.tenantId}/${user.userId}`, - cancellationType: ChildWorkflowCancellationType.ABANDON, - parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON, - retry: { - backoffCoefficient: 2, - initialInterval: 2 * 1000, - maximumInterval: 30 * 1000, - }, - args: [user], - searchAttributes: { - TenantId: [user.tenantId], - }, - }) - }), - ) -} diff --git a/services/apps/emails_worker/src/workflows/eagleye-digest/sendEmailAndUpdateHistory.ts b/services/apps/emails_worker/src/workflows/eagleye-digest/sendEmailAndUpdateHistory.ts deleted file mode 100644 index 8977294d27..0000000000 --- a/services/apps/emails_worker/src/workflows/eagleye-digest/sendEmailAndUpdateHistory.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { proxyActivities } from '@temporalio/workflow' - -import * as activities from '../../activities' -import { UserTenant } from '../../types/user' - -// Configure timeouts and retry policies to fetch content from third-party sources. -const { eagleeyeFetchFromEagleEye, eagleeyeFetchFromDatabase } = proxyActivities( - { - startToCloseTimeout: '10 seconds', - }, -) - -// Configure timeouts and retry policies to build the content of the email to send. -const { eagleeyeBuildEmailContent } = proxyActivities({ - startToCloseTimeout: '5 seconds', -}) - -// Configure timeouts and retry policies to actually send the email. -const { eagleeyeSendEmail } = proxyActivities({ - startToCloseTimeout: '5 seconds', -}) - -// Configure timeouts and retry policies to update email history in the database. -const { updateEmailHistory, eagleeyeUpdateNextEmailAt } = proxyActivities({ - startToCloseTimeout: '10 seconds', -}) - -/* -eagleeyeSendEmailAndUpdateHistory is a Temporal workflow that: - - [Async Activities]: Fetch posts from EagleEye API and the database. - - [Activity]: Build the content of the email to send based on the posts - previously found. - - [Activity]: Actually send the email to the user's email address using the - SendGrid API. - - [Async Activities]: Update email history and digest status in the database. -*/ -export async function eagleeyeSendEmailAndUpdateHistory(row: UserTenant): Promise { - const [fetchedFromEagleEye, fetchedFromDatabase] = await Promise.all([ - eagleeyeFetchFromEagleEye(row), - eagleeyeFetchFromDatabase(row), - ]) - - const content = await eagleeyeBuildEmailContent({ - fromDatabase: fetchedFromDatabase, - fromEagleEye: fetchedFromEagleEye, - }) - - // No need to continue the workflow if content of email built is empty. But we - // still need to make sure the next EagleEeye email digest will be sent on daily - // or weekly basis so the email address is not retrieved on the next run. - if (content.length == 0) { - await eagleeyeUpdateNextEmailAt({ - ...row, - type: 'eagle-eye-digest', - emails: [row.settings.eagleEye.emailDigest?.email || row.email], - sentAt: new Date(Date.now()), - }) - - return - } - - const email = await eagleeyeSendEmail({ - email: row.email, - userId: row.userId, - tenantId: row.tenantId, - settings: row.settings, - content: content, - }) - - await Promise.all([ - updateEmailHistory({ - ...row, - type: 'eagle-eye-digest', - emails: [row.settings.eagleEye.emailDigest?.email || row.email], - sentAt: email.sentAt, - }), - eagleeyeUpdateNextEmailAt({ - ...row, - type: 'eagle-eye-digest', - emails: [row.settings.eagleEye.emailDigest?.email || row.email], - sentAt: email.sentAt, - }), - ]) -} diff --git a/services/apps/emails_worker/src/workflows/weekly-analytics/getAndSendNextEmails.ts b/services/apps/emails_worker/src/workflows/weekly-analytics/getAndSendNextEmails.ts deleted file mode 100644 index 263b73d81c..0000000000 --- a/services/apps/emails_worker/src/workflows/weekly-analytics/getAndSendNextEmails.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - ChildWorkflowCancellationType, - ParentClosePolicy, - proxyActivities, - startChild, - workflowInfo, -} from '@temporalio/workflow' - -import * as activities from '../../activities/weekly-analytics/getNextEmails' - -import { weeklySendEmailAndUpdateHistory } from './sendEmailAndUpdateHistory' - -// Configure timeouts and retry policies to fetch emails to send. -const { weeklyGetNextEmails } = proxyActivities({ - startToCloseTimeout: '10 seconds', -}) - -// Configure timeouts and retry policies to fetch emails to send. -const { calculateTimes } = proxyActivities({ - startToCloseTimeout: '10 seconds', -}) - -/* -weeklyGetAndSendNextEmails is a Temporal workflow that: - - [Activity]: Get address emails to send a new email digest to. - - [Child Workflow]: Build and send the email for each user found in the - previous activity. Child workflows are completely "detached" from the parent - workflow, meaning they will continue to run and not be cancelled even if this - one is. -*/ -export async function weeklyGetAndSendNextEmails(): Promise { - const [tenants, calculatedTimes] = await Promise.all([weeklyGetNextEmails(), calculateTimes()]) - const info = workflowInfo() - - await Promise.all( - tenants.map((tenant) => { - return startChild(weeklySendEmailAndUpdateHistory, { - workflowId: `${info.workflowId}/${tenant.tenantId}`, - cancellationType: ChildWorkflowCancellationType.ABANDON, - parentClosePolicy: ParentClosePolicy.PARENT_CLOSE_POLICY_ABANDON, - retry: { - backoffCoefficient: 2, - initialInterval: 2 * 1000, - maximumInterval: 30 * 1000, - }, - args: [ - { - tenantId: tenant.tenantId, - tenantName: tenant.tenantName, - unixEpoch: calculatedTimes.unixEpoch, - dateTimeEndThisWeek: calculatedTimes.dateTimeEndThisWeek, - dateTimeStartThisWeek: calculatedTimes.dateTimeStartThisWeek, - dateTimeEndPreviousWeek: calculatedTimes.dateTimeEndPreviousWeek, - dateTimeStartPreviousWeek: calculatedTimes.dateTimeStartPreviousWeek, - }, - ], - searchAttributes: { - TenantId: [tenant.tenantId], - }, - }) - }), - ) -} diff --git a/services/apps/emails_worker/src/workflows/weekly-analytics/sendEmailAndUpdateHistory.ts b/services/apps/emails_worker/src/workflows/weekly-analytics/sendEmailAndUpdateHistory.ts deleted file mode 100644 index 61954bf5d8..0000000000 --- a/services/apps/emails_worker/src/workflows/weekly-analytics/sendEmailAndUpdateHistory.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { proxyActivities } from '@temporalio/workflow' -import moment from 'moment' - -import * as activities from '../../activities' -import { InputAnalyticsWithSegments, InputAnalyticsWithTimes } from '../../types/analytics' -import { getChangeAndDirection } from '../../utils/analytics' - -// Configure timeouts and retry policies to fetch content from the databases. -const { - getTenantUsers, - getSegments, - getTotalMembersThisWeek, - getTotalMembersPreviousWeek, - getNewMembersThisWeek, - getNewMembersPreviousWeek, - getTotalOrganizationsThisWeek, - getTotalOrganizationsPreviousWeek, - getNewOrganizationsThisWeek, - getNewOrganizationsPreviousWeek, - updateEmailHistory, - getActiveTenantIntegrations, - getTotalActivitiesThisWeek, - getTotalActivitiesPreviousWeek, - getNewActivitiesThisWeek, - getNewActivitiesPreviousWeek, - getMostActiveMembersThisWeek, - getMostActiveOrganizationsThisWeek, - getTopActivityTypes, - getConversations, - getActiveMembersThisWeek, - getActiveMembersPreviousWeek, - getActiveOrganizationsThisWeek, - getActiveOrganizationsPreviousWeek, -} = proxyActivities({ startToCloseTimeout: '10 seconds' }) - -// Configure timeouts and retry policies to actually send the email. -const { weeklySendEmail } = proxyActivities({ - startToCloseTimeout: '5 seconds', -}) - -/* -weeklySendEmailAndUpdateHistory is a Temporal workflow that: - - [Activity]: Fetch the tenant's segments. - - [Activity]: Ensure the tenant has an active integration. - - [Async Activities]: Fetch results from database. - - [Activity]: Fetch the tenant's users to have email addresses to send the - email to. - - [Activity]: Actually send the email to the each user's email address using - the SendGrid API. - - [Async Activities]: Update email history in the database. -*/ -export async function weeklySendEmailAndUpdateHistory( - input: InputAnalyticsWithTimes, -): Promise { - const segments = await getSegments(input) - - const withTimeAndSegmentIds: InputAnalyticsWithTimes = { - tenantId: input.tenantId, - tenantName: input.tenantName, - segmentIds: segments.map((subproject) => subproject.id), - unixEpoch: input.unixEpoch, - dateTimeEndThisWeek: input.dateTimeEndThisWeek, - dateTimeStartThisWeek: input.dateTimeStartThisWeek, - dateTimeEndPreviousWeek: input.dateTimeEndPreviousWeek, - dateTimeStartPreviousWeek: input.dateTimeStartPreviousWeek, - } - - const withTimeAndSegments: InputAnalyticsWithSegments = { - tenantId: input.tenantId, - tenantName: input.tenantName, - segmentIds: segments.map((subproject) => subproject.id), - segments: segments, - unixEpoch: input.unixEpoch, - dateTimeEndThisWeek: input.dateTimeEndThisWeek, - dateTimeStartThisWeek: input.dateTimeStartThisWeek, - dateTimeEndPreviousWeek: input.dateTimeEndPreviousWeek, - dateTimeStartPreviousWeek: input.dateTimeStartPreviousWeek, - } - - // No need to conitnue if the tenant has no active integrations. - const activeTenantIntegrations = await getActiveTenantIntegrations(withTimeAndSegments) - if (activeTenantIntegrations.length == 0) { - return - } - - const [ - totalMembersThisWeek, - totalMembersPreviousWeek, - activeMembersThisWeek, - activeMembersPreviousWeek, - newMembersThisWeek, - newMembersPreviousWeek, - totalOrganizationsThisWeek, - totalOrganizationsPreviousWeek, - activeOrganizationsThisWeek, - activeOrganizationsPreviousWeek, - newOrganizationsThisWeek, - newOrganizationsPreviousWeek, - totalActivitiesThisWeek, - totalActivitiesPreviousWeek, - newActivitiesThisWeek, - newActivitiesPreviousWeek, - mostActiveMembersThisWeek, - mostActiveOrganizationsThisWeek, - topActivityTypes, - conversations, - ] = await Promise.all([ - getTotalMembersThisWeek(withTimeAndSegmentIds), - getTotalMembersPreviousWeek(withTimeAndSegmentIds), - getActiveMembersThisWeek(withTimeAndSegmentIds), - getActiveMembersPreviousWeek(withTimeAndSegmentIds), - getNewMembersThisWeek(withTimeAndSegmentIds), - getNewMembersPreviousWeek(withTimeAndSegmentIds), - getTotalOrganizationsThisWeek(withTimeAndSegmentIds), - getTotalOrganizationsPreviousWeek(withTimeAndSegmentIds), - getActiveOrganizationsThisWeek(withTimeAndSegmentIds), - getActiveOrganizationsPreviousWeek(withTimeAndSegmentIds), - getNewOrganizationsThisWeek(withTimeAndSegmentIds), - getNewOrganizationsPreviousWeek(withTimeAndSegmentIds), - getTotalActivitiesThisWeek(withTimeAndSegmentIds), - getTotalActivitiesPreviousWeek(withTimeAndSegmentIds), - getNewActivitiesThisWeek(withTimeAndSegmentIds), - getNewActivitiesPreviousWeek(withTimeAndSegmentIds), - getMostActiveMembersThisWeek(withTimeAndSegments), - getMostActiveOrganizationsThisWeek(withTimeAndSegments), - getTopActivityTypes(withTimeAndSegments), - getConversations(withTimeAndSegments), - ]) - - const data = { - dateRangePretty: `${moment.utc(input.dateTimeStartThisWeek).format('D MMM YYYY')} - ${moment - .utc(input.dateTimeEndThisWeek) - .format('D MMM YYYY')}`, - members: { - total: { - value: totalMembersThisWeek, - ...getChangeAndDirection(totalMembersThisWeek, totalMembersPreviousWeek), - }, - new: { - value: newMembersThisWeek, - ...getChangeAndDirection(newMembersThisWeek, newMembersPreviousWeek), - }, - active: { - value: activeMembersThisWeek, - ...getChangeAndDirection(activeMembersThisWeek, activeMembersPreviousWeek), - }, - mostActive: mostActiveMembersThisWeek, - }, - organizations: { - total: { - value: totalOrganizationsThisWeek, - ...getChangeAndDirection(totalOrganizationsThisWeek, totalOrganizationsPreviousWeek), - }, - new: { - value: newOrganizationsThisWeek, - ...getChangeAndDirection(newOrganizationsThisWeek, newOrganizationsPreviousWeek), - }, - active: { - value: activeOrganizationsThisWeek, - ...getChangeAndDirection(activeOrganizationsThisWeek, activeOrganizationsPreviousWeek), - }, - mostActive: mostActiveOrganizationsThisWeek, - }, - activities: { - total: { - value: totalActivitiesThisWeek, - ...getChangeAndDirection(totalActivitiesThisWeek, totalActivitiesPreviousWeek), - }, - new: { - value: newActivitiesThisWeek, - ...getChangeAndDirection(newActivitiesThisWeek, newActivitiesPreviousWeek), - }, - topActivityTypes, - }, - conversations, - tenant: { - name: input.tenantName, - }, - } - - const users = await getTenantUsers(withTimeAndSegments) - await Promise.all( - users.map((user) => { - return weeklySendEmail({ - email: user.email, - userId: user.userId, - tenantId: input.tenantId, - content: { - ...data, - user: { - name: user.firstName, - }, - }, - }) - }), - ) - - await updateEmailHistory({ - tenantId: input.tenantId, - emails: users.map((user) => user.email), - type: 'weekly-analytics', - sentAt: new Date(), - weekOfYear: moment().utc().startOf('isoWeek').subtract(7, 'days').isoWeek().toString(), - }) - - return -} diff --git a/services/apps/emails_worker/tsconfig.json b/services/apps/emails_worker/tsconfig.json deleted file mode 100644 index bf7f183850..0000000000 --- a/services/apps/emails_worker/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../base.tsconfig.json", - "include": ["src/**/*"] -} From 63e153c22953575f18b0fb4d3bc636fab961e6dc Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 8 Jan 2025 16:17:21 +0530 Subject: [PATCH 06/25] fix envs --- backend/.env.dist.local | 9 ++------- backend/config/custom-environment-variables.json | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/backend/.env.dist.local b/backend/.env.dist.local index 652f8e81b9..c4bb933dbc 100755 --- a/backend/.env.dist.local +++ b/backend/.env.dist.local @@ -65,15 +65,10 @@ CROWD_NETLIFY_SITE_DOMAIN=localhost:3000 # Sendgrid settings CROWD_SENDGRID_KEY= -CROWD_SENDGRID_WEBHOOK_SIGNING_SECRET= CROWD_SENDGRID_EMAIL_FROM= CROWD_SENDGRID_NAME_FROM= -CROWD_SENDGRID_TEMPLATE_EMAIL_ADDRESS_VERIFICATION= -CROWD_SENDGRID_TEMPLATE_INVITATION= -CROWD_SENDGRID_TEMPLATE_PASSWORD_RESET= -CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS= -CROWD_SENDGRID_TEMPLATE_INTEGRATION_DONE= -CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID= +CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST= +CROWD_SENDGRID_TEMPLATE_CSV_EXPORT= # Twitter settings CROWD_TWITTER_CLIENT_ID= diff --git a/backend/config/custom-environment-variables.json b/backend/config/custom-environment-variables.json index 96395f9c92..91e5fcf1a8 100644 --- a/backend/config/custom-environment-variables.json +++ b/backend/config/custom-environment-variables.json @@ -65,7 +65,6 @@ }, "sendgrid": { "key": "CROWD_SENDGRID_KEY", - "webhookSigningSecret": "CROWD_SENDGRID_WEBHOOK_SIGNING_SECRET", "emailFrom": "CROWD_SENDGRID_EMAIL_FROM", "nameFrom": "CROWD_SENDGRID_NAME_FROM", "templateCsvExport": "CROWD_SENDGRID_TEMPLATE_CSV_EXPORT", From fab388b66657960fb60ece720efb3f2b587fbea1 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 8 Jan 2025 16:33:52 +0530 Subject: [PATCH 07/25] revert discord code --- backend/src/api/auth/authPasswordReset.ts | 7 --- .../authSendEmailAddressVerificationEmail.ts | 20 -------- .../api/auth/authSendPasswordResetEmail.ts | 9 ---- backend/src/api/auth/authVerifyEmail.ts | 7 --- backend/src/api/auth/index.ts | 22 --------- .../helpers/discordAuthenticate.ts | 9 ---- backend/src/conf/configTypes.ts | 8 ++++ backend/src/conf/index.ts | 3 ++ backend/src/services/conversationService.ts | 4 -- .../services/conversationSettingsService.ts | 29 +----------- backend/src/services/integrationService.ts | 47 ------------------- 11 files changed, 12 insertions(+), 153 deletions(-) delete mode 100644 backend/src/api/auth/authPasswordReset.ts delete mode 100644 backend/src/api/auth/authSendEmailAddressVerificationEmail.ts delete mode 100644 backend/src/api/auth/authSendPasswordResetEmail.ts delete mode 100644 backend/src/api/auth/authVerifyEmail.ts delete mode 100644 backend/src/api/integration/helpers/discordAuthenticate.ts diff --git a/backend/src/api/auth/authPasswordReset.ts b/backend/src/api/auth/authPasswordReset.ts deleted file mode 100644 index cb6e557741..0000000000 --- a/backend/src/api/auth/authPasswordReset.ts +++ /dev/null @@ -1,7 +0,0 @@ -import AuthService from '../../services/auth/authService' - -export default async (req, res) => { - const payload = await AuthService.passwordReset(req.body.token, req.body.password, req) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/auth/authSendEmailAddressVerificationEmail.ts b/backend/src/api/auth/authSendEmailAddressVerificationEmail.ts deleted file mode 100644 index e0e19bc6d8..0000000000 --- a/backend/src/api/auth/authSendEmailAddressVerificationEmail.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Error403 } from '@crowd/common' - -import AuthService from '../../services/auth/authService' - -export default async (req, res) => { - if (!req.currentUser) { - throw new Error403(req.language) - } - - await AuthService.sendEmailAddressVerificationEmail( - req.language, - req.currentUser.email, - req.body.tenantId, - req, - ) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/auth/authSendPasswordResetEmail.ts b/backend/src/api/auth/authSendPasswordResetEmail.ts deleted file mode 100644 index 3ff4a96e7e..0000000000 --- a/backend/src/api/auth/authSendPasswordResetEmail.ts +++ /dev/null @@ -1,9 +0,0 @@ -import AuthService from '../../services/auth/authService' - -export default async (req, res) => { - await AuthService.sendPasswordResetEmail(req.language, req.body.email, req.body.tenantId, req) - - const payload = true - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/auth/authVerifyEmail.ts b/backend/src/api/auth/authVerifyEmail.ts deleted file mode 100644 index 1f8fce1f1e..0000000000 --- a/backend/src/api/auth/authVerifyEmail.ts +++ /dev/null @@ -1,7 +0,0 @@ -import AuthService from '../../services/auth/authService' - -export default async (req, res) => { - const payload = await AuthService.verifyEmail(req.body.token, req) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/auth/index.ts b/backend/src/api/auth/index.ts index a8545cbbde..2e05085d58 100644 --- a/backend/src/api/auth/index.ts +++ b/backend/src/api/auth/index.ts @@ -2,26 +2,6 @@ import { safeWrap } from '../../middlewares/errorMiddleware' import { createRateLimiter } from '../apiRateLimiter' export default (app) => { - app.put(`/auth/password-reset`, safeWrap(require('./authPasswordReset').default)) - - const emailRateLimiter = createRateLimiter({ - max: 6, - windowMs: 15 * 60 * 1000, - message: 'errors.429', - }) - - app.post( - `/auth/send-email-address-verification-email`, - emailRateLimiter, - safeWrap(require('./authSendEmailAddressVerificationEmail').default), - ) - - app.post( - `/auth/send-password-reset-email`, - emailRateLimiter, - safeWrap(require('./authSendPasswordResetEmail').default), - ) - const signInRateLimiter = createRateLimiter({ max: 100, windowMs: 15 * 60 * 1000, @@ -42,8 +22,6 @@ export default (app) => { app.put(`/auth/change-password`, safeWrap(require('./authPasswordChange').default)) - app.put(`/auth/verify-email`, safeWrap(require('./authVerifyEmail').default)) - app.get(`/auth/me`, safeWrap(require('./authMe').default)) app.post(`/auth/sso/callback`, safeWrap(require('./ssoCallback').default)) diff --git a/backend/src/api/integration/helpers/discordAuthenticate.ts b/backend/src/api/integration/helpers/discordAuthenticate.ts deleted file mode 100644 index 1bec25085e..0000000000 --- a/backend/src/api/integration/helpers/discordAuthenticate.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.tenantEdit) - const payload = await new IntegrationService(req).discordConnect(req.params.guild_id) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/conf/configTypes.ts b/backend/src/conf/configTypes.ts index ba7517ead0..6cdbf980b4 100644 --- a/backend/src/conf/configTypes.ts +++ b/backend/src/conf/configTypes.ts @@ -112,6 +112,14 @@ export interface GoogleConfiguration { callbackUrl: string } +export interface DiscordConfiguration { + token: string + token2: string + maxRetrospectInSeconds: number + globalLimit?: number + limitResetFrequencyDays?: number +} + export interface GithubConfiguration { appId: string clientId: string diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index ebd8f0bed1..45a175fa42 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -13,6 +13,7 @@ import { ComprehendConfiguration, CrowdAnalyticsConfiguration, DbConfiguration, + DiscordConfiguration, EagleEyeConfiguration, EncryptionConfiguration, EnrichmentConfiguration, @@ -106,6 +107,8 @@ export const SLACK_NOTIFIER_CONFIG: SlackNotifierConfiguration = export const GOOGLE_CONFIG: GoogleConfiguration = config.get('google') +export const DISCORD_CONFIG: DiscordConfiguration = config.get('discord') + export const GITHUB_CONFIG: GithubConfiguration = config.get('github') export const GITHUB_ISSUE_REPORTER_CONFIG: IGithubIssueReporterConfiguration = diff --git a/backend/src/services/conversationService.ts b/backend/src/services/conversationService.ts index 19d24ac7db..34428a42e6 100644 --- a/backend/src/services/conversationService.ts +++ b/backend/src/services/conversationService.ts @@ -152,10 +152,6 @@ export default class ConversationService extends LoggerBase { } if (data.customUrl || data.logoUrl || data.faviconUrl || data.theme || data.autoPublish) { - if (data.customUrl) { - await ConversationSettingsService.updateCustomDomainNetlify(data.customUrl) - } - conversationSettings = await ConversationSettingsService.save( { enabled: data.enabled, diff --git a/backend/src/services/conversationSettingsService.ts b/backend/src/services/conversationSettingsService.ts index 249b765781..1e5eed5ceb 100644 --- a/backend/src/services/conversationSettingsService.ts +++ b/backend/src/services/conversationSettingsService.ts @@ -1,8 +1,5 @@ -import Axios from 'axios' +import { LoggerBase } from '@crowd/logging' -import { LoggerBase, getServiceChildLogger } from '@crowd/logging' - -import { NETLIFY_CONFIG } from '../conf/index' import ConversationSettingsRepository from '../database/repositories/conversationSettingsRepository' import SequelizeRepository from '../database/repositories/sequelizeRepository' @@ -10,8 +7,6 @@ import { IServiceOptions } from './IServiceOptions' const DEFAULT_CONVERSATION_SETTINGS = {} -const log = getServiceChildLogger('ConversationSettingsService') - export default class ConversationSettingsService extends LoggerBase { options: IServiceOptions @@ -36,26 +31,4 @@ export default class ConversationSettingsService extends LoggerBase { return settings } - - static async updateCustomDomainNetlify(customUrl) { - try { - const domain = - customUrl.indexOf('http') !== -1 ? customUrl : new URL(`https://${customUrl}`).hostname - const netlifyClient = Axios.create({ - baseURL: 'https://api.netlify.com/api/v1/', - headers: { - Authorization: `Bearer ${NETLIFY_CONFIG.apiKey}`, - }, - }) - const { data: netlifySites } = await netlifyClient.get('sites') - const netlifySite = netlifySites.find((s) => s.custom_domain === NETLIFY_CONFIG.siteDomain) - const domainAliases = [...netlifySite.domain_aliases, domain] - await netlifyClient.patch(`sites/${netlifySite.id}`, { - domain_aliases: domainAliases, - }) - } catch (error) { - log.error(error, 'Error updating custom netflify domain!') - throw new Error(error.message) - } - } } diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 33e9e638d6..a5978e8189 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -43,7 +43,6 @@ import { } from '@/serverless/integrations/usecases/groupsio/types' import { - DISCORD_CONFIG, GITHUB_CONFIG, GITHUB_TOKEN_CONFIG, GITLAB_CONFIG, @@ -75,8 +74,6 @@ import { IServiceOptions } from './IServiceOptions' import OrganizationService from './organizationService' import SearchSyncService from './searchSyncService' -const discordToken = DISCORD_CONFIG.token || DISCORD_CONFIG.token2 - export default class IntegrationService { options: IServiceOptions @@ -652,50 +649,6 @@ export default class IntegrationService { } } - /** - * Adds discord integration to a tenant - * @param guildId Guild id of the discord server - * @returns integration object - */ - async discordConnect(guildId) { - const transaction = await SequelizeRepository.createTransaction(this.options) - - let integration - - try { - this.options.log.info('Creating Discord integration!') - integration = await this.createOrUpdate( - { - platform: PlatformType.DISCORD, - integrationIdentifier: guildId, - token: discordToken, - settings: { channels: [], updateMemberAttributes: true }, - status: 'in-progress', - }, - transaction, - ) - - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - - this.options.log.info( - { tenantId: integration.tenantId }, - 'Sending Discord message to int-run-worker!', - ) - const emitter = await getIntegrationRunWorkerEmitter() - await emitter.triggerIntegrationRun( - integration.tenantId, - integration.platform, - integration.id, - true, - ) - - return integration - } - async linkedinOnboard(organizationId) { let integration try { From 7f160b90abd9675e672d40ee720a8abc256ef21b Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 8 Jan 2025 19:06:13 +0530 Subject: [PATCH 08/25] resolve pr comments --- .../repositories/automationRepository.ts | 4 ---- backend/src/services/conversationService.ts | 16 +--------------- backend/src/services/memberService.ts | 4 ++-- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/backend/src/database/repositories/automationRepository.ts b/backend/src/database/repositories/automationRepository.ts index f79f9f6b7c..a09c79480d 100644 --- a/backend/src/database/repositories/automationRepository.ts +++ b/backend/src/database/repositories/automationRepository.ts @@ -58,10 +58,6 @@ export default class AutomationRepository extends RepositoryBase< const transaction = this.transaction - if (data.state === AutomationState.ACTIVE) { - throw new Error(`Maximum number of active automations reached for the plan!`) - } - let record = await this.database.automation.findOne({ where: { id, diff --git a/backend/src/services/conversationService.ts b/backend/src/services/conversationService.ts index 34428a42e6..f9f9b9a775 100644 --- a/backend/src/services/conversationService.ts +++ b/backend/src/services/conversationService.ts @@ -125,7 +125,7 @@ export default class ConversationService extends LoggerBase { const integrationService = new IntegrationService(this.options) let tenant let settings - let conversationSettings = await ConversationSettingsService.findOrCreateDefault(this.options) + const conversationSettings = await ConversationSettingsService.findOrCreateDefault(this.options) if (data.tenant) { tenant = await tenantService.update(this.options.currentTenant.id, data.tenant) @@ -151,20 +151,6 @@ export default class ConversationService extends LoggerBase { settings = await SettingsService.save({ website: data.website }, this.options) } - if (data.customUrl || data.logoUrl || data.faviconUrl || data.theme || data.autoPublish) { - conversationSettings = await ConversationSettingsService.save( - { - enabled: data.enabled, - customUrl: data.customUrl, - logoUrl: data.logoUrl, - faviconUrl: data.faviconUrl, - theme: data.theme, - autoPublish: data.autoPublish, - }, - this.options, - ) - } - const activeIntegrations = await integrationService.getAllActiveIntegrations() const inviteLinks = activeIntegrations.rows.reduce((acc, i) => { diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index 4e9c1c1a70..7cfd6b2212 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -895,7 +895,7 @@ export default class MemberService extends LoggerBase { memberId: string, identityId: string, ): Promise> { - const relationships = ['tags', 'tasks', 'identities', 'affiliations'] + const relationships = ['tags', 'identities', 'affiliations'] try { const qx = SequelizeRepository.getQueryExecutor(this.options) @@ -910,7 +910,7 @@ export default class MemberService extends LoggerBase { ]) this.options.log.info( - '[0] Getting member information (identities, tags, tasks, affiliations)... ', + '[0] Getting member information (identities, tags, affiliations)... ', ) const [memberOrganizations, identities, tags, affiliations] = await Promise.all([ From 5a5dbfe36a6bf9702ba3b9d1849ed2bdb0a71d81 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 8 Jan 2025 20:39:18 +0530 Subject: [PATCH 09/25] rm quickStart guide and tenant event tracking --- backend/src/api/eventTracking/eventTrack.ts | 11 --- backend/src/api/eventTracking/index.ts | 5 -- backend/src/api/index.ts | 3 - backend/src/api/quickstart-guide/index.ts | 9 -- .../quickstart-guide/quickstartGuideList.ts | 11 --- .../quickstartGuideSettingsUpdate.ts | 11 --- backend/src/database/models/tenantUser.ts | 1 - backend/src/security/permissions.ts | 8 -- backend/src/services/eventTrackingService.ts | 19 ----- backend/src/services/memberService.ts | 4 +- .../src/services/quickstartGuideService.ts | 85 ------------------- backend/src/types/quickstartGuideTypes.ts | 80 ----------------- 12 files changed, 1 insertion(+), 246 deletions(-) delete mode 100644 backend/src/api/eventTracking/eventTrack.ts delete mode 100644 backend/src/api/eventTracking/index.ts delete mode 100644 backend/src/api/quickstart-guide/index.ts delete mode 100644 backend/src/api/quickstart-guide/quickstartGuideList.ts delete mode 100644 backend/src/api/quickstart-guide/quickstartGuideSettingsUpdate.ts delete mode 100644 backend/src/services/eventTrackingService.ts delete mode 100644 backend/src/services/quickstartGuideService.ts delete mode 100644 backend/src/types/quickstartGuideTypes.ts diff --git a/backend/src/api/eventTracking/eventTrack.ts b/backend/src/api/eventTracking/eventTrack.ts deleted file mode 100644 index a84d32ae10..0000000000 --- a/backend/src/api/eventTracking/eventTrack.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import EventTrackingService from '../../services/eventTrackingService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.quickstartGuideRead) - - const payload = await new EventTrackingService(req).trackEvent(req.body) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/eventTracking/index.ts b/backend/src/api/eventTracking/index.ts deleted file mode 100644 index c0413ec500..0000000000 --- a/backend/src/api/eventTracking/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - app.post(`/tenant/:tenantId/event-tracking`, safeWrap(require('./eventTrack').default)) -} diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 6348aecfce..34083e02b4 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -177,7 +177,6 @@ setImmediate(async () => { require('./auditLog').default(routes) require('./auth').default(routes) - require('./plan').default(routes) require('./tenant').default(routes) require('./user').default(routes) require('./settings').default(routes) @@ -190,11 +189,9 @@ setImmediate(async () => { require('./eagleEyeContent').default(routes) require('./automation').default(routes) require('./organization').default(routes) - require('./quickstart-guide').default(routes) require('./slack').default(routes) require('./segment').default(routes) require('./systemStatus').default(routes) - require('./eventTracking').default(routes) require('./customViews').default(routes) require('./dashboard').default(routes) require('./mergeAction').default(routes) diff --git a/backend/src/api/quickstart-guide/index.ts b/backend/src/api/quickstart-guide/index.ts deleted file mode 100644 index 0dee4144ac..0000000000 --- a/backend/src/api/quickstart-guide/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { safeWrap } from '../../middlewares/errorMiddleware' - -export default (app) => { - app.get(`/tenant/:tenantId/quickstart-guide`, safeWrap(require('./quickstartGuideList').default)) - app.post( - `/tenant/:tenantId/quickstart-guide/settings`, - safeWrap(require('./quickstartGuideSettingsUpdate').default), - ) -} diff --git a/backend/src/api/quickstart-guide/quickstartGuideList.ts b/backend/src/api/quickstart-guide/quickstartGuideList.ts deleted file mode 100644 index 5e7c6b296b..0000000000 --- a/backend/src/api/quickstart-guide/quickstartGuideList.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import QuickstartGuideService from '../../services/quickstartGuideService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.quickstartGuideRead) - - const payload = await new QuickstartGuideService(req).find() - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/quickstart-guide/quickstartGuideSettingsUpdate.ts b/backend/src/api/quickstart-guide/quickstartGuideSettingsUpdate.ts deleted file mode 100644 index 18a527ce65..0000000000 --- a/backend/src/api/quickstart-guide/quickstartGuideSettingsUpdate.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Permissions from '../../security/permissions' -import QuickstartGuideService from '../../services/quickstartGuideService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.quickstartGuideSettingsUpdate) - - const payload = await new QuickstartGuideService(req).updateSettings(req.body) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/database/models/tenantUser.ts b/backend/src/database/models/tenantUser.ts index e14696fef2..a3f2cf7efb 100644 --- a/backend/src/database/models/tenantUser.ts +++ b/backend/src/database/models/tenantUser.ts @@ -48,7 +48,6 @@ export default (sequelize, DataTypes) => { allowNull: false, defaultValue: { isEagleEyeGuideDismissed: false, - isQuickstartGuideDismissed: false, eagleEye: { onboarded: false, }, diff --git a/backend/src/security/permissions.ts b/backend/src/security/permissions.ts index 0e5bd490eb..6594004e60 100644 --- a/backend/src/security/permissions.ts +++ b/backend/src/security/permissions.ts @@ -317,14 +317,6 @@ class Permissions { id: 'noteAutocomplete', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], }, - quickstartGuideRead: { - id: 'quickstartGuideRead', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - }, - quickstartGuideSettingsUpdate: { - id: 'quickstartGuideSettingsUpdate', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - }, segmentRead: { id: 'segmentRead', allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], diff --git a/backend/src/services/eventTrackingService.ts b/backend/src/services/eventTrackingService.ts deleted file mode 100644 index f6d2fb3129..0000000000 --- a/backend/src/services/eventTrackingService.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { LoggerBase } from '@crowd/logging' - -import track from '../segment/track' -import { Event } from '../types/eventTrackingTypes' - -import { IServiceOptions } from './IServiceOptions' - -export default class EventTrackingService extends LoggerBase { - options: IServiceOptions - - constructor(options: IServiceOptions) { - super(options.log) - this.options = options - } - - async trackEvent(event: Event) { - await track(event.name, event.properties, this.options) - } -} diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index 7cfd6b2212..ea0ca23e88 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -909,9 +909,7 @@ export default class MemberService extends LoggerBase { MemberField.MANUALLY_CHANGED_FIELDS, ]) - this.options.log.info( - '[0] Getting member information (identities, tags, affiliations)... ', - ) + this.options.log.info('[0] Getting member information (identities, tags, affiliations)... ') const [memberOrganizations, identities, tags, affiliations] = await Promise.all([ MemberOrganizationRepository.findMemberRoles(memberId, this.options), diff --git a/backend/src/services/quickstartGuideService.ts b/backend/src/services/quickstartGuideService.ts deleted file mode 100644 index d6719ff420..0000000000 --- a/backend/src/services/quickstartGuideService.ts +++ /dev/null @@ -1,85 +0,0 @@ -import lodash from 'lodash' - -import { LoggerBase } from '@crowd/logging' - -import SettingsRepository from '@/database/repositories/settingsRepository' - -import AutomationRepository from '../database/repositories/automationRepository' -import IntegrationRepository from '../database/repositories/integrationRepository' -import TenantUserRepository from '../database/repositories/tenantUserRepository' -import { - DEFAULT_GUIDES, - QuickstartGuideMap, - QuickstartGuideSettings, - QuickstartGuideType, -} from '../types/quickstartGuideTypes' - -import { IServiceOptions } from './IServiceOptions' - -export default class QuickstartGuideService extends LoggerBase { - options: IServiceOptions - - constructor(options: IServiceOptions) { - super(options.log) - this.options = options - } - - async updateSettings(settings: any) { - const quickstartGuideSettings: QuickstartGuideSettings = lodash.pick(settings, [ - 'isEagleEyeGuideDismissed', - 'isQuickstartGuideDismissed', - ]) - - const tenantUser = await TenantUserRepository.updateSettings( - this.options.currentUser.id, - quickstartGuideSettings, - this.options, - ) - - return tenantUser - } - - async find(): Promise { - const guides: QuickstartGuideMap = JSON.parse(JSON.stringify(DEFAULT_GUIDES)) - - if (QuickstartGuideType.INVITE_COLLEAGUES in guides) { - const allTenantUsers = await TenantUserRepository.findByTenant( - this.options.currentTenant.id, - this.options, - ) - guides[QuickstartGuideType.INVITE_COLLEAGUES].completed = allTenantUsers.some( - (tu) => tu.invitedById === this.options.currentUser.id, - ) - } - - if (QuickstartGuideType.CONNECT_FIRST_INTEGRATION in guides) { - const integrationCount: number = await IntegrationRepository.count({}, this.options) - guides[QuickstartGuideType.CONNECT_FIRST_INTEGRATION].completed = integrationCount > 0 - } - - if (QuickstartGuideType.CREATE_AUTOMATIONS in guides) { - const automations = await new AutomationRepository(this.options).findAndCountAll({}) - guides[QuickstartGuideType.CREATE_AUTOMATIONS].completed = automations.count > 0 - } - - if ( - QuickstartGuideType.EXPLORE_ORGANIZATIONS in guides || - QuickstartGuideType.EXPLORE_CONTACTS in guides - ) { - const tenantSettings = await SettingsRepository.getTenantSettings( - this.options.currentTenant.id, - this.options, - ) - if (QuickstartGuideType.EXPLORE_ORGANIZATIONS in guides) { - guides[QuickstartGuideType.EXPLORE_ORGANIZATIONS].completed = - tenantSettings.organizationsViewed - } - - if (QuickstartGuideType.EXPLORE_CONTACTS in guides) { - guides[QuickstartGuideType.EXPLORE_CONTACTS].completed = tenantSettings.contactsViewed - } - } - - return guides - } -} diff --git a/backend/src/types/quickstartGuideTypes.ts b/backend/src/types/quickstartGuideTypes.ts deleted file mode 100644 index 7c3f7ae3a3..0000000000 --- a/backend/src/types/quickstartGuideTypes.ts +++ /dev/null @@ -1,80 +0,0 @@ -export enum QuickstartGuideType { - INVITE_COLLEAGUES = 'invite-colleagues', - CONNECT_FIRST_INTEGRATION = 'connect-first-integration', - EXPLORE_CONTACTS = 'explore-contacts', - EXPLORE_ORGANIZATIONS = 'explore-organizations', - CREATE_AUTOMATIONS = 'create-automations', -} - -export interface QuickstartGuideMap { - [key: string]: QuickstartGuide -} - -export interface QuickstartGuide { - title: string - body: string - learnMoreLink: string - buttonLink: string - buttonText: string - completed: boolean - disabledInSampleData?: boolean - disabledTooltipText?: string -} - -export interface QuickstartGuideSettings { - isEagleEyeGuideDismissed: boolean - isQuickstartGuideDismissed: boolean -} - -const connectFirstIntegrationGuide: QuickstartGuide = { - title: 'Connect your first integration', - body: 'Connect with our built-in integrations to start syncing data from your digital channels.', - learnMoreLink: 'https://docs.crowd.dev/docs/getting-started/integrations', - buttonLink: '/integrations', - buttonText: 'Connect integrations', - completed: false, -} - -const inviteColleaguesGuide: QuickstartGuide = { - title: 'Invite your colleagues', - body: 'Invite colleagues to your crowd.dev workspace by giving full access or read-only permissions.', - learnMoreLink: 'https://docs.crowd.dev/docs/getting-started/getting-set-up', - buttonLink: '/settings', - buttonText: 'Invite colleagues', - completed: false, -} - -const exploreOrganizations: QuickstartGuide = { - title: 'Explore organizations', - body: 'Discover organizations with developers engaging with your ecosystem or technology and see which companies fit your ICP.', - learnMoreLink: 'https://docs.crowd.dev/docs/guides/organizations', - buttonLink: '/organizations', - buttonText: 'Explore organizations', - completed: false, -} - -const exploreContacts: QuickstartGuide = { - title: 'Explore contacts', - body: 'Get an overview of all contacts that engaged with your product or community across the platforms you have connected.', - learnMoreLink: 'https://docs.crowd.dev/docs/guides/contacts', - buttonLink: '/contacts', - buttonText: 'Explore contacts', - completed: false, -} - -const createAutomations: QuickstartGuide = { - title: 'Create automations', - body: 'Stop focusing on repetitive tasks and concentrate on building deeper relationships with your community by automating your workflows via HubSpot syncs, Slack notifications, or Webhooks.', - learnMoreLink: 'https://docs.crowd.dev/docs/guides/automations', - buttonLink: '/automations', - buttonText: 'Create automations', - completed: false, -} - -export const DEFAULT_GUIDES = { - [QuickstartGuideType.CONNECT_FIRST_INTEGRATION]: connectFirstIntegrationGuide, - [QuickstartGuideType.INVITE_COLLEAGUES]: inviteColleaguesGuide, - [QuickstartGuideType.EXPLORE_CONTACTS]: exploreContacts, - [QuickstartGuideType.EXPLORE_ORGANIZATIONS]: exploreOrganizations, - [QuickstartGuideType.CREATE_AUTOMATIONS]: createAutomations, -} From dcbacf76800ebf60834b3083b124f6604ca46bc0 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 9 Jan 2025 14:41:11 +0530 Subject: [PATCH 10/25] rm api docs workflow --- .github/workflows/api-docs.yaml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .github/workflows/api-docs.yaml diff --git a/.github/workflows/api-docs.yaml b/.github/workflows/api-docs.yaml deleted file mode 100644 index a4f1fde4c0..0000000000 --- a/.github/workflows/api-docs.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: API docs - -on: - release: - types: [released] -jobs: - tests-main: - runs-on: ubuntu-latest - defaults: - run: - shell: bash - working-directory: ./backend - - steps: - - name: Check out repository code - uses: actions/checkout@v2 - - - name: Install root dependencies - run: corepack enable && pnpm i --frozen-lockfile - - - name: Run docs script - working-directory: ./backend - run: pnpm run docs -- ${{ secrets.README_API_KEY }} From 0e2588fc91c22fcdac1c99952f0c05c27472053e Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 9 Jan 2025 16:26:17 +0530 Subject: [PATCH 11/25] remove scripts/deploy folder --- scripts/deploy/kubernetes/.backend.env | 68 ---------------- scripts/deploy/kubernetes/.frontend.env | 9 --- scripts/deploy/kubernetes/api.yaml | 39 ---------- scripts/deploy/kubernetes/db.yaml | 36 --------- scripts/deploy/kubernetes/elasticmq.yaml | 30 ------- scripts/deploy/kubernetes/frontend.yaml | 34 -------- scripts/deploy/kubernetes/ingress.yaml | 55 ------------- scripts/deploy/kubernetes/job-generator.yaml | 25 ------ scripts/deploy/kubernetes/letsencrypt.yaml | 16 ---- scripts/deploy/kubernetes/nango.yaml | 74 ------------------ scripts/deploy/kubernetes/redis.yaml | 32 -------- scripts/deploy/pre-built/backend.env | 78 ------------------- scripts/deploy/pre-built/crowd-services.yaml | 47 ----------- scripts/deploy/pre-built/frontend.env | 10 --- .../deploy/pre-built/scaffold-services.yaml | 77 ------------------ 15 files changed, 630 deletions(-) delete mode 100644 scripts/deploy/kubernetes/.backend.env delete mode 100644 scripts/deploy/kubernetes/.frontend.env delete mode 100644 scripts/deploy/kubernetes/api.yaml delete mode 100644 scripts/deploy/kubernetes/db.yaml delete mode 100644 scripts/deploy/kubernetes/elasticmq.yaml delete mode 100644 scripts/deploy/kubernetes/frontend.yaml delete mode 100644 scripts/deploy/kubernetes/ingress.yaml delete mode 100644 scripts/deploy/kubernetes/job-generator.yaml delete mode 100644 scripts/deploy/kubernetes/letsencrypt.yaml delete mode 100644 scripts/deploy/kubernetes/nango.yaml delete mode 100644 scripts/deploy/kubernetes/redis.yaml delete mode 100644 scripts/deploy/pre-built/backend.env delete mode 100644 scripts/deploy/pre-built/crowd-services.yaml delete mode 100644 scripts/deploy/pre-built/frontend.env delete mode 100644 scripts/deploy/pre-built/scaffold-services.yaml diff --git a/scripts/deploy/kubernetes/.backend.env b/scripts/deploy/kubernetes/.backend.env deleted file mode 100644 index 54072a547c..0000000000 --- a/scripts/deploy/kubernetes/.backend.env +++ /dev/null @@ -1,68 +0,0 @@ -# Global settings -KUBE_MODE=1 -CROWD_EDITION=community -TENANT_MODE=multi -NODE_ENV=production -SERVICE_ENV=production - -# API settings -CROWD_API_URL= -CROWD_API_FRONTEND_URL= -CROWD_API_JWT_SECRET=90c26243-a624-4902-b344-95fd417cdd1a -CROWD_API_JWT_EXPIRES_IN=100 years - -# SQS settings -CROWD_SQS_HOST=elasticmq-svc -CROWD_SQS_PORT=9324 -CROWD_SQS_ENDPOINT=http://elasticmq-svc:9324 -CROWD_SQS_AWS_ACCOUNT_ID=000000000000 -CROWD_SQS_AWS_ACCESS_KEY_ID=x -CROWD_SQS_AWS_SECRET_ACCESS_KEY=x -CROWD_SQS_AWS_REGION=elasticmq - -# Redis settings -CROWD_REDIS_USERNAME=default -CROWD_REDIS_PASSWORD=crowdtest -CROWD_REDIS_HOST=redis-svc -CROWD_REDIS_PORT=6379 - -# DB settings -CROWD_DB_READ_HOST=db-svc -CROWD_DB_WRITE_HOST=db-svc -CROWD_DB_PORT=5432 -CROWD_DB_USERNAME=postgres -CROWD_DB_PASSWORD=example -CROWD_DB_DATABASE=crowd-web - -# Segment settings -CROWD_SEGMENT_WRITE_KEY=TdX3BLaZuHpHyzN2lcDiNiRHDSH9Piyl - -# Twitter settings -CROWD_TWITTER_CLIENT_ID= -CROWD_TWITTER_CLIENT_SECRET= - -# Slack settings -CROWD_SLACK_CLIENT_ID= -CROWD_SLACK_CLIENT_SECRET= - -# Google settings -CROWD_GOOGLE_CLIENT_ID= -CROWD_GOOGLE_CLIENT_SECRET= -CROWD_GOOGLE_CALLBACK_URL= - -# Discord settings -CROWD_DISCORD_TOKEN= - -# Superface settings -SUPERFACE_SDK_TOKEN=sfs_29f8c03402d48b583f9b35bbb5fbb423cf638e73bde38a7cce6a5fb7bb352720193471189882b6d82494203bc998be47a52ab9d4250f90b16d2bd86b4c7ace2b_1d8a819b - -# Github settings -CROWD_GITHUB_APP_ID= -CROWD_GITHUB_CLIENT_ID= -CROWD_GITHUB_CLIENT_SECRET= -CROWD_GITHUB_PRIVATE_KEY= -CROWD_GITHUB_WEBHOOK_SECRET= - -CROWD_NANGO_SECRET_KEY=fa920130-ac41-11ed-afa1-0242ac120002 -CROWD_NANGO_URL=http://nango-svc:3003 -CROWD_NANGO_URL_CALLBACK=http://nango.nango.domain.name/oauth/callback \ No newline at end of file diff --git a/scripts/deploy/kubernetes/.frontend.env b/scripts/deploy/kubernetes/.frontend.env deleted file mode 100644 index b5d3f054e2..0000000000 --- a/scripts/deploy/kubernetes/.frontend.env +++ /dev/null @@ -1,9 +0,0 @@ -VUE_APP_EDITION=community -VUE_APP_COMMUNITY_PREMIUM=false -VUE_APP_SEGMENT_KEY=TdX3BLaZuHpHyzN2lcDiNiRHDSH9Piyl -VUE_APP_BACKEND_URL= -VUE_APP_FRONTEND_HOST= -VUE_APP_FRONTEND_PROTOCOL= -VUE_APP_GITHUB_INSTALLATION_URL= -VUE_APP_DISCORD_INSTALLATION_URL= -VUE_APP_NANGO_URL=https://nango.domain.name \ No newline at end of file diff --git a/scripts/deploy/kubernetes/api.yaml b/scripts/deploy/kubernetes/api.yaml deleted file mode 100644 index b21209da68..0000000000 --- a/scripts/deploy/kubernetes/api.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: api-dpl -spec: - selector: - matchLabels: - app: api - template: - metadata: - labels: - app: api - spec: - containers: - - name: api - image: crowddotdev/backend:1666904557.59dad54 - command: ['npm'] - args: ['run', 'start:api'] - envFrom: - - configMapRef: - name: backend-config - env: - - name: SERVICE - value: api - ports: - - containerPort: 8080 ---- -apiVersion: v1 -kind: Service -metadata: - name: api-svc -spec: - type: ClusterIP - selector: - app: api - ports: - - port: 8080 - targetPort: 8080 diff --git a/scripts/deploy/kubernetes/db.yaml b/scripts/deploy/kubernetes/db.yaml deleted file mode 100644 index 34a94a93e4..0000000000 --- a/scripts/deploy/kubernetes/db.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: db-dpl -spec: - selector: - matchLabels: - app: db - template: - metadata: - labels: - app: db - spec: - containers: - - name: db - image: crowddotdev/db:1666904672.59dad54 - env: - - name: POSTGRES_PASSWORD - value: example - - name: POSTGRES_DB - value: crowd-web - ports: - - containerPort: 5432 ---- -apiVersion: v1 -kind: Service -metadata: - name: db-svc -spec: - type: ClusterIP - selector: - app: db - ports: - - port: 5432 - targetPort: 5432 diff --git a/scripts/deploy/kubernetes/elasticmq.yaml b/scripts/deploy/kubernetes/elasticmq.yaml deleted file mode 100644 index fc0419677a..0000000000 --- a/scripts/deploy/kubernetes/elasticmq.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: elasticmq-dpl -spec: - selector: - matchLabels: - app: elasticmq - template: - metadata: - labels: - app: elasticmq - spec: - containers: - - name: elasticmq - image: crowddotdev/elasticmq:1666904719.59dad54 - ports: - - containerPort: 9324 ---- -apiVersion: v1 -kind: Service -metadata: - name: elasticmq-svc -spec: - selector: - app: elasticmq - ports: - - port: 9324 - targetPort: 9324 diff --git a/scripts/deploy/kubernetes/frontend.yaml b/scripts/deploy/kubernetes/frontend.yaml deleted file mode 100644 index 22912757b0..0000000000 --- a/scripts/deploy/kubernetes/frontend.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: frontend-dpl -spec: - selector: - matchLabels: - app: frontend - template: - metadata: - labels: - app: frontend - spec: - containers: - - name: frontend - image: crowddotdev/frontend:1666904549.59dad54 - envFrom: - - configMapRef: - name: frontend-config - ports: - - containerPort: 8081 ---- -apiVersion: v1 -kind: Service -metadata: - name: frontend-svc -spec: - type: ClusterIP - selector: - app: frontend - ports: - - port: 8081 - targetPort: 8081 diff --git a/scripts/deploy/kubernetes/ingress.yaml b/scripts/deploy/kubernetes/ingress.yaml deleted file mode 100644 index f60effa907..0000000000 --- a/scripts/deploy/kubernetes/ingress.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: ingress - labels: - name: ingress - annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt-issuer - nginx.ingress.kubernetes.io/ssl-redirect: 'true' - nginx.ingress.kubernetes.io/force-ssl-redirect: 'true' - nginx.ingress.kubernetes.io/rewrite-target: /$1 - -spec: - tls: - - hosts: - - example.domain.name - - nango.domain.name - secretName: letsencrypt-issuer - rules: - - host: example.domain.name - http: - paths: - - path: /search/?(.*) - pathType: Prefix - backend: - service: - name: search-engine-svc - port: - number: 7700 - - path: /api/?(.*) - pathType: Prefix - backend: - service: - name: api-svc - port: - number: 8080 - - path: /?(.*) - pathType: Prefix - backend: - service: - name: frontend-svc - port: - number: 8081 - - host: nango.domain.name - http: - paths: - - path: /?(.*) - pathType: Prefix - backend: - service: - name: nango-svc - port: - number: 3003 diff --git a/scripts/deploy/kubernetes/job-generator.yaml b/scripts/deploy/kubernetes/job-generator.yaml deleted file mode 100644 index c5c0facde9..0000000000 --- a/scripts/deploy/kubernetes/job-generator.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: job-generator-dpl -spec: - selector: - matchLabels: - app: job-generator - template: - metadata: - labels: - app: job-generator - spec: - containers: - - name: job-generator - image: crowddotdev/backend:1666904557.59dad54 - command: ['npm'] - args: ['run', 'start:job-generator'] - envFrom: - - configMapRef: - name: backend-config - env: - - name: SERVICE - value: job-generator diff --git a/scripts/deploy/kubernetes/letsencrypt.yaml b/scripts/deploy/kubernetes/letsencrypt.yaml deleted file mode 100644 index 077e114906..0000000000 --- a/scripts/deploy/kubernetes/letsencrypt.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: letsencrypt-issuer - namespace: cert-manager -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: test@mail.com - privateKeySecretRef: - name: letsencrypt-issuer - solvers: - - http01: - ingress: - class: nginx diff --git a/scripts/deploy/kubernetes/nango.yaml b/scripts/deploy/kubernetes/nango.yaml deleted file mode 100644 index 4aeacd7ed5..0000000000 --- a/scripts/deploy/kubernetes/nango.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nango-dpl -spec: - selector: - matchLabels: - app: nango - template: - metadata: - labels: - app: nango - spec: - containers: - - name: nango - image: nangohq/nango-server:0.9.0 - env: - - name: NANGO_DB_HOST - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_DB_WRITE_HOST - - name: NANGO_DB_PORT - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_DB_PORT - - name: NANGO_DB_NAME - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_DB_DATABASE - - name: NANGO_DB_USER - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_DB_USERNAME - - name: NANGO_DB_PASSWORD - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_DB_PASSWORD - - name: NANGO_SECRET_KEY - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_NANGO_SECRET_KEY - - name: SERVER_PORT - value: '3003' - - name: NANGO_CALLBACK_URL - valueFrom: - configMapKeyRef: - name: backend-config - key: CROWD_NANGO_URL_CALLBACK - - name: NANGO_SERVER_URL - valueFrom: - configMapKeyRef: - name: frontend-config - key: VUE_APP_NANGO_URL - ports: - - containerPort: 3003 ---- -apiVersion: v1 -kind: Service -metadata: - name: nango-svc -spec: - type: ClusterIP - selector: - app: nango - ports: - - port: 3003 - targetPort: 3003 diff --git a/scripts/deploy/kubernetes/redis.yaml b/scripts/deploy/kubernetes/redis.yaml deleted file mode 100644 index dc1a23e277..0000000000 --- a/scripts/deploy/kubernetes/redis.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: redis-dpl -spec: - selector: - matchLabels: - app: redis - template: - metadata: - labels: - app: redis - spec: - containers: - - name: redis - image: crowddotdev/redis:1669030011.68836df - command: ['redis-server'] - args: ['/redis.conf', '--requirepass', 'crowdtest'] - ports: - - containerPort: 6379 ---- -apiVersion: v1 -kind: Service -metadata: - name: redis-svc -spec: - selector: - app: redis - ports: - - port: 6379 - targetPort: 6379 diff --git a/scripts/deploy/pre-built/backend.env b/scripts/deploy/pre-built/backend.env deleted file mode 100644 index b338f6b266..0000000000 --- a/scripts/deploy/pre-built/backend.env +++ /dev/null @@ -1,78 +0,0 @@ -# Global settings -KUBE_MODE=1 -CROWD_EDITION=community -TENANT_MODE=multi - -# API settings -CROWD_API_URL=https://localhost/api -CROWD_API_FRONTEND_URL=http://localhost:8081 -CROWD_API_JWT_SECRET=your-secret -CROWD_API_JWT_EXPIRES_IN='100 years' - -# SQS settings -CROWD_SQS_HOST="sqs" -CROWD_SQS_PORT=9324 -CROWD_SQS_AWS_ACCOUNT_ID=000000000000 -CROWD_SQS_AWS_ACCESS_KEY_ID=x -CROWD_SQS_AWS_SECRET_ACCESS_KEY=x -CROWD_SQS_AWS_REGION=elasticmq - -# Redis settings -CROWD_REDIS_USERNAME=default -CROWD_REDIS_PASSWORD=crowdtest -CROWD_REDIS_HOST=redis -CROWD_REDIS_PORT=6379 - -# S3 settings -CROWD_S3_HOST="s3" -CROWD_S3_PORT=9000 -CROWD_S3_INTEGRATION_ASSETS_BUCKET=crowd-integrations-assets -CROWD_S3_MICROSERVICES_ASSETS_BUCKET=crowd-microservices-assets -CROWD_S3_AWS_ACCOUNT_ID=000000000000 -CROWD_S3_AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE -CROWD_S3_AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -CROWD_S3_AWS_REGION=eu-central-1 - -# DB settings -CROWD_DB_READ_HOST="db" -CROWD_DB_WRITE_HOST="db" -CROWD_DB_PORT=5432 -CROWD_DB_USERNAME=postgres -CROWD_DB_PASSWORD=example -CROWD_DB_DATABASE=crowd-web - -# Segment settings -CROWD_SEGMENT_WRITE_KEY=TdX3BLaZuHpHyzN2lcDiNiRHDSH9Piyl - -# Twitter settings -CROWD_TWITTER_CLIENT_ID= -CROWD_TWITTER_CLIENT_SECRET= - -# Slack settings -CROWD_SLACK_CLIENT_ID= -CROWD_SLACK_CLIENT_SECRET= - -# Google settings -CROWD_GOOGLE_CLIENT_ID= -CROWD_GOOGLE_CLIENT_SECRET= -CROWD_GOOGLE_CALLBACK_URL= - -# Facebook settings -CROWD_FACEBOOK_CLIENT_ID= -CROWD_FACEBOOK_CLIENT_SECRET= -CROWD_FACEBOOK_CALLBACK_URL= - -# Discord settings -CROWD_DISCORD_TOKEN= - -# Github settings -CROWD_GITHUB_APP_ID= -CROWD_GITHUB_CLIENT_ID= -CROWD_GITHUB_CLIENT_SECRET= -CROWD_GITHUB_PRIVATE_KEY= -CROWD_GITHUB_WEBHOOK_SECRET= - -# Nango settings -CROWD_NANGO_URL=http://localhost:3003 -CROWD_NANGO_SECRET_KEY=424242 -CROWD_NANGO_URL_CALLBACK=http://localhost:3003/oauth/callback \ No newline at end of file diff --git a/scripts/deploy/pre-built/crowd-services.yaml b/scripts/deploy/pre-built/crowd-services.yaml deleted file mode 100644 index 323a41c52a..0000000000 --- a/scripts/deploy/pre-built/crowd-services.yaml +++ /dev/null @@ -1,47 +0,0 @@ -version: '3.1' - -x-env-args: &env-args - DOCKER_BUILDKIT: 1 - NODE_ENV: docker - -services: - frontend: - image: crowddotdev/frontend:1666904549.59dad54 - env_file: - - frontend.env - environment: - <<: *env-args - ports: - - '8081:8081' - restart: always - networks: - - crowd-bridge - - api: - image: crowddotdev/backend:1666904557.59dad54 - command: 'npm run start:api' - env_file: - - backend.env - environment: - <<: *env-args - SERVICE: api - ports: - - '8080:8080' - restart: always - networks: - - crowd-bridge - - job-generator: - image: crowddotdev/backend:1666904557.59dad54 - command: 'npm run start:job-generator' - env_file: - - backend.env - environment: - <<: *env-args - SERVICE: job-generator - restart: always - networks: - - crowd-bridge - -networks: - crowd-bridge: diff --git a/scripts/deploy/pre-built/frontend.env b/scripts/deploy/pre-built/frontend.env deleted file mode 100644 index e9f1ee573c..0000000000 --- a/scripts/deploy/pre-built/frontend.env +++ /dev/null @@ -1,10 +0,0 @@ -VUE_APP_EDITION=community -VUE_APP_COMMUNITY_PREMIUM=false -VUE_APP_SEGMENT_KEY=TdX3BLaZuHpHyzN2lcDiNiRHDSH9Piyl -VUE_APP_BACKEND_URL=http://localhost:8080 -VUE_APP_FRONTEND_HOST=localhost:8081 -VUE_APP_FRONTEND_PROTOCOL=http -VUE_APP_GITHUB_INSTALLATION_URL= -VUE_APP_DISCORD_INSTALLATION_URL= -VUE_APP_CONVERSATIONS_PUBLIC_URL= -VUE_APP_NANGO_URL=http://localhost:3003 diff --git a/scripts/deploy/pre-built/scaffold-services.yaml b/scripts/deploy/pre-built/scaffold-services.yaml deleted file mode 100644 index d212781a8a..0000000000 --- a/scripts/deploy/pre-built/scaffold-services.yaml +++ /dev/null @@ -1,77 +0,0 @@ -version: '3.1' - -services: - db: - image: crowddotdev/db:1666904672.59dad54 - environment: - - POSTGRES_PASSWORD=example - - POSTGRES_DB=crowd-web - ports: - - 5432:5432 - volumes: - - pgdata-dev:/var/lib/postgresql/data - healthcheck: - test: ['CMD-SHELL', 'pg_isready', '-d', 'crowd-web'] - interval: 30s - timeout: 60s - retries: 5 - start_period: 80s - networks: - - crowd-bridge - - nango: - image: nangohq/nango-server:0.9.0 - restart: always - depends_on: - db: - condition: service_healthy - environment: - - NANGO_DB_HOST=db - - NANGO_DB_PORT=5432 - - NANGO_DB_NAME=crowd-web - - NANGO_DB_USER=postgres - - NANGO_DB_PASSWORD=example - - NANGO_SECRET_KEY=424242 - - SERVER_PORT=3003 - - NANGO_CALLBACK_URL=http://localhost:3003/oauth/callback - - NANGO_SERVER_URL=http://localhost:3003/ - ports: - - '3003:3003' - networks: - - crowd-bridge - - sqs: - image: crowddotdev/elasticmq:1666904719.59dad54 - ports: - - 9324:9324 - - 9325:9325 - networks: - - crowd-bridge - - nginx: - image: crowddotdev/nginx:1666797978.7d4dfbd - ports: - - '443:443' - environment: - - NGINX_HOST=localhost - - NGINX_PORT=443 - networks: - - crowd-bridge - - redis: - image: crowddotdev/redis:1669030011.68836df - command: 'redis-server /redis.conf --requirepass crowdtest' - volumes: - - redis-dev:/data - ports: - - 6379:6379 - networks: - - crowd-bridge - -networks: - crowd-bridge: - -volumes: - pgdata-dev: - search-dev: - s3-dev: From a409986dc59e29b1886c06f06adf6d26bb9fc0db Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 9 Jan 2025 16:29:46 +0530 Subject: [PATCH 12/25] clean sequlize models --- backend/src/database/models/index.ts | 1 - backend/src/database/models/note.ts | 49 ---------------------------- 2 files changed, 50 deletions(-) delete mode 100644 backend/src/database/models/note.ts diff --git a/backend/src/database/models/index.ts b/backend/src/database/models/index.ts index 30a6717e1a..28816ce2aa 100644 --- a/backend/src/database/models/index.ts +++ b/backend/src/database/models/index.ts @@ -135,7 +135,6 @@ async function models(queryTimeoutMilliseconds: number, databaseHostnameOverride require('./automationExecution').default, require('./organization').default, require('./memberAttributeSettings').default, - require('./note').default, require('./segment').default, require('./customView').default, require('./customViewOrder').default, diff --git a/backend/src/database/models/note.ts b/backend/src/database/models/note.ts deleted file mode 100644 index 8738eebef7..0000000000 --- a/backend/src/database/models/note.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DataTypes } from 'sequelize' - -export default (sequelize) => { - const note = sequelize.define( - 'note', - { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, - }, - body: { - type: DataTypes.TEXT, - allowNull: false, - }, - importHash: { - type: DataTypes.STRING(255), - allowNull: true, - validate: { - len: [0, 255], - }, - }, - }, - { - indexes: [], - timestamps: true, - paranoid: true, - }, - ) - - note.associate = (models) => { - models.note.belongsTo(models.tenant, { - as: 'tenant', - foreignKey: { - allowNull: false, - }, - }) - - models.note.belongsTo(models.user, { - as: 'createdBy', - }) - - models.note.belongsTo(models.user, { - as: 'updatedBy', - }) - } - - return note -} From 8f1058008a9ce22bf47e7d06f9e47fd3670d856e Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 10 Jan 2025 13:56:30 +0530 Subject: [PATCH 13/25] rm automations, integration-sync-worker, and hubspot --- backend/.env.dist.local | 2 +- .../config/custom-environment-variables.json | 5 - backend/id-openapi.yaml | 4 +- backend/src/api/auth/authMe.ts | 29 +- .../src/api/automation/automationCreate.ts | 31 - .../src/api/automation/automationDestroy.ts | 27 - .../api/automation/automationExecutionFind.ts | 40 -- backend/src/api/automation/automationFind.ts | 24 - backend/src/api/automation/automationList.ts | 51 -- .../api/automation/automationSlackCallback.ts | 19 - .../api/automation/automationSlackConnect.ts | 21 - .../src/api/automation/automationUpdate.ts | 32 - backend/src/api/automation/index.ts | 51 -- backend/src/api/index.ts | 1 - .../api/integration/helpers/hubspotConnect.ts | 9 - .../integration/helpers/hubspotGetLists.ts | 9 - .../helpers/hubspotGetMappableFields.ts | 9 - .../api/integration/helpers/hubspotOnboard.ts | 9 - .../helpers/hubspotStopSyncMember.ts | 9 - .../helpers/hubspotStopSyncOrganization.ts | 9 - .../integration/helpers/hubspotSyncMember.ts | 9 - .../helpers/hubspotSyncOrganization.ts | 9 - .../helpers/hubspotUpdateProperties.ts | 9 - backend/src/api/integration/index.ts | 57 -- backend/src/api/tenant/tenantFind.ts | 24 - backend/src/conf/configTypes.ts | 6 - backend/src/database/models/automation.ts | 74 -- .../database/models/automationExecution.ts | 90 --- backend/src/database/models/index.ts | 2 - .../automationExecutionRepository.ts | 170 ----- .../repositories/automationRepository.ts | 320 --------- .../repositories/integrationRepository.ts | 18 - .../memberSyncRemoteRepository.ts | 250 ------- .../organizationSyncRemoteRepository.ts | 252 ------- .../repositories/types/automationTypes.ts | 35 - backend/src/security/permissions.ts | 44 -- backend/src/serverless/utils/queueService.ts | 15 - backend/src/services/activityService.ts | 36 - .../auth/passportStrategies/slackStrategy.ts | 27 +- .../services/automationExecutionService.ts | 78 --- backend/src/services/automationService.ts | 197 ------ backend/src/services/integrationService.ts | 525 -------------- backend/src/services/memberService.ts | 32 - backend/src/types/automationTypes.ts | 68 -- scripts/builders/automations-worker.env | 4 - scripts/cli | 8 +- scripts/services/automations-worker.yaml | 65 -- .../docker/Dockerfile.automations_worker | 23 - ...Dockerfile.automations_worker.dockerignore | 21 - scripts/services/integration-sync-worker.yaml | 65 -- services/apps/automations_worker/package.json | 36 - .../apps/automations_worker/src/activities.ts | 15 - .../src/activities/newActivityAutomations.ts | 36 - .../src/activities/newMemberAutomations.ts | 36 - services/apps/automations_worker/src/main.ts | 40 -- .../src/services/automation.service.ts | 502 -------------- .../src/services/slack/newActivityBlocks.ts | 220 ------ .../src/services/slack/newMemberBlocks.ts | 146 ---- .../apps/automations_worker/src/workflows.ts | 15 - .../src/workflows/newActivityAutomations.ts | 52 -- .../src/workflows/newMemberAutomations.ts | 54 -- .../apps/automations_worker/tsconfig.json | 4 - .../apps/data_sink_worker/config/default.json | 4 +- .../apps/data_sink_worker/src/conf/index.ts | 14 - .../src/service/activity.service.ts | 39 +- .../src/service/member.service.ts | 41 +- .../apps/integration_run_worker/src/main.ts | 9 - .../integration_run_worker/src/queue/index.ts | 7 - .../src/service/integrationRunService.ts | 175 +---- .../config/custom-environment-variables.json | 32 - .../config/default.json | 10 - .../config/docker.json | 1 - .../config/production.json | 1 - .../config/staging.json | 1 - .../apps/integration_sync_worker/package.json | 32 - .../integration_sync_worker/src/conf/index.ts | 54 -- .../integration_sync_worker/src/errors.ts | 5 - .../apps/integration_sync_worker/src/main.ts | 36 - .../src/queue/index.ts | 125 ---- .../src/service/member.sync.service.ts | 638 ------------------ .../src/service/opensearch.data.ts | 5 - .../src/service/opensearch.service.ts | 53 -- .../src/service/organization.sync.service.ts | 367 ---------- .../apps/integration_sync_worker/src/types.ts | 0 .../integration_sync_worker/tsconfig.json | 4 - services/libs/common/src/i18n/en.ts | 8 - .../src/services/emitters/index.ts | 1 - .../emitters/integrationSyncWorker.emitter.ts | 167 ----- .../automations_worker/automation.repo.ts | 134 ---- .../integration_run_worker/automation.repo.ts | 43 -- .../automation.repo.ts | 13 - .../automationExecution.repo.ts | 29 - .../hubspot/api/addContactsToList.ts | 36 - .../hubspot/api/batchCreateMembers.ts | 178 ----- .../hubspot/api/batchCreateOrganizations.ts | 167 ----- .../hubspot/api/batchUpdateMembers.ts | 119 ---- .../hubspot/api/batchUpdateOrganizations.ts | 104 --- .../src/integrations/hubspot/api/common.ts | 1 - .../src/integrations/hubspot/api/companies.ts | 100 --- .../integrations/hubspot/api/companyById.ts | 52 -- .../hubspot/api/contactAssociations.ts | 40 -- .../integrations/hubspot/api/contactById.ts | 52 -- .../src/integrations/hubspot/api/contacts.ts | 147 ---- .../src/integrations/hubspot/api/lists.ts | 44 -- .../integrations/hubspot/api/properties.ts | 33 - .../src/integrations/hubspot/api/tokenInfo.ts | 30 - .../src/integrations/hubspot/api/types.ts | 25 - .../api/utils/getOrganizationDomain.ts | 10 - .../field-mapper/hubspotFieldMapper.ts | 115 ---- .../hubspot/field-mapper/mapperFactory.ts | 25 - .../hubspot/field-mapper/memberFieldMapper.ts | 237 ------- .../field-mapper/organizationFieldMapper.ts | 301 --------- .../field-mapper/utils/serialization.ts | 19 - .../integrations/hubspot/generateStreams.ts | 67 -- .../src/integrations/hubspot/index.ts | 21 - .../integrations/hubspot/memberAttributes.ts | 23 - .../src/integrations/hubspot/processData.ts | 60 -- .../src/integrations/hubspot/processStream.ts | 115 ---- .../integrations/hubspot/processSyncRemote.ts | 148 ---- .../integrations/hubspot/startSyncRemote.ts | 58 -- .../src/integrations/hubspot/types.ts | 175 ----- .../integrations/src/integrations/index.ts | 7 - services/libs/integrations/src/types.ts | 34 - services/libs/queue/src/types.ts | 1 - .../libs/queue/src/vendors/kafka/config.ts | 11 - services/libs/types/src/automations.ts | 104 --- .../libs/types/src/enums/organizations.ts | 1 - services/libs/types/src/enums/platforms.ts | 4 - services/libs/types/src/enums/temporal.ts | 3 - services/libs/types/src/index.ts | 3 - .../queue/integration_sync_worker/index.ts | 36 - .../libs/types/src/temporal/automations.ts | 19 - services/libs/types/src/temporal/index.ts | 1 - 133 files changed, 16 insertions(+), 8838 deletions(-) delete mode 100644 backend/src/api/automation/automationCreate.ts delete mode 100644 backend/src/api/automation/automationDestroy.ts delete mode 100644 backend/src/api/automation/automationExecutionFind.ts delete mode 100644 backend/src/api/automation/automationFind.ts delete mode 100644 backend/src/api/automation/automationList.ts delete mode 100644 backend/src/api/automation/automationSlackCallback.ts delete mode 100644 backend/src/api/automation/automationSlackConnect.ts delete mode 100644 backend/src/api/automation/automationUpdate.ts delete mode 100644 backend/src/api/automation/index.ts delete mode 100644 backend/src/api/integration/helpers/hubspotConnect.ts delete mode 100644 backend/src/api/integration/helpers/hubspotGetLists.ts delete mode 100644 backend/src/api/integration/helpers/hubspotGetMappableFields.ts delete mode 100644 backend/src/api/integration/helpers/hubspotOnboard.ts delete mode 100644 backend/src/api/integration/helpers/hubspotStopSyncMember.ts delete mode 100644 backend/src/api/integration/helpers/hubspotStopSyncOrganization.ts delete mode 100644 backend/src/api/integration/helpers/hubspotSyncMember.ts delete mode 100644 backend/src/api/integration/helpers/hubspotSyncOrganization.ts delete mode 100644 backend/src/api/integration/helpers/hubspotUpdateProperties.ts delete mode 100644 backend/src/database/models/automation.ts delete mode 100644 backend/src/database/models/automationExecution.ts delete mode 100644 backend/src/database/repositories/automationExecutionRepository.ts delete mode 100644 backend/src/database/repositories/automationRepository.ts delete mode 100644 backend/src/database/repositories/memberSyncRemoteRepository.ts delete mode 100644 backend/src/database/repositories/organizationSyncRemoteRepository.ts delete mode 100644 backend/src/database/repositories/types/automationTypes.ts delete mode 100644 backend/src/services/automationExecutionService.ts delete mode 100644 backend/src/services/automationService.ts delete mode 100644 backend/src/types/automationTypes.ts delete mode 100644 scripts/builders/automations-worker.env delete mode 100644 scripts/services/automations-worker.yaml delete mode 100644 scripts/services/docker/Dockerfile.automations_worker delete mode 100644 scripts/services/docker/Dockerfile.automations_worker.dockerignore delete mode 100644 scripts/services/integration-sync-worker.yaml delete mode 100644 services/apps/automations_worker/package.json delete mode 100644 services/apps/automations_worker/src/activities.ts delete mode 100644 services/apps/automations_worker/src/activities/newActivityAutomations.ts delete mode 100644 services/apps/automations_worker/src/activities/newMemberAutomations.ts delete mode 100644 services/apps/automations_worker/src/main.ts delete mode 100644 services/apps/automations_worker/src/services/automation.service.ts delete mode 100644 services/apps/automations_worker/src/services/slack/newActivityBlocks.ts delete mode 100644 services/apps/automations_worker/src/services/slack/newMemberBlocks.ts delete mode 100644 services/apps/automations_worker/src/workflows.ts delete mode 100644 services/apps/automations_worker/src/workflows/newActivityAutomations.ts delete mode 100644 services/apps/automations_worker/src/workflows/newMemberAutomations.ts delete mode 100644 services/apps/automations_worker/tsconfig.json delete mode 100644 services/apps/integration_sync_worker/config/custom-environment-variables.json delete mode 100644 services/apps/integration_sync_worker/config/default.json delete mode 100644 services/apps/integration_sync_worker/config/docker.json delete mode 100644 services/apps/integration_sync_worker/config/production.json delete mode 100644 services/apps/integration_sync_worker/config/staging.json delete mode 100644 services/apps/integration_sync_worker/package.json delete mode 100644 services/apps/integration_sync_worker/src/conf/index.ts delete mode 100644 services/apps/integration_sync_worker/src/errors.ts delete mode 100644 services/apps/integration_sync_worker/src/main.ts delete mode 100644 services/apps/integration_sync_worker/src/queue/index.ts delete mode 100644 services/apps/integration_sync_worker/src/service/member.sync.service.ts delete mode 100644 services/apps/integration_sync_worker/src/service/opensearch.data.ts delete mode 100644 services/apps/integration_sync_worker/src/service/opensearch.service.ts delete mode 100644 services/apps/integration_sync_worker/src/service/organization.sync.service.ts delete mode 100644 services/apps/integration_sync_worker/src/types.ts delete mode 100644 services/apps/integration_sync_worker/tsconfig.json delete mode 100644 services/libs/common_services/src/services/emitters/integrationSyncWorker.emitter.ts delete mode 100644 services/libs/data-access-layer/src/old/apps/automations_worker/automation.repo.ts delete mode 100644 services/libs/data-access-layer/src/old/apps/integration_run_worker/automation.repo.ts delete mode 100644 services/libs/data-access-layer/src/old/apps/integration_sync_worker/automation.repo.ts delete mode 100644 services/libs/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/addContactsToList.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/batchCreateMembers.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/batchCreateOrganizations.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/batchUpdateMembers.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/batchUpdateOrganizations.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/common.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/companies.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/companyById.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/contactAssociations.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/contactById.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/contacts.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/lists.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/properties.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/tokenInfo.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/types.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/api/utils/getOrganizationDomain.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/field-mapper/hubspotFieldMapper.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/field-mapper/mapperFactory.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/field-mapper/memberFieldMapper.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/field-mapper/organizationFieldMapper.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/field-mapper/utils/serialization.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/generateStreams.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/index.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/memberAttributes.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/processData.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/processStream.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/processSyncRemote.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/startSyncRemote.ts delete mode 100644 services/libs/integrations/src/integrations/hubspot/types.ts delete mode 100644 services/libs/types/src/automations.ts delete mode 100644 services/libs/types/src/queue/integration_sync_worker/index.ts delete mode 100644 services/libs/types/src/temporal/automations.ts diff --git a/backend/.env.dist.local b/backend/.env.dist.local index 2cc3409ab6..ae142cc109 100755 --- a/backend/.env.dist.local +++ b/backend/.env.dist.local @@ -122,7 +122,7 @@ CROWD_STACKEXCHANGE_KEY= # Nango settings CROWD_NANGO_URL=http://localhost:3003 CROWD_NANGO_SECRET_KEY=424242 -CROWD_NANGO_INTEGRATIONS=reddit,linkedin,stackexchange,hubspot +CROWD_NANGO_INTEGRATIONS=reddit,linkedin,stackexchange # Cohere settings CROWD_COHERE_API_KEY= diff --git a/backend/config/custom-environment-variables.json b/backend/config/custom-environment-variables.json index 5a62cf1c8b..ae60c2e043 100644 --- a/backend/config/custom-environment-variables.json +++ b/backend/config/custom-environment-variables.json @@ -139,11 +139,6 @@ "stackexchange": { "key": "CROWD_STACKEXCHANGE_KEY" }, - "hubspot": { - "appId": "CROWD_HUBSPOT_APP_ID", - "clientId": "CROWD_HUBSPOT_CLIENT_ID", - "clientSecret": "CROWD_HUBSPOT_CLIENT_SECRET" - }, "reddit": { "clientId": "CROWD_REDDIT_CLIENT_ID", "clientSecret": "CROWD_REDDIT_CLIENT_SECRET" diff --git a/backend/id-openapi.yaml b/backend/id-openapi.yaml index ff7c816df8..6b8c7ae5be 100644 --- a/backend/id-openapi.yaml +++ b/backend/id-openapi.yaml @@ -103,7 +103,7 @@ paths: description: Organization ID source: type: string - enum: ['ui', 'email-domain', 'enrichment', 'hubspot', 'github'] + enum: ['ui', 'email-domain', 'enrichment', 'github'] example: 'ui' description: Data source. For manual updates, always use 'ui' title: @@ -188,7 +188,7 @@ paths: description: Organization ID source: type: string - enum: ['ui', 'email-domain', 'enrichment', 'hubspot', 'github'] + enum: ['ui', 'email-domain', 'enrichment', 'github'] example: 'ui' description: Data source. For manual updates, always use 'ui' title: diff --git a/backend/src/api/auth/authMe.ts b/backend/src/api/auth/authMe.ts index 6ca15d9b41..406cd5c7f5 100644 --- a/backend/src/api/auth/authMe.ts +++ b/backend/src/api/auth/authMe.ts @@ -1,8 +1,4 @@ import { Error403 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey } from '@crowd/types' - -import AutomationRepository from '@/database/repositories/automationRepository' export default async (req, res) => { if (!req.currentUser || !req.currentUser.id) { @@ -12,31 +8,8 @@ export default async (req, res) => { const payload = req.currentUser - const csvExportCountCache = new RedisCache( - FeatureFlagRedisKey.CSV_EXPORT_COUNT, - req.redis, - req.log, - ) - - const memberEnrichmentCountCache = new RedisCache( - FeatureFlagRedisKey.MEMBER_ENRICHMENT_COUNT, - req.redis, - req.log, - ) - payload.tenants = await Promise.all( - payload.tenants.map(async (tenantUser) => { - tenantUser.tenant.dataValues = { - ...tenantUser.tenant.dataValues, - csvExportCount: Number(await csvExportCountCache.get(tenantUser.tenant.id)) || 0, - automationCount: - Number(await AutomationRepository.countAllActive(req.database, tenantUser.tenant.id)) || - 0, - memberEnrichmentCount: - Number(await memberEnrichmentCountCache.get(tenantUser.tenant.id)) || 0, - } - return tenantUser - }), + payload.tenants.map(async (tenantUser) => tenantUser), ) await req.responseHandler.success(req, res, payload) diff --git a/backend/src/api/automation/automationCreate.ts b/backend/src/api/automation/automationCreate.ts deleted file mode 100644 index b980b1bd73..0000000000 --- a/backend/src/api/automation/automationCreate.ts +++ /dev/null @@ -1,31 +0,0 @@ -import Permissions from '../../security/permissions' -import identifyTenant from '../../segment/identifyTenant' -import track from '../../segment/track' -import AutomationService from '../../services/automationService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * POST /tenant/{tenantId}/automation - * @summary Create an automation - * @tag Automations - * @security Bearer - * @description Create a new automation for the tenant. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @bodyContent {AutomationCreateInput} application/json - * @response 200 - Ok - * @responseContent {Automation} 200.application/json - * @responseExample {Automation} 200.application/json.Automation - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationCreate) - - const payload = await new AutomationService(req).create(req.body.data) - - track('Automation Created', { ...req.body.data }, { ...req }) - - identifyTenant(req) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/automation/automationDestroy.ts b/backend/src/api/automation/automationDestroy.ts deleted file mode 100644 index 5387f01420..0000000000 --- a/backend/src/api/automation/automationDestroy.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Permissions from '../../security/permissions' -import identifyTenant from '../../segment/identifyTenant' -import track from '../../segment/track' -import AutomationService from '../../services/automationService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * DELETE /tenant/{tenantId}/automation/{automationId} - * @summary Destroy an automation - * @tag Automations - * @security Bearer - * @description Destroys an existing automation in the tenant. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} automationId - Automation ID that you want to update - * @response 204 - Ok - No content - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationDestroy) - await new AutomationService(req).destroy(req.params.automationId) - - track('Automation Destroyed', { id: req.params.automationId }, { ...req }) - identifyTenant(req) - - await req.responseHandler.success(req, res, true, 204) -} diff --git a/backend/src/api/automation/automationExecutionFind.ts b/backend/src/api/automation/automationExecutionFind.ts deleted file mode 100644 index 89f06cabbd..0000000000 --- a/backend/src/api/automation/automationExecutionFind.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Permissions from '../../security/permissions' -import AutomationExecutionService from '../../services/automationExecutionService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * GET /tenant/{tenantId}/automation/{automationId}/executions - * @summary Get automation history - * @tag Automations - * @security Bearer - * @description Get all automation execution history for tenant and automation - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} automationId - Your workspace/tenant ID - * @queryParam {integer} [offset=0] - How many elements from the beginning would you like to skip - * @queryParam {integer} [limit=10] - How many elements would you like to fetch - * @response 200 - Ok - * @responseContent {AutomationExecutionPage} 200.application/json - * @responseExample {AutomationExecutionPage} 200.application/json.AutomationExecutionPage - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationRead) - - let offset = 0 - if (req.query.offset) { - offset = parseInt(req.query.offset, 10) - } - let limit = 10 - if (req.query.limit) { - limit = parseInt(req.query.limit, 10) - } - - const payload = await new AutomationExecutionService(req).findAndCountAll({ - automationId: req.params.automationId, - offset, - limit, - }) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/automation/automationFind.ts b/backend/src/api/automation/automationFind.ts deleted file mode 100644 index 8784f624ca..0000000000 --- a/backend/src/api/automation/automationFind.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Permissions from '../../security/permissions' -import AutomationService from '../../services/automationService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * GET /tenant/{tenantId}/automation/{automationId} - * @summary Find an automation - * @tag Automations - * @security Bearer - * @description Get an existing automation data in the tenant. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} automationId - Automation ID that you want to find - * @response 200 - Ok - * @responseContent {Automation} 200.application/json - * @responseExample {Automation} 200.application/json.Automation - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationRead) - const payload = await new AutomationService(req).findById(req.params.automationId) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/automation/automationList.ts b/backend/src/api/automation/automationList.ts deleted file mode 100644 index 3fc770ee10..0000000000 --- a/backend/src/api/automation/automationList.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AutomationState, AutomationTrigger, AutomationType } from '@crowd/types' - -import Permissions from '../../security/permissions' -import AutomationService from '../../services/automationService' -import PermissionChecker from '../../services/user/permissionChecker' -import { AutomationCriteria } from '../../types/automationTypes' - -/** - * GET /tenant/{tenantId}/automation - * @summary List automations - * @tag Automations - * @security Bearer - * @description Get all existing automation data for tenant. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @queryParam {string} [filter[type]] - Filter by type of automation - * @queryParam {string} [filter[trigger]] - Filter by trigger type of automation - * @queryParam {string} [filter[state]] - Filter by state of automation - * @queryParam {number} [offset] - Skip the first n results. Default 0. - * @queryParam {number} [limit] - Limit the number of results. Default 50. - * @response 200 - Ok - * @responseContent {AutomationPage} 200.application/json - * @responseExample {AutomationPage} 200.application/json.AutomationPage - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationRead) - - let offset = 0 - if (req.query.offset) { - offset = parseInt(req.query.offset, 10) - } - let limit = 50 - if (req.query.limit) { - limit = parseInt(req.query.limit, 10) - } - - const criteria: AutomationCriteria = { - type: req.query.filter?.type ? (req.query.filter.type as AutomationType) : undefined, - trigger: req.query.filter?.trigger - ? (req.query.filter?.trigger as AutomationTrigger) - : undefined, - state: req.query.filter?.state ? (req.query.filter.state as AutomationState) : undefined, - limit, - offset, - } - - const payload = await new AutomationService(req).findAndCountAll(criteria) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/automation/automationSlackCallback.ts b/backend/src/api/automation/automationSlackCallback.ts deleted file mode 100644 index 609035c9af..0000000000 --- a/backend/src/api/automation/automationSlackCallback.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Axios from 'axios' - -import Permissions from '../../security/permissions' -import SettingsService from '../../services/settingsService' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationCreate) - const { redirectUrl } = JSON.parse(Buffer.from(req.query.state, 'base64').toString()) - - const { url } = req.account - - await SettingsService.save({ slackWebHook: url }, req) - await Axios.post(url, { - text: 'crowd.dev notifier has been successfully connected.', - }) - - res.redirect(redirectUrl) -} diff --git a/backend/src/api/automation/automationSlackConnect.ts b/backend/src/api/automation/automationSlackConnect.ts deleted file mode 100644 index 3be7282be4..0000000000 --- a/backend/src/api/automation/automationSlackConnect.ts +++ /dev/null @@ -1,21 +0,0 @@ -import passport from 'passport' - -import Permissions from '../../security/permissions' -import { getSlackNotifierStrategy } from '../../services/auth/passportStrategies/slackStrategy' -import PermissionChecker from '../../services/user/permissionChecker' - -export default async (req, res, next) => { - new PermissionChecker(req).validateHas(Permissions.values.automationCreate) - const state = { - tenantId: req.params.tenantId, - redirectUrl: req.query.redirectUrl, - crowdToken: req.query.crowdToken, - } - - const authenticator = passport.authenticate(getSlackNotifierStrategy(), { - scope: ['incoming-webhook'], - state: Buffer.from(JSON.stringify(state)).toString('base64'), - }) - - authenticator(req, res, next) -} diff --git a/backend/src/api/automation/automationUpdate.ts b/backend/src/api/automation/automationUpdate.ts deleted file mode 100644 index c0fbed6948..0000000000 --- a/backend/src/api/automation/automationUpdate.ts +++ /dev/null @@ -1,32 +0,0 @@ -import Permissions from '../../security/permissions' -import track from '../../segment/track' -import AutomationService from '../../services/automationService' -import PermissionChecker from '../../services/user/permissionChecker' - -/** - * PUT /tenant/{tenantId}/automation/{automationId} - * @summary Update an automation - * @tag Automations - * @security Bearer - * @description Updates an existing automation in the tenant. - * @pathParam {string} tenantId - Your workspace/tenant ID - * @pathParam {string} automationId - Automation ID that you want to update - * @bodyContent {AutomationUpdateInput} application/json - * @response 200 - Ok - * @responseContent {Automation} 200.application/json - * @responseExample {Automation} 200.application/json.Automation - * @response 401 - Unauthorized - * @response 429 - Too many requests - */ -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.automationUpdate) - const payload = await new AutomationService(req).update(req.params.automationId, req.body.data) - - track( - 'Automation Updated', - { automationId: req.params.automationId, data: req.body.data }, - { ...req }, - ) - - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/automation/index.ts b/backend/src/api/automation/index.ts deleted file mode 100644 index 63fa7eacd2..0000000000 --- a/backend/src/api/automation/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -import passport from 'passport' - -import { API_CONFIG } from '../../conf' -import { authMiddleware } from '../../middlewares/authMiddleware' -import { safeWrap } from '../../middlewares/errorMiddleware' -import { getSlackNotifierStrategy } from '../../services/auth/passportStrategies/slackStrategy' -import TenantService from '../../services/tenantService' - -export default (app) => { - app.get( - '/tenant/:tenantId/automation/slack', - safeWrap(require('./automationSlackConnect').default), - ) - app.get( - '/tenant/automation/slack/callback', - passport.authorize(getSlackNotifierStrategy(), { - session: false, - failureRedirect: `${API_CONFIG.frontendUrl}/settings?activeTab=automations&error=true`, - }), - (req, _res, next) => { - const { crowdToken } = JSON.parse(Buffer.from(req.query.state, 'base64').toString()) - req.headers.authorization = `Bearer ${crowdToken}` - next() - }, - authMiddleware, - async (req, _res, next) => { - const { tenantId } = JSON.parse(Buffer.from(req.query.state, 'base64').toString()) - req.currentTenant = await new TenantService(req).findById(tenantId) - next() - }, - safeWrap(require('./automationSlackCallback').default), - ) - app.post('/tenant/:tenantId/automation', safeWrap(require('./automationCreate').default)) - app.put( - '/tenant/:tenantId/automation/:automationId', - safeWrap(require('./automationUpdate').default), - ) - app.delete( - '/tenant/:tenantId/automation/:automationId', - safeWrap(require('./automationDestroy').default), - ) - app.get( - '/tenant/:tenantId/automation/:automationId/executions', - safeWrap(require('./automationExecutionFind').default), - ) - app.get( - '/tenant/:tenantId/automation/:automationId', - safeWrap(require('./automationFind').default), - ) - app.get('/tenant/:tenantId/automation', safeWrap(require('./automationList').default)) -} diff --git a/backend/src/api/index.ts b/backend/src/api/index.ts index 1fe19fe6a3..962bb98ede 100644 --- a/backend/src/api/index.ts +++ b/backend/src/api/index.ts @@ -234,7 +234,6 @@ setImmediate(async () => { require('./microservice').default(routes) require('./conversation').default(routes) require('./eagleEyeContent').default(routes) - require('./automation').default(routes) require('./task').default(routes) require('./note').default(routes) require('./organization').default(routes) diff --git a/backend/src/api/integration/helpers/hubspotConnect.ts b/backend/src/api/integration/helpers/hubspotConnect.ts deleted file mode 100644 index 4b6332d3ae..0000000000 --- a/backend/src/api/integration/helpers/hubspotConnect.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotConnect() - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotGetLists.ts b/backend/src/api/integration/helpers/hubspotGetLists.ts deleted file mode 100644 index 9723f44ef4..0000000000 --- a/backend/src/api/integration/helpers/hubspotGetLists.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotGetLists() - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotGetMappableFields.ts b/backend/src/api/integration/helpers/hubspotGetMappableFields.ts deleted file mode 100644 index 524f1846b1..0000000000 --- a/backend/src/api/integration/helpers/hubspotGetMappableFields.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.tenantEdit) - const payload = await new IntegrationService(req).hubspotGetMappableFields() - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotOnboard.ts b/backend/src/api/integration/helpers/hubspotOnboard.ts deleted file mode 100644 index 68b447238a..0000000000 --- a/backend/src/api/integration/helpers/hubspotOnboard.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.tenantEdit) - const payload = await new IntegrationService(req).hubspotOnboard(req.body) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotStopSyncMember.ts b/backend/src/api/integration/helpers/hubspotStopSyncMember.ts deleted file mode 100644 index 8843e17d55..0000000000 --- a/backend/src/api/integration/helpers/hubspotStopSyncMember.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotStopSyncMember(req.body) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotStopSyncOrganization.ts b/backend/src/api/integration/helpers/hubspotStopSyncOrganization.ts deleted file mode 100644 index ef84437137..0000000000 --- a/backend/src/api/integration/helpers/hubspotStopSyncOrganization.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotStopSyncOrganization(req.body) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotSyncMember.ts b/backend/src/api/integration/helpers/hubspotSyncMember.ts deleted file mode 100644 index ce9d23fe4b..0000000000 --- a/backend/src/api/integration/helpers/hubspotSyncMember.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotSyncMember(req.body) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotSyncOrganization.ts b/backend/src/api/integration/helpers/hubspotSyncOrganization.ts deleted file mode 100644 index f540146516..0000000000 --- a/backend/src/api/integration/helpers/hubspotSyncOrganization.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.integrationEdit) - const payload = await new IntegrationService(req).hubspotSyncOrganization(req.body) - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/helpers/hubspotUpdateProperties.ts b/backend/src/api/integration/helpers/hubspotUpdateProperties.ts deleted file mode 100644 index cbd4e92d6a..0000000000 --- a/backend/src/api/integration/helpers/hubspotUpdateProperties.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Permissions from '../../../security/permissions' -import IntegrationService from '../../../services/integrationService' -import PermissionChecker from '../../../services/user/permissionChecker' - -export default async (req, res) => { - new PermissionChecker(req).validateHas(Permissions.values.tenantEdit) - const payload = await new IntegrationService(req).hubspotUpdateProperties() - await req.responseHandler.success(req, res, payload) -} diff --git a/backend/src/api/integration/index.ts b/backend/src/api/integration/index.ts index 23ae1cdffe..1a00029afc 100644 --- a/backend/src/api/integration/index.ts +++ b/backend/src/api/integration/index.ts @@ -1,9 +1,6 @@ import passport from 'passport' import { RedisCache } from '@crowd/redis' -import { FeatureFlag } from '@crowd/types' - -import { featureFlagMiddleware } from '@/middlewares/featureFlagMiddleware' import { API_CONFIG, SLACK_CONFIG, TWITTER_CONFIG } from '../../conf' import SegmentRepository from '../../database/repositories/segmentRepository' @@ -131,60 +128,6 @@ export default (app) => { safeWrap(require('./helpers/discourseTestWebhook').default), ) - app.post( - '/tenant/:tenantId/hubspot-connect', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotConnect').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-onboard', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotOnboard').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-update-properties', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotUpdateProperties').default), - ) - - app.get( - '/tenant/:tenantId/hubspot-mappable-fields', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotGetMappableFields').default), - ) - - app.get( - '/tenant/:tenantId/hubspot-get-lists', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotGetLists').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-sync-member', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotSyncMember').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-stop-sync-member', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotStopSyncMember').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-sync-organization', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotSyncOrganization').default), - ) - - app.post( - '/tenant/:tenantId/hubspot-stop-sync-organization', - featureFlagMiddleware(FeatureFlag.HUBSPOT, 'hubspot.errors.notInPlan'), - safeWrap(require('./helpers/hubspotStopSyncOrganization').default), - ) - app.post( '/tenant/:tenantId/groupsio-connect', safeWrap(require('./helpers/groupsioConnectOrUpdate').default), diff --git a/backend/src/api/tenant/tenantFind.ts b/backend/src/api/tenant/tenantFind.ts index 90e4ffd2fd..2b12000341 100644 --- a/backend/src/api/tenant/tenantFind.ts +++ b/backend/src/api/tenant/tenantFind.ts @@ -1,8 +1,4 @@ import { Error404 } from '@crowd/common' -import { RedisCache } from '@crowd/redis' -import { FeatureFlagRedisKey } from '@crowd/types' - -import AutomationRepository from '@/database/repositories/automationRepository' import Permissions from '../../security/permissions' import identifyTenant from '../../segment/identifyTenant' @@ -19,26 +15,6 @@ export default async (req, res) => { payload = await new TenantService(req).findByUrl(req.query.url) } - const csvExportCountCache = new RedisCache( - FeatureFlagRedisKey.CSV_EXPORT_COUNT, - req.redis, - req.log, - ) - - const memberEnrichmentCountCache = new RedisCache( - FeatureFlagRedisKey.MEMBER_ENRICHMENT_COUNT, - req.redis, - req.log, - ) - - payload.dataValues = { - ...payload.dataValues, - csvExportCount: Number(await csvExportCountCache.get(payload.id)) || 0, - automationCount: - Number(await AutomationRepository.countAllActive(req.database, payload.id)) || 0, - memberEnrichmentCount: Number(await memberEnrichmentCountCache.get(payload.id)) || 0, - } - payload.dataValues.settings[0].dataValues = { ...payload.dataValues.settings[0].dataValues, slackWebHook: !!payload.settings[0].dataValues.slackWebHook, diff --git a/backend/src/conf/configTypes.ts b/backend/src/conf/configTypes.ts index 46e6596ce3..77220fa835 100644 --- a/backend/src/conf/configTypes.ts +++ b/backend/src/conf/configTypes.ts @@ -1,5 +1,3 @@ -import { ITemporalConfig } from '@crowd/temporal' - export enum ServiceType { API = 'api', JOB_GENERATOR = 'job-generator', @@ -232,10 +230,6 @@ export interface CrowdAnalyticsConfiguration { apiToken: string } -export interface IBackendTemporalConfig extends ITemporalConfig { - automationsTaskQueue: string -} - export interface EncryptionConfiguration { secretKey: string initVector: string diff --git a/backend/src/database/models/automation.ts b/backend/src/database/models/automation.ts deleted file mode 100644 index a2726ba29e..0000000000 --- a/backend/src/database/models/automation.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { DataTypes } from 'sequelize' - -export default (sequelize) => { - const automation = sequelize.define( - 'automation', - { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, - allowNull: false, - }, - type: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - name: { - type: DataTypes.STRING(255), - }, - tenantId: { - type: DataTypes.UUID, - allowNull: false, - }, - trigger: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - settings: { - type: DataTypes.JSONB, - allowNull: false, - }, - state: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - }, - { - indexes: [ - { - fields: ['type', 'tenantId', 'trigger', 'state'], - }, - ], - timestamps: true, - }, - ) - - automation.associate = (models) => { - models.automation.belongsTo(models.tenant, { - as: 'tenant', - foreignKey: { - allowNull: false, - }, - }) - - models.automation.belongsTo(models.user, { - as: 'createdBy', - }) - - models.automation.belongsTo(models.user, { - as: 'updatedBy', - }) - } - - return automation -} diff --git a/backend/src/database/models/automationExecution.ts b/backend/src/database/models/automationExecution.ts deleted file mode 100644 index 72b59291ce..0000000000 --- a/backend/src/database/models/automationExecution.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { DataTypes } from 'sequelize' - -export default (sequelize) => { - const automationExecution = sequelize.define( - 'automationExecution', - { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, - allowNull: false, - }, - automationId: { - type: DataTypes.UUID, - allowNull: false, - }, - type: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - tenantId: { - type: DataTypes.UUID, - allowNull: false, - }, - trigger: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - state: { - type: DataTypes.STRING(80), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - error: { - type: DataTypes.JSON, - allowNull: true, - }, - executedAt: { - type: DataTypes.DATE, - allowNull: false, - }, - eventId: { - type: DataTypes.STRING(255), - allowNull: false, - validate: { - notEmpty: true, - }, - }, - payload: { - type: DataTypes.JSON, - allowNull: false, - }, - }, - { - indexes: [ - { - fields: ['automationId'], - }, - ], - timestamps: false, - paranoid: false, - }, - ) - - automationExecution.associate = (models) => { - models.automationExecution.belongsTo(models.tenant, { - as: 'tenant', - foreignKey: { - allowNull: false, - }, - }) - - models.automationExecution.belongsTo(models.automation, { - as: 'automation', - foreignKey: { - allowNull: false, - }, - }) - } - - return automationExecution -} diff --git a/backend/src/database/models/index.ts b/backend/src/database/models/index.ts index 9f67e637bb..bb3ab91e9c 100644 --- a/backend/src/database/models/index.ts +++ b/backend/src/database/models/index.ts @@ -131,8 +131,6 @@ async function models(queryTimeoutMilliseconds: number, databaseHostnameOverride require('./conversationSettings').default, require('./eagleEyeContent').default, require('./eagleEyeAction').default, - require('./automation').default, - require('./automationExecution').default, require('./organization').default, require('./memberAttributeSettings').default, require('./task').default, diff --git a/backend/src/database/repositories/automationExecutionRepository.ts b/backend/src/database/repositories/automationExecutionRepository.ts deleted file mode 100644 index 9d38fe03ff..0000000000 --- a/backend/src/database/repositories/automationExecutionRepository.ts +++ /dev/null @@ -1,170 +0,0 @@ -/* eslint-disable class-methods-use-this */ - -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { QueryTypes } from 'sequelize' - -import { AutomationExecutionState, PageData } from '@crowd/types' - -import { AutomationExecution, AutomationExecutionCriteria } from '../../types/automationTypes' - -import { IRepositoryOptions } from './IRepositoryOptions' -import { RepositoryBase } from './repositoryBase' -import { DbAutomationExecutionInsertData } from './types/automationTypes' - -export default class AutomationExecutionRepository extends RepositoryBase< - AutomationExecution, - string, - DbAutomationExecutionInsertData, - unknown, - AutomationExecutionCriteria -> { - public constructor(options: IRepositoryOptions) { - super(options, false) - } - - override async create(data: DbAutomationExecutionInsertData): Promise { - const transaction = this.transaction - - return this.database.automationExecution.create( - { - automationId: data.automationId, - type: data.type, - tenantId: data.tenantId, - trigger: data.trigger, - state: data.state, - error: data.error, - executedAt: data.executedAt, - eventId: data.eventId, - payload: data.payload, - }, - { transaction }, - ) - } - - override async findAndCountAll( - criteria: AutomationExecutionCriteria, - ): Promise> { - // get current tenant that was used to make a request - const currentTenant = this.currentTenant - - // get plain sequelize object to use with a raw query - const seq = this.seq - - // construct a query with pagination - const query = ` - select id, - "automationId", - state, - error, - "executedAt", - "eventId", - payload, - count(*) over () as "paginatedItemsCount" - from "automationExecutions" - where "tenantId" = :tenantId - and "automationId" = :automationId - order by "executedAt" desc - limit ${criteria.limit} offset ${criteria.offset} - - ` - - const results = await seq.query(query, { - replacements: { - tenantId: currentTenant.id, - automationId: criteria.automationId, - }, - type: QueryTypes.SELECT, - }) - - if (results.length === 0) { - return { - rows: [], - count: 0, - offset: criteria.offset, - limit: criteria.limit, - } - } - - const count = parseInt((results[0] as any).paginatedItemsCount, 10) - const rows: AutomationExecution[] = results.map((r) => { - const row = r as any - return { - id: row.id, - automationId: row.automationId, - executedAt: row.executedAt, - eventId: row.eventId, - payload: row.payload, - error: row.error, - state: row.state, - } - }) - - return { - rows, - count, - offset: criteria.offset, - limit: criteria.limit, - } - } - - public async hasAlreadyBeenTriggered(automationId: string, eventId: string): Promise { - const seq = this.seq - - const query = ` - select id - from "automationExecutions" - where "automationId" = :automationId - and "eventId" = :eventId - and state = '${AutomationExecutionState.SUCCESS}'; - ` - - const results = await seq.query(query, { - replacements: { - automationId, - eventId, - }, - type: QueryTypes.SELECT, - }) - - return results.length > 0 - } - - override async update(id: string, data: unknown): Promise { - throw new Error('Method not implemented.') - } - - override async destroy(id: string): Promise { - throw new Error('Method not implemented.') - } - - async destroyAllAutomation(automationIds: string[]): Promise { - const transaction = this.transaction - - const seq = this.seq - - const currentTenant = this.currentTenant - - const query = ` - delete - from "automationExecutions" - where "automationId" in (:automationIds) - and "tenantId" = :tenantId;` - - await seq.query(query, { - replacements: { - automationIds, - tenantId: currentTenant.id, - }, - type: QueryTypes.DELETE, - transaction, - }) - } - - override async destroyAll(ids: string[]): Promise { - throw new Error('Method not implemented.') - } - - override async findById(id: string): Promise { - throw new Error('Method not implemented.') - } -} diff --git a/backend/src/database/repositories/automationRepository.ts b/backend/src/database/repositories/automationRepository.ts deleted file mode 100644 index 6e896d72c7..0000000000 --- a/backend/src/database/repositories/automationRepository.ts +++ /dev/null @@ -1,320 +0,0 @@ -import Sequelize, { QueryTypes } from 'sequelize' - -import { Error404 } from '@crowd/common' -import { - AutomationState, - AutomationSyncTrigger, - FeatureFlag, - IAutomationData, - PLAN_LIMITS, - PageData, -} from '@crowd/types' - -import { AutomationCriteria } from '../../types/automationTypes' - -import { IRepositoryOptions } from './IRepositoryOptions' -import AuditLogRepository from './auditLogRepository' -import { RepositoryBase } from './repositoryBase' -import { DbAutomationInsertData, DbAutomationUpdateData } from './types/automationTypes' - -const { Op } = Sequelize - -export default class AutomationRepository extends RepositoryBase< - IAutomationData, - string, - DbAutomationInsertData, - DbAutomationUpdateData, - AutomationCriteria -> { - public constructor(options: IRepositoryOptions) { - super(options, true) - } - - override async create(data: DbAutomationInsertData): Promise { - const currentUser = this.currentUser - - const tenant = this.currentTenant - - const transaction = this.transaction - - const existingActiveAutomations = await this.findAndCountAll({ - state: AutomationState.ACTIVE, - }) - - const record = await this.database.automation.create( - { - name: data.name, - type: data.type, - trigger: data.trigger, - settings: data.settings, - state: - existingActiveAutomations.count >= PLAN_LIMITS[tenant.plan][FeatureFlag.AUTOMATIONS] - ? AutomationState.DISABLED - : data.state, - tenantId: tenant.id, - createdById: currentUser.id, - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - await this.createAuditLog('automation', AuditLogRepository.CREATE, record, data) - - return this.findById(record.id) - } - - override async update(id, data: DbAutomationUpdateData): Promise { - const currentUser = this.currentUser - - const currentTenant = this.currentTenant - - const transaction = this.transaction - - const existingActiveAutomations = await this.findAndCountAll({ - state: AutomationState.ACTIVE, - }) - - if ( - data.state === AutomationState.ACTIVE && - existingActiveAutomations.count >= PLAN_LIMITS[currentTenant.plan][FeatureFlag.AUTOMATIONS] - ) { - throw new Error(`Maximum number of active automations reached for the plan!`) - } - - let record = await this.database.automation.findOne({ - where: { - id, - tenantId: currentTenant.id, - }, - transaction, - }) - - if (!record) { - throw new Error404() - } - - record = await record.update( - { - name: data.name, - trigger: data.trigger, - settings: data.settings, - state: data.state, - updatedById: currentUser.id, - }, - { - transaction, - }, - ) - - await this.createAuditLog('automation', AuditLogRepository.UPDATE, record, data) - - return this.findById(record.id) - } - - override async destroyAll(ids: string[]): Promise { - const transaction = this.transaction - - const currentTenant = this.currentTenant - - const records = await this.database.automation.findAll({ - where: { - id: { - [Op.in]: ids, - }, - tenantId: currentTenant.id, - }, - transaction, - }) - - if (ids.some((id) => records.find((r) => r.id === id) === undefined)) { - throw new Error404() - } - - await Promise.all( - records.flatMap((r) => [ - r.destroy({ transaction }), - this.createAuditLog('automation', AuditLogRepository.DELETE, r, r), - ]), - ) - } - - override async findById(id: string): Promise { - const results = await this.findAndCountAll({ - id, - offset: 0, - limit: 1, - }) - - if (results.count === 1) { - return results.rows[0] - } - - if (results.count === 0) { - throw new Error404() - } - - throw new Error('More than one row returned when fetching by automation unique ID!') - } - - override async findAndCountAll(criteria: AutomationCriteria): Promise> { - // get current tenant that was used to make a request - const currentTenant = this.currentTenant - - // we need transaction if there is one set because some records were perhaps created/updated in the same transaction - const transaction = this.transaction - - // get plain sequelize object to use with a raw query - const seq = this.seq - - // build a where condition based on tenant and other criteria passed as parameter - const conditions = ['a."tenantId" = :tenantId'] - const parameters: any = { - tenantId: currentTenant.id, - } - - if (criteria.id) { - conditions.push('a.id = :id') - parameters.id = criteria.id - } - - if (criteria.state) { - conditions.push('a.state = :state') - parameters.state = criteria.state - } - - if (criteria.type) { - conditions.push('a.type = :type') - parameters.type = criteria.type - } - - if (criteria.trigger) { - conditions.push('a.trigger = :trigger') - parameters.trigger = criteria.trigger - } - - const conditionsString = conditions.join(' and ') - - const query = ` - -- common table expression (CTE) to prepare the last execution information for each automationId - with latest_executions as (select distinct on ("automationId") "automationId", "executedAt", state, error - from "automationExecutions" - order by "automationId", "executedAt" desc) - select a.id, - a.name, - a.type, - a."tenantId", - a.trigger, - a.settings, - a.state, - a."createdAt", - a."updatedAt", - le."executedAt" as "lastExecutionAt", - le.state as "lastExecutionState", - le.error as "lastExecutionError", - count(*) over () as "paginatedItemsCount" - from automations a - left join latest_executions le on a.id = le."automationId" - where ${conditionsString} - order by "updatedAt" desc - ${this.getPaginationString(criteria)} - ` - // fetch all automations for a tenant - // and include the latest execution data if available - const results = await seq.query(query, { - replacements: parameters, - type: QueryTypes.SELECT, - transaction, - }) - - if (results.length === 0) { - return { - rows: [], - count: 0, - offset: criteria.offset, - limit: criteria.limit, - } - } - - const count = parseInt((results[0] as any).paginatedItemsCount, 10) - const rows: IAutomationData[] = results.map((r) => { - const row = r as any - return { - id: row.id, - name: row.name, - type: row.type, - tenantId: row.tenantId, - trigger: row.trigger, - settings: row.settings, - state: row.state, - createdAt: row.createdAt, - updatedAt: row.updatedAt, - lastExecutionAt: row.lastExecutionAt, - lastExecutionState: row.lastExecutionState, - lastExecutionError: row.lastExecutionError, - } - }) - - return { - rows, - count, - offset: criteria.offset, - limit: criteria.limit, - } - } - - static async countAllActive(database: any, tenantId: string): Promise { - const automationCount = await database.automation.count({ - where: { - tenantId, - state: AutomationState.ACTIVE, - }, - useMaster: true, - }) - - return automationCount - } - - public async findSyncAutomations( - tenantId: string, - platform: string, - ): Promise { - const seq = this.seq - - const transaction = this.transaction - - const pageSize = 10 - const syncAutomations: IAutomationData[] = [] - - let results - let offset - - do { - offset = results ? pageSize + offset : 0 - - results = await seq.query( - `select * from automations - where type = :platform and "tenantId" = :tenantId and trigger in (:syncAutomationTriggers) - limit :limit offset :offset`, - { - replacements: { - tenantId, - platform, - syncAutomationTriggers: [ - AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH, - AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH, - ], - limit: pageSize, - offset, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - syncAutomations.push(...results) - } while (results.length > 0) - - return syncAutomations - } -} diff --git a/backend/src/database/repositories/integrationRepository.ts b/backend/src/database/repositories/integrationRepository.ts index 4617d53e16..badf8d0852 100644 --- a/backend/src/database/repositories/integrationRepository.ts +++ b/backend/src/database/repositories/integrationRepository.ts @@ -16,8 +16,6 @@ import SequelizeFilterUtils from '../utils/sequelizeFilterUtils' import { IRepositoryOptions } from './IRepositoryOptions' import AuditLogRepository from './auditLogRepository' -import AutomationExecutionRepository from './automationExecutionRepository' -import AutomationRepository from './automationRepository' import QueryParser from './filters/queryParser' import { QueryOutput } from './filters/queryTypes' import MemberSyncRemoteRepository from './memberSyncRemoteRepository' @@ -180,22 +178,6 @@ class IntegrationRepository { record.id, ]) - // destroy existing automations for outgoing integrations - const syncAutomationIds = ( - await new AutomationRepository({ ...options, transaction }).findSyncAutomations( - currentTenant.id, - record.platform, - ) - ).map((a) => a.id) - - if (syncAutomationIds.length > 0) { - await new AutomationExecutionRepository({ ...options, transaction }).destroyAllAutomation( - syncAutomationIds, - ) - } - - await new AutomationRepository({ ...options, transaction }).destroyAll(syncAutomationIds) - await this._createAuditLog(AuditLogRepository.DELETE, record, record, options) } diff --git a/backend/src/database/repositories/memberSyncRemoteRepository.ts b/backend/src/database/repositories/memberSyncRemoteRepository.ts deleted file mode 100644 index 861068fc07..0000000000 --- a/backend/src/database/repositories/memberSyncRemoteRepository.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { QueryTypes } from 'sequelize' - -import { generateUUIDv1 as uuid } from '@crowd/common' -import { IMemberSyncRemoteData, SyncStatus } from '@crowd/types' - -import { IRepositoryOptions } from './IRepositoryOptions' -import { RepositoryBase } from './repositoryBase' -import SequelizeRepository from './sequelizeRepository' - -class MemberSyncRemoteRepository extends RepositoryBase< - IMemberSyncRemoteData, - string, - IMemberSyncRemoteData, - unknown, - unknown -> { - public constructor(options: IRepositoryOptions) { - super(options, true) - } - - async stopSyncingAutomation(automationId: string) { - await this.options.database.sequelize.query( - `update "membersSyncRemote" set status = :status where "syncFrom" = :automationId - `, - { - replacements: { - status: SyncStatus.STOPPED, - automationId, - }, - type: QueryTypes.UPDATE, - }, - ) - } - - async findRemoteSync(integrationId: string, memberId: string, syncFrom: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "membersSyncRemote" - WHERE "integrationId" = :integrationId and "memberId" = :memberId and "syncFrom" = :syncFrom; - `, - { - replacements: { - integrationId, - memberId, - syncFrom, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } - - async startManualSync(id: string, sourceId: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - await this.options.database.sequelize.query( - `update "membersSyncRemote" set status = :status, "sourceId" = :sourceId where "id" = :id - `, - { - replacements: { - status: SyncStatus.ACTIVE, - id, - sourceId: sourceId || null, - }, - type: QueryTypes.UPDATE, - transaction, - }, - ) - } - - async stopMemberManualSync(memberId: string) { - await this.options.database.sequelize.query( - `update "membersSyncRemote" set status = :status where "memberId" = :memberId and "syncFrom" = :manualSync - `, - { - replacements: { - status: SyncStatus.STOPPED, - memberId, - manualSync: 'manual', - }, - type: QueryTypes.UPDATE, - }, - ) - } - - async destroyAllAutomation(automationIds: string[]): Promise { - const transaction = this.transaction - - const seq = this.seq - - const query = ` - delete - from "membersSyncRemote" - where "syncFrom" in (:automationIds);` - - await seq.query(query, { - replacements: { - automationIds, - }, - type: QueryTypes.DELETE, - transaction, - }) - } - - async destroyAllIntegration(integrationIds: string[]): Promise { - const transaction = this.transaction - - const seq = this.seq - - const query = ` - delete - from "membersSyncRemote" - where "integrationId" in (:integrationIds);` - - await seq.query(query, { - replacements: { - integrationIds, - }, - type: QueryTypes.DELETE, - transaction, - }) - } - - async markMemberForSyncing(data: IMemberSyncRemoteData): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const existingSyncRemote = await this.findByMemberId(data.memberId) - - if (existingSyncRemote) { - data.sourceId = existingSyncRemote.sourceId - } - - const existingManualSyncRemote = await this.findRemoteSync( - data.integrationId, - data.memberId, - data.syncFrom, - ) - - if (existingManualSyncRemote) { - await this.startManualSync(existingManualSyncRemote.id, data.sourceId) - return existingManualSyncRemote - } - - const memberSyncRemoteInserted = await this.options.database.sequelize.query( - `insert into "membersSyncRemote" ("id", "memberId", "sourceId", "integrationId", "syncFrom", "metaData", "lastSyncedAt", "status") - values - (:id, :memberId, :sourceId, :integrationId, :syncFrom, :metaData, :lastSyncedAt, :status) - returning "id" - `, - { - replacements: { - id: uuid(), - memberId: data.memberId, - integrationId: data.integrationId, - syncFrom: data.syncFrom, - metaData: data.metaData, - lastSyncedAt: data.lastSyncedAt || null, - sourceId: data.sourceId || null, - status: SyncStatus.ACTIVE, - }, - type: QueryTypes.INSERT, - transaction, - }, - ) - - const memberSyncRemote = await this.findById(memberSyncRemoteInserted[0][0].id) - return memberSyncRemote - } - - async findMemberManualSync(memberId: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `select i.platform, msr.status from "membersSyncRemote" msr - inner join integrations i on msr."integrationId" = i.id - where msr."syncFrom" = :syncFrom and msr."memberId" = :memberId; - `, - { - replacements: { - memberId, - syncFrom: 'manual', - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - return records - } - - async findByMemberId(memberId: string): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "membersSyncRemote" - WHERE "memberId" = :memberId - and "sourceId" is not null - limit 1; - `, - { - replacements: { - memberId, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } - - async findById(id: string): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "membersSyncRemote" - WHERE id = :id; - `, - { - replacements: { - id, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } -} - -export default MemberSyncRemoteRepository diff --git a/backend/src/database/repositories/organizationSyncRemoteRepository.ts b/backend/src/database/repositories/organizationSyncRemoteRepository.ts deleted file mode 100644 index ef2eb3b306..0000000000 --- a/backend/src/database/repositories/organizationSyncRemoteRepository.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { QueryTypes } from 'sequelize' - -import { generateUUIDv1 as uuid } from '@crowd/common' -import { IOrganizationSyncRemoteData, SyncStatus } from '@crowd/types' - -import { IRepositoryOptions } from './IRepositoryOptions' -import { RepositoryBase } from './repositoryBase' -import SequelizeRepository from './sequelizeRepository' - -class OrganizationSyncRemoteRepository extends RepositoryBase< - IOrganizationSyncRemoteData, - string, - IOrganizationSyncRemoteData, - unknown, - unknown -> { - public constructor(options: IRepositoryOptions) { - super(options, true) - } - - async stopSyncingAutomation(automationId: string) { - await this.options.database.sequelize.query( - `update "organizationsSyncRemote" set status = :status where "syncFrom" = :automationId - `, - { - replacements: { - status: SyncStatus.STOPPED, - automationId, - }, - type: QueryTypes.UPDATE, - }, - ) - } - - async stopOrganizationManualSync(organizationId: string) { - await this.options.database.sequelize.query( - `update "organizationsSyncRemote" set status = :status where "organizationId" = :organizationId and "syncFrom" = :manualSync - `, - { - replacements: { - status: SyncStatus.STOPPED, - organizationId, - manualSync: 'manual', - }, - type: QueryTypes.UPDATE, - }, - ) - } - - async startManualSync(id: string, sourceId: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - await this.options.database.sequelize.query( - `update "organizationsSyncRemote" set status = :status, "sourceId" = :sourceId where "id" = :id - `, - { - replacements: { - status: SyncStatus.ACTIVE, - id, - sourceId: sourceId || null, - }, - type: QueryTypes.UPDATE, - transaction, - }, - ) - } - - async findRemoteSync(integrationId: string, organizationId: string, syncFrom: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "organizationsSyncRemote" - WHERE "integrationId" = :integrationId and "organizationId" = :organizationId and "syncFrom" = :syncFrom; - `, - { - replacements: { - integrationId, - organizationId, - syncFrom, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } - - async markOrganizationForSyncing( - data: IOrganizationSyncRemoteData, - ): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const existingSyncRemote = await this.findByOrganizationId(data.organizationId) - - if (existingSyncRemote) { - data.sourceId = existingSyncRemote.sourceId - } - - const existingManualSyncRemote = await this.findRemoteSync( - data.integrationId, - data.organizationId, - data.syncFrom, - ) - - if (existingManualSyncRemote) { - await this.startManualSync(existingManualSyncRemote.id, data.sourceId) - return existingManualSyncRemote - } - - const organizationSyncRemoteInserted = await this.options.database.sequelize.query( - `insert into "organizationsSyncRemote" ("id", "organizationId", "sourceId", "integrationId", "syncFrom", "metaData", "lastSyncedAt", "status") - VALUES - (:id, :organizationId, :sourceId, :integrationId, :syncFrom, :metaData, :lastSyncedAt, :status) - returning "id" - `, - { - replacements: { - id: uuid(), - organizationId: data.organizationId, - integrationId: data.integrationId, - syncFrom: data.syncFrom, - metaData: data.metaData, - lastSyncedAt: data.lastSyncedAt || null, - sourceId: data.sourceId || null, - status: SyncStatus.ACTIVE, - }, - type: QueryTypes.INSERT, - transaction, - }, - ) - - const organizationSyncRemote = await this.findById(organizationSyncRemoteInserted[0][0].id) - return organizationSyncRemote - } - - async destroyAllAutomation(automationIds: string[]): Promise { - const transaction = this.transaction - - const seq = this.seq - - const query = ` - delete - from "organizationsSyncRemote" - where "syncFrom" in (:automationIds);` - - await seq.query(query, { - replacements: { - automationIds, - }, - type: QueryTypes.DELETE, - transaction, - }) - } - - async destroyAllIntegration(integrationIds: string[]): Promise { - const transaction = this.transaction - - const seq = this.seq - - const query = ` - delete - from "organizationsSyncRemote" - where "integrationId" in (:integrationIds);` - - await seq.query(query, { - replacements: { - integrationIds, - }, - type: QueryTypes.DELETE, - transaction, - }) - } - - async findOrganizationManualSync(organizationId: string) { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `select i.platform, osr.status from "organizationsSyncRemote" osr - inner join integrations i on osr."integrationId" = i.id - where osr."syncFrom" = :syncFrom and osr."organizationId" = :organizationId; - `, - { - replacements: { - organizationId, - syncFrom: 'manual', - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - return records - } - - async findByOrganizationId(organizationId: string): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "organizationsSyncRemote" - WHERE "organizationId" = :organizationId - and "sourceId" is not null - limit 1; - `, - { - replacements: { - organizationId, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } - - async findById(id: string): Promise { - const transaction = SequelizeRepository.getTransaction(this.options) - - const records = await this.options.database.sequelize.query( - `SELECT * - FROM "organizationsSyncRemote" - WHERE id = :id; - `, - { - replacements: { - id, - }, - type: QueryTypes.SELECT, - transaction, - }, - ) - - if (records.length === 0) { - return null - } - - return records[0] - } -} - -export default OrganizationSyncRemoteRepository diff --git a/backend/src/database/repositories/types/automationTypes.ts b/backend/src/database/repositories/types/automationTypes.ts deleted file mode 100644 index 3a9da8ced7..0000000000 --- a/backend/src/database/repositories/types/automationTypes.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - AutomationExecutionState, - AutomationSettings, - AutomationState, - AutomationSyncTrigger, - AutomationTrigger, - AutomationType, -} from '@crowd/types' - -export interface DbAutomationInsertData { - name: string - type: AutomationType - trigger: AutomationTrigger | AutomationSyncTrigger - settings: AutomationSettings - state: AutomationState -} - -export interface DbAutomationUpdateData { - name: string - trigger: AutomationTrigger - settings: AutomationSettings - state: AutomationState -} - -export interface DbAutomationExecutionInsertData { - automationId: string - type: AutomationType - tenantId: string - trigger: AutomationTrigger | AutomationSyncTrigger - state: AutomationExecutionState - error: any | null - executedAt: Date - eventId: string - payload: any -} diff --git a/backend/src/security/permissions.ts b/backend/src/security/permissions.ts index ef92c4fa68..4fcf976a0a 100644 --- a/backend/src/security/permissions.ts +++ b/backend/src/security/permissions.ts @@ -340,50 +340,6 @@ class Permissions { TenantPlans.Scale, ], }, - automationCreate: { - id: 'automationCreate', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, - automationUpdate: { - id: 'automationUpdate', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, - automationDestroy: { - id: 'automationDestroy', - allowedRoles: [roles.admin, roles.projectAdmin], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, - automationRead: { - id: 'automationRead', - allowedRoles: [roles.admin, roles.projectAdmin, roles.readonly], - allowedPlans: [ - TenantPlans.Essential, - TenantPlans.Growth, - TenantPlans.EagleEye, - TenantPlans.Enterprise, - TenantPlans.Scale, - ], - }, tagImport: { id: 'tagImport', allowedRoles: [roles.admin, roles.projectAdmin], diff --git a/backend/src/serverless/utils/queueService.ts b/backend/src/serverless/utils/queueService.ts index edd732002a..30b42239c8 100644 --- a/backend/src/serverless/utils/queueService.ts +++ b/backend/src/serverless/utils/queueService.ts @@ -2,7 +2,6 @@ import { DataSinkWorkerEmitter, IntegrationRunWorkerEmitter, IntegrationStreamWorkerEmitter, - IntegrationSyncWorkerEmitter, QueuePriorityContextLoader, SearchSyncWorkerEmitter, } from '@crowd/common_services' @@ -93,20 +92,6 @@ export const getSearchSyncWorkerEmitter = async (): Promise => { - if (integrationSyncWorkerEmitter) return integrationSyncWorkerEmitter - - integrationSyncWorkerEmitter = new IntegrationSyncWorkerEmitter( - QUEUE_CLIENT(), - await REDIS_CLIENT(), - await QUEUE_PRIORITY_LOADER(), - log, - ) - await integrationSyncWorkerEmitter.init() - return integrationSyncWorkerEmitter -} - let dataSinkWorkerEmitter: DataSinkWorkerEmitter export const getDataSinkWorkerEmitter = async (): Promise => { if (dataSinkWorkerEmitter) return dataSinkWorkerEmitter diff --git a/backend/src/services/activityService.ts b/backend/src/services/activityService.ts index e86c656564..d0280bcc6a 100644 --- a/backend/src/services/activityService.ts +++ b/backend/src/services/activityService.ts @@ -251,42 +251,6 @@ export default class ActivityService extends LoggerBase { }) } - if (!existing && fireCrowdWebhooks) { - try { - const handle = await this.options.temporal.workflow.start( - 'processNewActivityAutomation', - { - workflowId: `${TemporalWorkflowId.NEW_ACTIVITY_AUTOMATION}/${record.id}`, - taskQueue: TEMPORAL_CONFIG.automationsTaskQueue, - workflowIdReusePolicy: - WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: 100, - }, - args: [ - { - tenantId: this.options.currentTenant.id, - activityId: record.id, - }, - ], - searchAttributes: { - TenantId: [this.options.currentTenant.id], - }, - }, - ) - this.log.info( - { workflowId: handle.workflowId }, - 'Started temporal workflow to process new activity automation!', - ) - } catch (err) { - this.log.error( - err, - { activityId: record.id }, - 'Error triggering new activity automation!', - ) - } - } - if (!fireCrowdWebhooks) { this.log.info('Ignoring outgoing webhooks because of fireCrowdWebhooks!') } diff --git a/backend/src/services/auth/passportStrategies/slackStrategy.ts b/backend/src/services/auth/passportStrategies/slackStrategy.ts index 7e12b1c5d8..077f0eac61 100644 --- a/backend/src/services/auth/passportStrategies/slackStrategy.ts +++ b/backend/src/services/auth/passportStrategies/slackStrategy.ts @@ -3,7 +3,7 @@ import SlackStrategy from 'passport-slack' import { PlatformType } from '@crowd/types' -import { API_CONFIG, SLACK_CONFIG, SLACK_NOTIFIER_CONFIG } from '../../../conf' +import { API_CONFIG, SLACK_CONFIG } from '../../../conf' export function getSlackStrategy(): SlackStrategy { return new SlackStrategy.Strategy( @@ -41,27 +41,4 @@ export function getSlackStrategy(): SlackStrategy { }, ) } -export function getSlackNotifierStrategy(): SlackStrategy { - return new SlackStrategy.Strategy( - { - clientID: SLACK_NOTIFIER_CONFIG.clientId, - clientSecret: SLACK_NOTIFIER_CONFIG.clientSecret, - callbackURL: `${API_CONFIG.url}/tenant/automation/slack/callback`, - skipUserProfile: true, - }, - (req, accessToken, webhookData, profile, done) => { - if (!done) { - throw new TypeError( - 'Missing req in verifyCallback; did you enable passReqToCallback in your strategy?', - ) - } - return done(null, { - accessToken: webhookData.access_token, - url: webhookData.incoming_webhook.url, - configurationUrl: webhookData.incoming_webhook.url, - channelId: webhookData.incoming_webhook.url, - channelName: webhookData.incoming_webhook.channel, - }) - }, - ) -} + diff --git a/backend/src/services/automationExecutionService.ts b/backend/src/services/automationExecutionService.ts deleted file mode 100644 index cc8ad274b1..0000000000 --- a/backend/src/services/automationExecutionService.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ - -/* eslint-disable class-methods-use-this */ -import { PageData } from '@crowd/types' - -import AutomationExecutionRepository from '../database/repositories/automationExecutionRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' -import { - AutomationExecution, - AutomationExecutionCriteria, - CreateAutomationExecutionRequest, -} from '../types/automationTypes' - -import { IServiceOptions } from './IServiceOptions' -import { ServiceBase } from './serviceBase' - -export default class AutomationExecutionService extends ServiceBase< - AutomationExecution, - string, - CreateAutomationExecutionRequest, - unknown, - AutomationExecutionCriteria -> { - public constructor(options: IServiceOptions) { - super(options) - } - - /** - * Method used by service that is processing automations as they are triggered - * @param data {CreateAutomationExecutionRequest} all the necessary data to log a new automation execution - */ - override async create(data: CreateAutomationExecutionRequest): Promise { - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - const record = await new AutomationExecutionRepository(this.options).create({ - automationId: data.automation.id, - type: data.automation.type, - tenantId: data.automation.tenantId, - trigger: data.automation.trigger, - error: data.error !== undefined ? data.error : null, - executedAt: new Date(), - state: data.state, - eventId: data.eventId, - payload: data.payload, - }) - await SequelizeRepository.commitTransaction(transaction) - - return record - } catch (error) { - await SequelizeRepository.rollbackTransaction(transaction) - throw error - } - } - - /** - * Method used to fetch all automation executions. - * @param criteria {AutomationExecutionCriteria} filters to be used when returning automation executions - * @returns {PageData>} - */ - override async findAndCountAll( - criteria: AutomationExecutionCriteria, - ): Promise> { - return new AutomationExecutionRepository(this.options).findAndCountAll(criteria) - } - - override async update(id: string, data: unknown): Promise { - throw new Error('Method not implemented.') - } - - override async destroyAll(ids: string[]): Promise { - throw new Error('Method not implemented.') - } - - override async findById(id: string): Promise { - throw new Error('Method not implemented.') - } -} diff --git a/backend/src/services/automationService.ts b/backend/src/services/automationService.ts deleted file mode 100644 index b2635af2c5..0000000000 --- a/backend/src/services/automationService.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { Error404 } from '@crowd/common' -import { - AutomationState, - AutomationSyncTrigger, - AutomationType, - IAutomationData, - PageData, - PlatformType, -} from '@crowd/types' - -import AutomationExecutionRepository from '@/database/repositories/automationExecutionRepository' -import IntegrationRepository from '@/database/repositories/integrationRepository' -import MemberSyncRemoteRepository from '@/database/repositories/memberSyncRemoteRepository' -import OrganizationSyncRemoteRepository from '@/database/repositories/organizationSyncRemoteRepository' -import { getIntegrationSyncWorkerEmitter } from '@/serverless/utils/queueService' - -import AutomationRepository from '../database/repositories/automationRepository' -import SequelizeRepository from '../database/repositories/sequelizeRepository' -import { - AutomationCriteria, - CreateAutomationRequest, - UpdateAutomationRequest, -} from '../types/automationTypes' - -import { IServiceOptions } from './IServiceOptions' -import { ServiceBase } from './serviceBase' - -export default class AutomationService extends ServiceBase< - IAutomationData, - string, - CreateAutomationRequest, - UpdateAutomationRequest, - AutomationCriteria -> { - public constructor(options: IServiceOptions) { - super(options) - } - - /** - * Creates a new active automation - * @param req {CreateAutomationRequest} data used to create a new automation - * @returns {IAutomationData} object for frontend to use - */ - override async create(req: CreateAutomationRequest): Promise { - const txOptions = await this.getTxRepositoryOptions() - - try { - // create an automation - const result = await new AutomationRepository(txOptions).create({ - ...req, - state: AutomationState.ACTIVE, - }) - - // check automation type, if hubspot trigger an automation onboard - if (req.type === AutomationType.HUBSPOT) { - let integration - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - }) - } catch (err) { - this.options.log.error(err, 'Error while fetching HubSpot integration from DB!') - throw new Error404() - } - - // enable sync remote for integration - integration = await IntegrationRepository.update( - integration.id, - { - settings: { - ...integration.settings, - syncRemoteEnabled: true, - }, - }, - txOptions, - ) - - const integrationSyncWorkerEmitter = await getIntegrationSyncWorkerEmitter() - await integrationSyncWorkerEmitter.triggerOnboardAutomation( - this.options.currentTenant.id, - integration.id, - result.id, - req.trigger as AutomationSyncTrigger, - ) - } - - await SequelizeRepository.commitTransaction(txOptions.transaction) - - return result - } catch (error) { - await SequelizeRepository.rollbackTransaction(txOptions.transaction) - throw error - } - } - - /** - * Updates an existing automation. - * Also used to change automation state - to enable or disable an automation. - * It updates all the columns at once so all the properties in the request parameter - * have to be filled. - * @param id of the existing automation that is being updated - * @param req {UpdateAutomationRequest} data used to update an existing automation - * @returns {IAutomationData} object for frontend to use - */ - override async update(id: string, req: UpdateAutomationRequest): Promise { - const txOptions = await this.getTxRepositoryOptions() - - try { - // update an existing automation including its state - const result = await new AutomationRepository(txOptions).update(id, req) - await SequelizeRepository.commitTransaction(txOptions.transaction) - // check automation type, if hubspot trigger an automation onboard - if (result.type === AutomationType.HUBSPOT) { - let integration - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - }) - } catch (err) { - this.options.log.error(err, 'Error while fetching HubSpot integration from DB!') - throw new Error404() - } - - if ( - result.trigger === AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH || - result.trigger === AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH - ) { - if (result.state === AutomationState.ACTIVE) { - const integrationSyncWorkerEmitter = await getIntegrationSyncWorkerEmitter() - await integrationSyncWorkerEmitter.triggerOnboardAutomation( - this.options.currentTenant.id, - integration.id, - result.id, - result.trigger as AutomationSyncTrigger, - ) - } else if (result.trigger === AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH) { - // disable memberSyncRemote for given automationId - const syncRepo = new MemberSyncRemoteRepository(this.options) - await syncRepo.stopSyncingAutomation(result.id) - } else if (result.trigger === AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH) { - // disable organizationSyncRemote for given automationId - const syncRepo = new OrganizationSyncRemoteRepository(this.options) - await syncRepo.stopSyncingAutomation(result.id) - } - } - } - return result - } catch (error) { - await SequelizeRepository.rollbackTransaction(txOptions.transaction) - throw error - } - } - - /** - * Method used to fetch all tenants automation with filters available in the criteria parameter - * @param criteria {AutomationCriteria} filters to be used when returning automations - * @returns {PageData>} - */ - override async findAndCountAll(criteria: AutomationCriteria): Promise> { - return new AutomationRepository(this.options).findAndCountAll(criteria) - } - - /** - * Method used to fetch a single automation by its id - * @param id automation id - * @returns {IAutomationData} - */ - override async findById(id: string): Promise { - return new AutomationRepository(this.options).findById(id) - } - - /** - * Deletes existing automations by id - * @param ids automation unique IDs to be deleted - */ - override async destroyAll(ids: string[]): Promise { - const txOptions = await this.getTxRepositoryOptions() - - try { - // delete automation executions - await new AutomationExecutionRepository(txOptions).destroyAllAutomation(ids) - - // delete syncRemote rows coming from automations - await new MemberSyncRemoteRepository(txOptions).destroyAllAutomation(ids) - await new OrganizationSyncRemoteRepository(txOptions).destroyAllAutomation(ids) - - const result = await new AutomationRepository(txOptions).destroyAll(ids) - await SequelizeRepository.commitTransaction(txOptions.transaction) - return result - } catch (error) { - await SequelizeRepository.rollbackTransaction(txOptions.transaction) - throw error - } - } -} diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 33e9e638d6..7b7e90e30a 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -5,28 +5,12 @@ import lodash from 'lodash' import moment from 'moment' import { EDITION, Error400, Error404 } from '@crowd/common' -import { MemberField, findMemberById } from '@crowd/data-access-layer/src/members' -import { - HubspotEndpoint, - HubspotEntity, - HubspotFieldMapperFactory, - IHubspotManualSyncPayload, - IHubspotOnboardingSettings, - IHubspotProperty, - IHubspotTokenInfo, - IProcessStreamContext, - getHubspotLists, - getHubspotProperties, - getHubspotTokenInfo, -} from '@crowd/integrations' import { RedisCache } from '@crowd/redis' import { Edition, PlatformType } from '@crowd/types' import { IRepositoryOptions } from '@/database/repositories/IRepositoryOptions' import GitlabReposRepository from '@/database/repositories/gitlabReposRepository' import IntegrationProgressRepository from '@/database/repositories/integrationProgressRepository' -import MemberSyncRemoteRepository from '@/database/repositories/memberSyncRemoteRepository' -import OrganizationSyncRemoteRepository from '@/database/repositories/organizationSyncRemoteRepository' import { IntegrationProgress } from '@/serverless/integrations/types/regularTypes' import { fetchAllGitlabGroups, @@ -49,13 +33,10 @@ import { GITLAB_CONFIG, IS_TEST_ENV, KUBE_MODE, - NANGO_CONFIG, } from '../conf/index' import GithubReposRepository from '../database/repositories/githubReposRepository' import IntegrationRepository from '../database/repositories/integrationRepository' -import MemberAttributeSettingsRepository from '../database/repositories/memberAttributeSettingsRepository' import SequelizeRepository from '../database/repositories/sequelizeRepository' -import TenantRepository from '../database/repositories/tenantRepository' import telemetryTrack from '../segment/telemetryTrack' import track from '../segment/track' import { ILinkedInOrganization } from '../serverless/integrations/types/linkedinTypes' @@ -67,13 +48,10 @@ import { getOrganizations } from '../serverless/integrations/usecases/linkedin/g import getToken from '../serverless/integrations/usecases/nango/getToken' import { getIntegrationRunWorkerEmitter, - getIntegrationSyncWorkerEmitter, } from '../serverless/utils/queueService' import { encryptData } from '../utils/crypto' import { IServiceOptions } from './IServiceOptions' -import OrganizationService from './organizationService' -import SearchSyncService from './searchSyncService' const discordToken = DISCORD_CONFIG.token || DISCORD_CONFIG.token2 @@ -755,509 +733,6 @@ export default class IntegrationService { throw new Error404(this.options.language, 'errors.linkedin.cantOnboardWrongStatus') } - async hubspotStopSyncMember(payload: IHubspotManualSyncPayload) { - if (!payload.memberId) { - throw new Error('memberId is required in the payload while syncing member to hubspot!') - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - const qx = SequelizeRepository.getQueryExecutor(this.options, transaction) - const member = await findMemberById(qx, payload.memberId, [MemberField.ID]) - - const memberSyncRemoteRepository = new MemberSyncRemoteRepository({ - ...this.options, - transaction, - }) - await memberSyncRemoteRepository.stopMemberManualSync(member.id) - - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - this.options.log.error(err, 'Error while stopping hubspot member sync!') - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - } - - async hubspotSyncMember(payload: IHubspotManualSyncPayload) { - if (!payload.memberId) { - throw new Error('memberId is required in the payload while syncing member to hubspot!') - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - let integration - let member: { id: string } - let memberSyncRemote - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - transaction, - }) - - const qx = SequelizeRepository.getQueryExecutor(this.options, transaction) - member = await findMemberById(qx, payload.memberId, [MemberField.ID]) - - const memberSyncRemoteRepo = new MemberSyncRemoteRepository({ ...this.options, transaction }) - - memberSyncRemote = await memberSyncRemoteRepo.markMemberForSyncing({ - integrationId: integration.id, - memberId: member.id, - metaData: null, - syncFrom: 'manual', - lastSyncedAt: null, - }) - - integration = await this.createOrUpdate( - { - platform: PlatformType.HUBSPOT, - settings: { - ...integration.settings, - syncRemoteEnabled: true, - }, - }, - transaction, - ) - - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - this.options.log.error(err, 'Error while starting Hubspot member sync!') - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - - const integrationSyncWorkerEmitter = await getIntegrationSyncWorkerEmitter() - await integrationSyncWorkerEmitter.triggerSyncMember( - this.options.currentTenant.id, - integration.id, - payload.memberId, - memberSyncRemote.id, - ) - - const searchSyncService = new SearchSyncService(this.options) - - // send it to opensearch because in member.update we bypass while passing transactions - await searchSyncService.triggerMemberSync(this.options.currentTenant.id, member.id, { - withAggs: true, - }) - } - - async hubspotStopSyncOrganization(payload: IHubspotManualSyncPayload) { - if (!payload.organizationId) { - throw new Error( - 'organizationId is required in the payload while stopping organization sync to hubspot!', - ) - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - try { - const organizationService = new OrganizationService(this.options) - - const organization = await organizationService.findById(payload.organizationId) - - const organizationSyncRemoteRepository = new OrganizationSyncRemoteRepository({ - ...this.options, - transaction, - }) - await organizationSyncRemoteRepository.stopOrganizationManualSync(organization.id) - } catch (err) { - this.options.log.error(err, 'Error while stopping Hubspot organization sync!') - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - } - - async hubspotSyncOrganization(payload: IHubspotManualSyncPayload) { - if (!payload.organizationId) { - throw new Error( - 'organizationId is required in the payload while syncing organization to hubspot!', - ) - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - let integration - let organization - let organizationSyncRemote - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - transaction, - }) - - const organizationService = new OrganizationService(this.options) - - organization = await organizationService.findById(payload.organizationId) - - const organizationSyncRemoteRepo = new OrganizationSyncRemoteRepository({ - ...this.options, - transaction, - }) - - organizationSyncRemote = await organizationSyncRemoteRepo.markOrganizationForSyncing({ - integrationId: integration.id, - organizationId: organization.id, - metaData: null, - syncFrom: 'manual', - lastSyncedAt: null, - }) - - integration = await this.createOrUpdate( - { - platform: PlatformType.HUBSPOT, - settings: { - ...integration.settings, - syncRemoteEnabled: true, - }, - }, - transaction, - ) - - await SequelizeRepository.commitTransaction(transaction) - - const integrationSyncWorkerEmitter = await getIntegrationSyncWorkerEmitter() - await integrationSyncWorkerEmitter.triggerSyncOrganization( - this.options.currentTenant.id, - integration.id, - payload.organizationId, - organizationSyncRemote.id, - ) - } catch (err) { - this.options.log.error(err, 'Error while starting Hubspot organization sync!') - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - } - - async hubspotOnboard(onboardSettings: IHubspotOnboardingSettings) { - if (onboardSettings.enabledFor.length === 0) { - throw new Error400(this.options.language, 'errors.hubspot.missingEnabledEntities') - } - - if ( - !onboardSettings.attributesMapping.members && - !onboardSettings.attributesMapping.organizations - ) { - throw new Error400(this.options.language, 'errors.hubspot.missingAttributesMapping') - } - - if ( - onboardSettings.enabledFor.includes(HubspotEntity.MEMBERS) && - !onboardSettings.attributesMapping.members - ) { - throw new Error400(this.options.language, 'errors.hubspot.missingAttributesMapping') - } - - if ( - onboardSettings.enabledFor.includes(HubspotEntity.ORGANIZATIONS) && - !onboardSettings.attributesMapping.organizations - ) { - throw new Error400(this.options.language, 'errors.hubspot.missingAttributesMapping') - } - - const tenantId = this.options.currentTenant.id - - let integration - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - }) - } catch (err) { - this.options.log.error(err, 'Error while fetching HubSpot integration from DB!') - throw new Error404() - } - - const memberAttributeSettings = ( - await MemberAttributeSettingsRepository.findAndCountAll({}, this.options) - ).rows - - const platforms = (await TenantRepository.getAvailablePlatforms(tenantId, this.options)).map( - (p) => p.platform, - ) - - const hubspotId = integration.settings.hubspotId - - const memberMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.MEMBERS, - hubspotId, - memberAttributeSettings, - platforms, - ) - const organizationMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - hubspotId, - ) - - // validate members - if (onboardSettings.attributesMapping.members) { - for (const field of Object.keys(onboardSettings.attributesMapping.members)) { - const hubspotProperty: IHubspotProperty = - integration.settings.hubspotProperties.members.find( - (p) => p.name === onboardSettings.attributesMapping.members[field], - ) - if (!memberMapper.isFieldMappableToHubspotType(field, hubspotProperty.type)) { - throw new Error( - `Member field ${field} has incompatible type with hubspot property ${hubspotProperty.name}`, - ) - } - } - } - - // validate organizations - if (onboardSettings.attributesMapping.organizations) { - for (const field of Object.keys(onboardSettings.attributesMapping.organizations)) { - const hubspotProperty: IHubspotProperty = - integration.settings.hubspotProperties.organizations.find( - (p) => p.name === onboardSettings.attributesMapping.organizations[field], - ) - if (!organizationMapper.isFieldMappableToHubspotType(field, hubspotProperty.type)) { - throw new Error( - `Organization field ${field} has incompatible type with hubspot property ${hubspotProperty.name}`, - ) - } - } - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - // save attribute mapping and enabledFor - try { - integration = await this.createOrUpdate( - { - platform: PlatformType.HUBSPOT, - settings: { - ...integration.settings, - attributesMapping: onboardSettings.attributesMapping, - enabledFor: onboardSettings.enabledFor, - crowdAttributes: memberAttributeSettings, - platforms, - }, - status: 'in-progress', - }, - transaction, - ) - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - - // Send queue message that starts the hubspot integration - const emitter = await getIntegrationRunWorkerEmitter() - await emitter.triggerIntegrationRun( - integration.tenantId, - integration.platform, - integration.id, - true, - ) - } - - async hubspotGetLists() { - const tenantId = this.options.currentTenant.id - const nangoId = `${tenantId}-${PlatformType.HUBSPOT}` - - let token: string - try { - token = await getToken(nangoId, PlatformType.HUBSPOT, this.options.log) - } catch (err) { - this.options.log.error(err, 'Error while verifying HubSpot tenant token in Nango!') - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - if (!token) { - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - const context = { - log: this.options.log, - serviceSettings: { - nangoId, - nangoUrl: NANGO_CONFIG.url, - nangoSecretKey: NANGO_CONFIG.secretKey, - }, - } as IProcessStreamContext - - const memberLists = await getHubspotLists(nangoId, context) - - return { - members: memberLists, - organizations: [], // hubspot doesn't support company lists yet - } - } - - async hubspotGetMappableFields() { - const memberAttributeSettings = ( - await MemberAttributeSettingsRepository.findAndCountAll({}, this.options) - ).rows - - const identities = await TenantRepository.getAvailablePlatforms( - this.options.currentTenant.id, - this.options, - ) - - // hubspotId is not used while getting the typemap, we can send it null - const memberMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.MEMBERS, - null, - memberAttributeSettings, - identities.map((i) => i.platform), - ) - const organizationMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - null, - ) - - return { - members: memberMapper.getTypeMap(), - organizations: organizationMapper.getTypeMap(), - } - } - - async hubspotUpdateProperties(): Promise { - const tenantId = this.options.currentTenant.id - const nangoId = `${tenantId}-${PlatformType.HUBSPOT}` - - let integration - - try { - integration = await IntegrationRepository.findByPlatform(PlatformType.HUBSPOT, { - ...this.options, - }) - } catch (err) { - this.options.log.error(err, 'Error while fetching HubSpot integration from DB!') - throw new Error404() - } - - let token: string - try { - token = await getToken(nangoId, PlatformType.HUBSPOT, this.options.log) - } catch (err) { - this.options.log.error(err, 'Error while verifying HubSpot tenant token in Nango!') - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - if (!token) { - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - - const context = { - log: this.options.log, - serviceSettings: { - nangoId, - nangoUrl: NANGO_CONFIG.url, - nangoSecretKey: NANGO_CONFIG.secretKey, - }, - } as IProcessStreamContext - - const hubspotMemberProperties = await getHubspotProperties( - nangoId, - HubspotEndpoint.CONTACTS, - context, - ) - const hubspotOrganizationProperties = await getHubspotProperties( - nangoId, - HubspotEndpoint.COMPANIES, - context, - ) - - try { - integration = await this.createOrUpdate( - { - platform: PlatformType.HUBSPOT, - settings: { - ...integration.settings, - updateMemberAttributes: true, - hubspotProperties: { - [HubspotEntity.MEMBERS]: hubspotMemberProperties, - [HubspotEntity.ORGANIZATIONS]: hubspotOrganizationProperties, - }, - }, - }, - transaction, - ) - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - - return integration.settings.hubspotProperties - } - - async hubspotConnect() { - const tenantId = this.options.currentTenant.id - const nangoId = `${tenantId}-${PlatformType.HUBSPOT}` - - let token: string - try { - token = await getToken(nangoId, PlatformType.HUBSPOT, this.options.log) - } catch (err) { - this.options.log.error(err, 'Error while verifying HubSpot tenant token in Nango!') - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - if (!token) { - throw new Error400(this.options.language, 'errors.noNangoToken.message') - } - - const transaction = await SequelizeRepository.createTransaction(this.options) - let integration - - const context = { - log: this.options.log, - serviceSettings: { - nangoId, - nangoUrl: NANGO_CONFIG.url, - nangoSecretKey: NANGO_CONFIG.secretKey, - }, - } as IProcessStreamContext - - const hubspotMemberProperties: IHubspotProperty[] = await getHubspotProperties( - nangoId, - HubspotEndpoint.CONTACTS, - context, - ) - - const hubspotOrganizationProperties: IHubspotProperty[] = await getHubspotProperties( - nangoId, - HubspotEndpoint.COMPANIES, - context, - ) - - const hubspotInfo: IHubspotTokenInfo = await getHubspotTokenInfo(nangoId, context) - - try { - integration = await this.createOrUpdate( - { - platform: PlatformType.HUBSPOT, - settings: { - updateMemberAttributes: true, - hubspotProperties: { - [HubspotEntity.MEMBERS]: hubspotMemberProperties, - [HubspotEntity.ORGANIZATIONS]: hubspotOrganizationProperties, - }, - hubspotId: hubspotInfo.hub_id, - }, - status: 'pending-action', - }, - transaction, - ) - await SequelizeRepository.commitTransaction(transaction) - } catch (err) { - await SequelizeRepository.rollbackTransaction(transaction) - throw err - } - - return integration - } - async linkedinConnect() { const tenantId = this.options.currentTenant.id const nangoId = `${tenantId}-${PlatformType.LINKEDIN}` diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index a27c130df0..766a43b9e1 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -33,7 +33,6 @@ import { QueryExecutor, optionsQx } from '@crowd/data-access-layer/src/queryExec // import { getActivityCountOfMemberIdentities } from '@crowd/data-access-layer' import { fetchManySegments } from '@crowd/data-access-layer/src/segments' import { LoggerBase } from '@crowd/logging' -import { WorkflowIdReusePolicy } from '@crowd/temporal' import { IMemberIdentity, IMemberRoleWithOrganization, @@ -49,10 +48,8 @@ import { MergeActionType, OrganizationIdentityType, SyncMode, - TemporalWorkflowId, } from '@crowd/types' -import { TEMPORAL_CONFIG } from '@/conf' import MemberOrganizationRepository from '@/database/repositories/memberOrganizationRepository' import { MergeActionsRepository } from '@/database/repositories/mergeActionsRepository' import OrganizationRepository from '@/database/repositories/organizationRepository' @@ -545,35 +542,6 @@ export default class MemberService extends LoggerBase { await searchSyncService.triggerMemberSync(this.options.currentTenant.id, record.id) } - if (!existing && fireCrowdWebhooks) { - try { - const handle = await this.options.temporal.workflow.start('processNewMemberAutomation', { - workflowId: `${TemporalWorkflowId.NEW_MEMBER_AUTOMATION}/${record.id}`, - taskQueue: TEMPORAL_CONFIG.automationsTaskQueue, - workflowIdReusePolicy: WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: 100, - }, - - args: [ - { - tenantId: this.options.currentTenant.id, - memberId: record.id, - }, - ], - searchAttributes: { - TenantId: [this.options.currentTenant.id], - }, - }) - this.log.info( - { workflowId: handle.workflowId }, - 'Started temporal workflow to process new member automation!', - ) - } catch (err) { - logger.error(err, `Error triggering new member automation - ${record.id}!`) - } - } - if (!fireCrowdWebhooks) { this.log.info('Ignoring outgoing webhooks because of fireCrowdWebhooks!') } diff --git a/backend/src/types/automationTypes.ts b/backend/src/types/automationTypes.ts deleted file mode 100644 index 9278820077..0000000000 --- a/backend/src/types/automationTypes.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - AutomationExecutionState, - AutomationSettings, - AutomationState, - AutomationSyncTrigger, - AutomationTrigger, - AutomationType, - IAutomationData, - SearchCriteria, -} from '@crowd/types' - -/** - * This data is used to create a new automation - */ -export interface CreateAutomationRequest { - name: string - type: AutomationType - trigger: AutomationTrigger | AutomationSyncTrigger - settings: AutomationSettings -} - -/** - * This data is used to update an existing automation - */ -export interface UpdateAutomationRequest { - name: string - trigger: AutomationTrigger - settings: AutomationSettings - state: AutomationState -} - -/** - * What filters we have available to list all automations - */ -export interface AutomationCriteria extends SearchCriteria { - id?: string - type?: AutomationType - trigger?: AutomationTrigger - state?: AutomationState -} - -export interface CreateAutomationExecutionRequest { - automation: IAutomationData - eventId: string - payload: any - state: AutomationExecutionState - error?: any -} - -/** - * Data about specific automation execution that was processed when a trigger was detected - */ -export interface AutomationExecution { - id: string - automationId: string - state: AutomationExecutionState - error: any | null - executedAt: string - eventId: string - payload: any -} - -/** - * What filters we have available to list all automations - */ -export interface AutomationExecutionCriteria extends SearchCriteria { - automationId: string -} diff --git a/scripts/builders/automations-worker.env b/scripts/builders/automations-worker.env deleted file mode 100644 index c58bab3e3f..0000000000 --- a/scripts/builders/automations-worker.env +++ /dev/null @@ -1,4 +0,0 @@ -DOCKERFILE="./services/docker/Dockerfile.automations_worker" -CONTEXT="../" -REPO="crowddotdev/automations-worker" -SERVICES="automations-worker" \ No newline at end of file diff --git a/scripts/cli b/scripts/cli index 935d1119f9..58d5db0f7b 100755 --- a/scripts/cli +++ b/scripts/cli @@ -767,7 +767,7 @@ while test $# -gt 0; do exit ;; start-dev) - INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") DEV=1 start exit @@ -778,7 +778,7 @@ while test $# -gt 0; do exit ;; clean-start-dev) - # INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + # INGORED_SERVICES=("python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") CLEAN_START=1 DEV=1 start @@ -863,14 +863,14 @@ while test $# -gt 0; do exit ;; service-restart-fe-dev) - IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") DEV=1 kill_all_containers service_start exit ;; clean-start-fe-dev) - INGORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker" "automations-worker") + INGORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") CLEAN_START=1 DEV=1 start diff --git a/scripts/services/automations-worker.yaml b/scripts/services/automations-worker.yaml deleted file mode 100644 index 4e9f648977..0000000000 --- a/scripts/services/automations-worker.yaml +++ /dev/null @@ -1,65 +0,0 @@ -version: '3.1' - -x-env-args: &env-args - DOCKER_BUILDKIT: 1 - NODE_ENV: docker - SERVICE: automations-worker - CROWD_TEMPORAL_TASKQUEUE: automations - SHELL: /bin/sh - -services: - automations-worker: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.automations_worker - command: 'pnpm run start' - working_dir: /usr/crowd/app/services/apps/automations_worker - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - restart: always - networks: - - crowd-bridge - - automations-worker-dev: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.automations_worker - command: 'pnpm run dev' - working_dir: /usr/crowd/app/services/apps/automations_worker - # user: '${USER_ID}:${GROUP_ID}' - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - hostname: automations-worker - networks: - - crowd-bridge - volumes: - - ../../services/libs/audit-logs/src:/usr/crowd/app/services/libs/audit-logs/src - - ../../services/libs/common/src:/usr/crowd/app/services/libs/common/src - - ../../services/libs/common_services/src:/usr/crowd/app/services/libs/common_services/src - - ../../services/libs/data-access-layer/src:/usr/crowd/app/services/libs/data-access-layer/src - - ../../services/libs/database/src:/usr/crowd/app/services/libs/database/src - - ../../services/libs/feature-flags/src:/usr/crowd/app/services/libs/feature-flags/src - - ../../services/libs/integrations/src:/usr/crowd/app/services/libs/integrations/src - - ../../services/libs/logging/src:/usr/crowd/app/services/libs/logging/src - - ../../services/libs/opensearch/src:/usr/crowd/app/services/libs/opensearch/src - - ../../services/libs/questdb/src:/usr/crowd/app/services/libs/questdb/src - - ../../services/libs/queue/src:/usr/crowd/app/services/libs/queue/src - - ../../services/libs/redis/src:/usr/crowd/app/services/libs/redis/src - - ../../services/libs/telemetry/src:/usr/crowd/app/services/libs/telemetry/src - - ../../services/libs/temporal/src:/usr/crowd/app/services/libs/temporal/src - - ../../services/libs/types/src:/usr/crowd/app/services/libs/types/src - - ../../services/apps/automations_worker/src:/usr/crowd/app/services/apps/automations_worker/src - -networks: - crowd-bridge: - external: true diff --git a/scripts/services/docker/Dockerfile.automations_worker b/scripts/services/docker/Dockerfile.automations_worker deleted file mode 100644 index 1c39510dd7..0000000000 --- a/scripts/services/docker/Dockerfile.automations_worker +++ /dev/null @@ -1,23 +0,0 @@ -FROM node:20-alpine as builder - -RUN apk add --no-cache python3 make g++ - -WORKDIR /usr/crowd/app -RUN corepack enable - -COPY ./pnpm-workspace.yaml ./pnpm-lock.yaml ./ -RUN pnpm fetch - -COPY ./services ./services -RUN pnpm i --frozen-lockfile - -FROM node:20-bookworm-slim as runner - -WORKDIR /usr/crowd/app -RUN corepack enable && apt update && apt install -y ca-certificates --no-install-recommends && rm -rf /var/lib/apt/lists/* - -COPY --from=builder /usr/crowd/app/node_modules ./node_modules -COPY --from=builder /usr/crowd/app/services/base.tsconfig.json ./services/base.tsconfig.json -COPY --from=builder /usr/crowd/app/services/libs ./services/libs -COPY --from=builder /usr/crowd/app/services/archetypes/ ./services/archetypes -COPY --from=builder /usr/crowd/app/services/apps/automations_worker/ ./services/apps/automations_worker diff --git a/scripts/services/docker/Dockerfile.automations_worker.dockerignore b/scripts/services/docker/Dockerfile.automations_worker.dockerignore deleted file mode 100644 index f78c82d71c..0000000000 --- a/scripts/services/docker/Dockerfile.automations_worker.dockerignore +++ /dev/null @@ -1,21 +0,0 @@ -**/.git -**/node_modules -**/venv* -**/.webpack -**/.serverless -**/.env -**/.env.* -**/.idea -**/.vscode -**/dist -backend/server-config/ -backend/util/ -backend/src/serverless/microservices/python -.vscode/ -.github/ -frontend/ -scripts/ -.flake8 -*.md -Makefile -backend/ \ No newline at end of file diff --git a/scripts/services/integration-sync-worker.yaml b/scripts/services/integration-sync-worker.yaml deleted file mode 100644 index 22c0e41016..0000000000 --- a/scripts/services/integration-sync-worker.yaml +++ /dev/null @@ -1,65 +0,0 @@ -version: '3.1' - -x-env-args: &env-args - DOCKER_BUILDKIT: 1 - NODE_ENV: docker - SERVICE: integration-sync-worker - SHELL: /bin/sh - QUEUE_PRIORITY_LEVEL: normal - -services: - integration-sync-worker: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.integration_sync_worker - command: 'pnpm run start' - working_dir: /usr/crowd/app/services/apps/integration_sync_worker - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - restart: always - networks: - - crowd-bridge - - integration-sync-worker-dev: - build: - context: ../../ - dockerfile: ./scripts/services/docker/Dockerfile.integration_sync_worker - command: 'pnpm run dev' - working_dir: /usr/crowd/app/services/apps/integration_sync_worker - # user: '${USER_ID}:${GROUP_ID}' - env_file: - - ../../backend/.env.dist.local - - ../../backend/.env.dist.composed - - ../../backend/.env.override.local - - ../../backend/.env.override.composed - environment: - <<: *env-args - hostname: integration-sync-worker - networks: - - crowd-bridge - volumes: - - ../../services/libs/audit-logs/src:/usr/crowd/app/services/libs/audit-logs/src - - ../../services/libs/common/src:/usr/crowd/app/services/libs/common/src - - ../../services/libs/common_services/src:/usr/crowd/app/services/libs/common_services/src - - ../../services/libs/data-access-layer/src:/usr/crowd/app/services/libs/data-access-layer/src - - ../../services/libs/database/src:/usr/crowd/app/services/libs/database/src - - ../../services/libs/feature-flags/src:/usr/crowd/app/services/libs/feature-flags/src - - ../../services/libs/integrations/src:/usr/crowd/app/services/libs/integrations/src - - ../../services/libs/logging/src:/usr/crowd/app/services/libs/logging/src - - ../../services/libs/opensearch/src:/usr/crowd/app/services/libs/opensearch/src - - ../../services/libs/questdb/src:/usr/crowd/app/services/libs/questdb/src - - ../../services/libs/queue/src:/usr/crowd/app/services/libs/queue/src - - ../../services/libs/redis/src:/usr/crowd/app/services/libs/redis/src - - ../../services/libs/telemetry/src:/usr/crowd/app/services/libs/telemetry/src - - ../../services/libs/temporal/src:/usr/crowd/app/services/libs/temporal/src - - ../../services/libs/types/src:/usr/crowd/app/services/libs/types/src - - ../../services/apps/integration_sync_worker/src:/usr/crowd/app/services/apps/integration_sync_worker/src - -networks: - crowd-bridge: - external: true diff --git a/services/apps/automations_worker/package.json b/services/apps/automations_worker/package.json deleted file mode 100644 index fd1e28795b..0000000000 --- a/services/apps/automations_worker/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@crowd/automations-worker", - "scripts": { - "start": "CROWD_TEMPORAL_TASKQUEUE=automations SERVICE=automations-worker tsx src/main.ts", - "start:debug:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && CROWD_TEMPORAL_TASKQUEUE=automations SERVICE=automations-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9232 src/main.ts", - "start:debug": "CROWD_TEMPORAL_TASKQUEUE=automations SERVICE=automations-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9232 src/main.ts", - "dev:local": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug:local", - "dev": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug", - "lint": "npx eslint --ext .ts src --max-warnings=0", - "format": "npx prettier --write \"src/**/*.ts\"", - "format-check": "npx prettier --check .", - "tsc-check": "tsc --noEmit" - }, - "dependencies": { - "@crowd/archetype-standard": "workspace:*", - "@crowd/archetype-worker": "workspace:*", - "@crowd/common": "workspace:*", - "@crowd/data-access-layer": "workspace:*", - "@crowd/integrations": "workspace:*", - "@crowd/logging": "workspace:*", - "@crowd/redis": "workspace:*", - "@crowd/types": "workspace:*", - "@temporalio/workflow": "~1.11.1", - "html-to-mrkdwn-ts": "^1.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.merge": "^4.6.2", - "superagent": "^8.1.2", - "tsx": "^4.7.1", - "typescript": "^5.6.3" - }, - "devDependencies": { - "@types/node": "^20.8.2", - "@types/superagent": "^4.1.20", - "nodemon": "^3.0.1" - } -} diff --git a/services/apps/automations_worker/src/activities.ts b/services/apps/automations_worker/src/activities.ts deleted file mode 100644 index 0d0970b3d2..0000000000 --- a/services/apps/automations_worker/src/activities.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - detectNewActivityAutomations, - triggerActivityAutomationExecution, -} from './activities/newActivityAutomations' -import { - detectNewMemberAutomations, - triggerMemberAutomationExecution, -} from './activities/newMemberAutomations' - -export { - detectNewActivityAutomations, - triggerActivityAutomationExecution, - detectNewMemberAutomations, - triggerMemberAutomationExecution, -} diff --git a/services/apps/automations_worker/src/activities/newActivityAutomations.ts b/services/apps/automations_worker/src/activities/newActivityAutomations.ts deleted file mode 100644 index 04bc6802d3..0000000000 --- a/services/apps/automations_worker/src/activities/newActivityAutomations.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { getChildLogger } from '@crowd/logging' - -import { svc } from '../main' -import { AutomationService } from '../services/automation.service' - -export async function triggerActivityAutomationExecution( - automationId: string, - activityId: string, -): Promise { - const log = getChildLogger('triggerActivityAutomationExecution', svc.log, { - automationId, - activityId, - }) - - const service = new AutomationService(svc.postgres.writer, svc.redis, log) - const payload = await service.getActivity(activityId) - if (!payload) { - log.warn('Activity not found, skipping execution') - return - } - await service.triggerAutomationExecution(automationId, activityId, payload) -} - -// returns automation ids to trigger -export async function detectNewActivityAutomations( - tenantId: string, - activityId: string, -): Promise { - const log = getChildLogger('detectNewActivityAutomations', svc.log, { - tenantId, - activityId, - }) - - const service = new AutomationService(svc.postgres.reader, svc.redis, log) - return service.detectNewActivityAutomations(tenantId, activityId) -} diff --git a/services/apps/automations_worker/src/activities/newMemberAutomations.ts b/services/apps/automations_worker/src/activities/newMemberAutomations.ts deleted file mode 100644 index bedc5c29a8..0000000000 --- a/services/apps/automations_worker/src/activities/newMemberAutomations.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { getChildLogger } from '@crowd/logging' - -import { svc } from '../main' -import { AutomationService } from '../services/automation.service' - -export async function triggerMemberAutomationExecution( - automationId: string, - memberId: string, -): Promise { - const log = getChildLogger('triggerMemberAutomationExecution', svc.log, { - automationId, - memberId, - }) - - const service = new AutomationService(svc.postgres.writer, svc.redis, log) - const payload = await service.getMember(memberId) - if (!payload) { - log.warn('Member not found, skipping execution') - return - } - await service.triggerAutomationExecution(automationId, memberId, payload) -} - -// returns automation ids to trigger -export async function detectNewMemberAutomations( - tenantId: string, - memberId: string, -): Promise { - const log = getChildLogger('detectNewMemberAutomations', svc.log, { - tenantId, - memberId, - }) - - const service = new AutomationService(svc.postgres.reader, svc.redis, log) - return service.detectNewMemberAutomations(tenantId, memberId) -} diff --git a/services/apps/automations_worker/src/main.ts b/services/apps/automations_worker/src/main.ts deleted file mode 100644 index b6cb8a6f36..0000000000 --- a/services/apps/automations_worker/src/main.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Config } from '@crowd/archetype-standard' -import { Options, ServiceWorker } from '@crowd/archetype-worker' - -const config: Config = { - envvars: [], - producer: { - enabled: false, - }, - temporal: { - enabled: false, - }, - questdb: { - enabled: false, - }, - redis: { - enabled: true, - }, -} - -const options: Options = { - postgres: { - enabled: true, - }, - opensearch: { - enabled: false, - }, -} - -export const svc = new ServiceWorker(config, options) - -export const FRONTEND_URL = process.env.CROWD_API_FRONTEND_URL - -if (!FRONTEND_URL) { - throw new Error('CROWD_API_FRONTEND_URL is not set') -} - -setImmediate(async () => { - await svc.init() - await svc.start() -}) diff --git a/services/apps/automations_worker/src/services/automation.service.ts b/services/apps/automations_worker/src/services/automation.service.ts deleted file mode 100644 index e434f819ba..0000000000 --- a/services/apps/automations_worker/src/services/automation.service.ts +++ /dev/null @@ -1,502 +0,0 @@ -import request from 'superagent' - -import { DbStore } from '@crowd/data-access-layer/src/database' -import { - AutomationRepository, - IRelevantAutomationData, -} from '@crowd/data-access-layer/src/old/apps/automations_worker/automation.repo' -import { DataRepository } from '@crowd/data-access-layer/src/old/apps/automations_worker/data.repo' -import { - IActivityData, - IMemberData, -} from '@crowd/data-access-layer/src/old/apps/automations_worker/types' -import { Logger, getChildLogger } from '@crowd/logging' -import { RedisCache, RedisClient } from '@crowd/redis' -import { - AutomationExecutionState, - AutomationState, - AutomationTrigger, - AutomationType, - NewActivitySettings, - NewMemberSettings, - WebhookSettings, -} from '@crowd/types' - -import { newActivityBlocks } from './slack/newActivityBlocks' -import { newMemberBlocks } from './slack/newMemberBlocks' - -export class AutomationService { - private readonly log: Logger - private readonly automationRepo: AutomationRepository - private readonly dataRepo: DataRepository - - private readonly automationCache: RedisCache - private readonly memberCache: RedisCache - private readonly activityCache: RedisCache - - constructor(dbStore: DbStore, redis: RedisClient, parentLog: Logger) { - this.log = getChildLogger(this.constructor.name, parentLog) - - this.automationRepo = new AutomationRepository(dbStore, this.log) - this.dataRepo = new DataRepository(dbStore, this.log) - - this.automationCache = new RedisCache('automations:definitions', redis, this.log) - this.memberCache = new RedisCache('automations:members', redis, this.log) - this.activityCache = new RedisCache('automations:activities', redis, this.log) - } - - async shouldProcessMember( - member: IMemberData, - automation: IRelevantAutomationData, - ): Promise { - const settings = automation.settings as NewMemberSettings - - let shouldProcess = true - - // check if member joined after automation was created - if (new Date(automation.createdAt) > new Date(member.joinedAt)) { - this.log.warn( - `Ignoring automation ${automation.id} - Member ${member.id} joined before automation!`, - ) - shouldProcess = false - } - - // check whether member platforms matches - if (shouldProcess && settings.platforms && settings.platforms.length > 0) { - const platforms = Object.keys(member.username) - if (!platforms.some((platform) => settings.platforms.includes(platform))) { - this.log.warn( - `Ignoring automation ${automation.id} - Member ${ - member.id - } platforms do not include any of automation setting platforms: [${settings.platforms.join( - ', ', - )}]`, - ) - shouldProcess = false - } - } - - if (shouldProcess) { - const hasAlreadyBeenTriggered = await this.automationRepo.hasAlreadyBeenTriggered( - automation.id, - member.id, - ) - if (hasAlreadyBeenTriggered) { - this.log.warn( - `Ignoring automation ${automation.id} - Member ${member.id} was already processed!`, - ) - shouldProcess = false - } - } - - return shouldProcess - } - - async shouldProcessActivity( - activity: IActivityData, - automation: IRelevantAutomationData, - ): Promise { - const settings = automation.settings as NewActivitySettings - - let shouldProcess = true - - // check if activity created after automation was created - if (new Date(automation.createdAt) > new Date(activity.timestamp)) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} was created before automation!`, - ) - shouldProcess = false - } - - // check whether activity type matches - if (shouldProcess && settings.types && settings.types.length > 0) { - if (!settings.types.includes(activity.type)) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} type '${ - activity.type - }' does not match automation setting types: [${settings.types.join(', ')}]`, - ) - shouldProcess = false - } - } - - // check whether activity platform matches - if (shouldProcess && settings.platforms && settings.platforms.length > 0) { - if (!settings.platforms.includes(activity.platform)) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} platform '${ - activity.platform - }' does not match automation setting platforms: [${settings.platforms.join(', ')}]`, - ) - shouldProcess = false - } - } - - // check whether activity content contains any of the keywords - if (shouldProcess && settings.keywords && settings.keywords.length > 0 && activity.body) { - const body = (activity.body as string).toLowerCase() - if (!settings.keywords.some((keyword) => body.includes(keyword.trim().toLowerCase()))) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${ - activity.id - } content does not match automation setting keywords: [${settings.keywords.join(', ')}]`, - ) - shouldProcess = false - } - } - - if ( - shouldProcess && - !settings.teamMemberActivities && - activity.member.attributes.isTeamMember && - activity.member.attributes.isTeamMember.default - ) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} belongs to a team member!`, - ) - shouldProcess = false - } - - if (activity?.member?.attributes?.isBot && activity?.member?.attributes?.isBot.default) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} belongs to a bot, cannot be processed automaticaly!`, - ) - shouldProcess = false - } - - if (shouldProcess) { - const hasAlreadyBeenTriggered = await this.automationRepo.hasAlreadyBeenTriggered( - automation.id, - activity.id, - ) - if (hasAlreadyBeenTriggered) { - this.log.warn( - `Ignoring automation ${automation.id} - Activity ${activity.id} was already processed!`, - ) - shouldProcess = false - } - } - - return shouldProcess - } - - /** - * @returns automation ids to trigger - */ - async detectNewMemberAutomations(tenantId: string, memberId: string): Promise { - this.log.debug('Detecting new member automations!') - - // load automations for this tenant and this type from database - const relevantAutomations = await this.automationRepo.findRelevant( - tenantId, - AutomationTrigger.NEW_MEMBER, - AutomationState.ACTIVE, - ) - - if (relevantAutomations.length > 0) { - this.log.info(`Found ${relevantAutomations.length} automations to process!`) - - const automationsToTrigger = [] - - const member = await this.getMember(memberId) - - if (!member) { - throw new Error(`Member ${memberId} not found!`) - } - - const promises = relevantAutomations.map((a) => this.shouldProcessMember(member, a)) - const results = await Promise.all(promises) - for (let i = 0; i < results.length; i++) { - if (results[i]) { - const automation = relevantAutomations[i] - this.log.info({ automationId: automation.id }, 'Automation should be processed!') - - await this.cacheAutomation(automation) - automationsToTrigger.push(automation.id) - } - } - - if (automationsToTrigger.length > 0) { - await this.cacheMember(member) - } - - return automationsToTrigger - } - - return [] - } - - /** - * @returns automation ids to trigger - */ - async detectNewActivityAutomations(tenantId: string, activityId: string): Promise { - this.log.debug('Detecting new member automations!') - - // load automations for this tenant and this type from database - const relevantAutomations = await this.automationRepo.findRelevant( - tenantId, - AutomationTrigger.NEW_ACTIVITY, - AutomationState.ACTIVE, - ) - - if (relevantAutomations.length > 0) { - this.log.info(`Found ${relevantAutomations.length} automations to process!`) - - const automationsToTrigger = [] - - const activity = await this.getActivity(activityId) - - if (!activity) { - throw new Error(`Activity ${activityId} not found!`) - } - - const promises = relevantAutomations.map((a) => this.shouldProcessActivity(activity, a)) - const results = await Promise.all(promises) - for (let i = 0; i < results.length; i++) { - if (results[i]) { - const automation = relevantAutomations[i] - this.log.info({ automationId: automation.id }, 'Automation should be processed!') - - await this.cacheAutomation(automation) - automationsToTrigger.push(automation.id) - } - } - - if (automationsToTrigger.length > 0) { - await this.cacheActivity(activity) - } - - return automationsToTrigger - } - - return [] - } - - async triggerAutomationExecution( - automationId: string, - eventId: string, - payload: unknown, - ): Promise { - this.log.info('Triggering automation execution!') - - const automation = await this.getAutomation(automationId) - - if (!automation) { - this.log.warn('Automation not found!') - return - } - - let executeMethod: ( - automation: IRelevantAutomationData, - eventId: string, - payload: unknown, - ) => Promise - - switch (automation.type) { - case AutomationType.WEBHOOK: { - executeMethod = this.executeWebhook - break - } - - case AutomationType.SLACK: { - executeMethod = this.executeSlack - break - } - default: - this.log.error(`Automation type '${automation.type}' is not supported!`) - return - } - - try { - await executeMethod.bind(this)(automation, eventId, payload) - await this.automationRepo.createExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - executedAt: new Date(), - state: AutomationExecutionState.SUCCESS, - eventId, - payload, - error: undefined, - }) - } catch (err) { - this.log.error(err, 'Error while executing automation!') - await this.automationRepo.createExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - executedAt: new Date(), - state: AutomationExecutionState.ERROR, - eventId, - payload, - error: err, - }) - } - } - - private async executeWebhook( - automation: IRelevantAutomationData, - eventId: string, - payload: unknown, - ): Promise { - const settings = automation.settings as WebhookSettings - const now = new Date() - - this.log.info('Firing webhook automation!') - const eventPayload = { - eventId, - eventType: automation.trigger, - eventExecutedAt: now.toISOString(), - eventPayload: payload, - } - - try { - const result = await request - .post(settings.url) - .send(eventPayload) - .set('User-Agent', 'Crowd.dev Automations Executor') - .set('X-CrowdDotDev-Event-Type', automation.trigger) - .set('X-CrowdDotDev-Event-ID', eventId) - this.log.debug(`Webhook response code ${result.statusCode}!`) - } catch (err) { - this.log.error( - err, - `Error while firing webhook automation ${automation.id} for event ${eventId} to url '${settings.url}'!`, - ) - - let error: Record - - if (err.syscall && err.code) { - error = { - type: 'network', - message: `Could not access ${settings.url}!`, - } - } else if (err.status) { - error = { - type: 'http_status', - message: `POST @ ${settings.url} returned ${err.statusCode} - ${err.statusMessage}!`, - body: err.res !== undefined ? err.res.body : undefined, - } - } else { - error = { - type: 'unknown', - message: err.message, - errorObject: err, - } - } - - throw error - } - } - - private async executeSlack( - automation: IRelevantAutomationData, - eventId: string, - payload: Record, - ): Promise { - this.log.info(`Firing slack automation ${automation.id} for event ${eventId}!`) - - if (!automation.slackWebHook) { - throw new Error( - `Automation ${automation.id} does not have a slack webhook set in tenant settings!`, - ) - } - - try { - let slackMessage: Record - if (automation.trigger === AutomationTrigger.NEW_MEMBER) { - slackMessage = { - text: `${payload.displayName} has joined your community!`, - ...newMemberBlocks(payload), - } - } else if (automation.trigger === AutomationTrigger.NEW_ACTIVITY) { - slackMessage = { - text: ':satellite_antenna: New activity', - ...newActivityBlocks(payload), - } - } else { - this.log.warn(`Error no slack handler for automation trigger ${automation.trigger}!`) - return - } - - const result = await request.post(automation.slackWebHook).send(slackMessage) - this.log.debug(`Slack response code ${result.statusCode}!`) - } catch (err) { - this.log.error( - err, - `Error while firing slack automation ${automation.id} for event ${eventId}!`, - ) - - let error: Record - - if (err.status === 404) { - error = { - type: 'connect', - message: `Could not access slack workspace!`, - } - } else { - error = { - type: 'connect', - } - } - - throw error - } - } - - private async cacheAutomation(automation: IRelevantAutomationData): Promise { - await this.automationCache.set(automation.id, JSON.stringify(automation), 60) - } - - private async getAutomation(automationId: string): Promise { - const cached = await this.automationCache.get(automationId) - if (!cached) { - const automation = await this.automationRepo.get(automationId) - if (!automation) { - return null - } - - return automation - } - - return JSON.parse(cached) - } - - private async cacheMember(member: IMemberData): Promise { - await this.memberCache.set(member.id, JSON.stringify(member), 60) - } - - async getMember(memberId: string): Promise { - const cached = await this.memberCache.get(memberId) - if (!cached) { - const members = await this.dataRepo.getMembers([memberId]) - if (members.length === 0) { - return null - } - - return members[0] - } - - return JSON.parse(cached) - } - - private async cacheActivity(activity: IActivityData): Promise { - await this.activityCache.set(activity.id, JSON.stringify(activity), 60) - } - - async getActivity(activityId: string): Promise { - const cached = await this.activityCache.get(activityId) - if (!cached) { - const activities = await this.dataRepo.getActivities([activityId]) - if (activities.length === 0) { - return null - } - - return activities[0] - } - - return JSON.parse(cached) - } -} diff --git a/services/apps/automations_worker/src/services/slack/newActivityBlocks.ts b/services/apps/automations_worker/src/services/slack/newActivityBlocks.ts deleted file mode 100644 index 7c6583ef09..0000000000 --- a/services/apps/automations_worker/src/services/slack/newActivityBlocks.ts +++ /dev/null @@ -1,220 +0,0 @@ -import htmlToMrkdwn from 'html-to-mrkdwn-ts' - -import { integrationLabel, integrationProfileUrl } from '@crowd/types' - -import { FRONTEND_URL } from '../../main' - -const defaultAvatarUrl = - 'https://uploads-ssl.webflow.com/635150609746eee5c60c4aac/6502afc9d75946873c1efa93_image%20(292).png' - -const computeEngagementLevel = (score) => { - if (score <= 1) { - return 'Silent' - } - if (score <= 3) { - return 'Quiet' - } - if (score <= 6) { - return 'Engaged' - } - if (score <= 8) { - return 'Fan' - } - if (score <= 10) { - return 'Ultra' - } - return '' -} - -const replacements: Record = { - '/images/integrations/linkedin-reactions/like.svg': ':thumbsup:', - '/images/integrations/linkedin-reactions/maybe.svg': ':thinking_face:', - '/images/integrations/linkedin-reactions/praise.svg': ':clap:', - '/images/integrations/linkedin-reactions/appreciation.svg': ':heart_hands:', - '/images/integrations/linkedin-reactions/empathy.svg': ':heart:', - '/images/integrations/linkedin-reactions/entertainment.svg': ':laughing:', - '/images/integrations/linkedin-reactions/interest.svg': ':bulb:', - 'href="/': `href="${FRONTEND_URL}/`, -} - -const replaceHeadline = (text) => { - Object.keys(replacements).forEach((key) => { - text = text.replaceAll(key, replacements[key]) - }) - return text -} - -const truncateText = (text: string, characters = 60): string => { - if (text.length > characters) { - return `${text.substring(0, characters)}...` - } - return text -} - -export const newActivityBlocks = (activity) => { - // Which platform identities are displayed as buttons and which ones go to menu - let buttonPlatforms = ['github', 'twitter', 'linkedin'] - - const display = htmlToMrkdwn(replaceHeadline(activity.display.default)) - const reach = activity.member.reach?.[activity.platform] || activity.member.reach?.total - - const { member } = activity - const memberProperties = [] - if (member.attributes.jobTitle?.default) { - memberProperties.push(`*💼 Job title:* ${member.attributes.jobTitle?.default}`) - } - if (member.organizations.length > 0) { - const orgs = member.organizations.map( - (org) => `<${`${FRONTEND_URL}/organizations/${org.id}`}|${org.name || org.displayName}>`, - ) - memberProperties.push(`*🏢 Organization:* ${orgs.join(' | ')}`) - } - if (reach > 0) { - memberProperties.push(`*👥 Reach:* ${reach} followers`) - } - if (member.attributes?.location?.default) { - memberProperties.push(`*📍 Location:* ${member.attributes?.location?.default}`) - } - if (member.emails.length > 0) { - const [email] = member.emails - memberProperties.push(`*✉️ Email:* `) - } - const engagementLevel = computeEngagementLevel(activity.member.score || activity.engagement) - if (engagementLevel.length > 0) { - memberProperties.push(`*📊 Engagement level:* ${engagementLevel}`) - } - if (activity.member.activeOn) { - const platforms = activity.member.activeOn - .map((platform) => integrationLabel[platform] || platform) - .join(' | ') - memberProperties.push(`*💬 Active on:* ${platforms}`) - } - - const profiles = Object.keys(member.username) - .map((p) => { - const username = (member.username?.[p] || []).length > 0 ? member.username[p][0] : null - const url = - member.attributes?.url?.[p] || (username && integrationProfileUrl[p](username)) || null - return { - platform: p, - url, - } - }) - .filter((p) => !!p.url) - - if (!buttonPlatforms.includes(activity.platform)) { - buttonPlatforms = [activity.platform, ...buttonPlatforms] - } - - const buttonProfiles = buttonPlatforms - .map((platform) => profiles.find((profile) => profile.platform === platform)) - .filter((profiles) => !!profiles) - - const menuProfiles = profiles.filter((profile) => !buttonPlatforms.includes(profile.platform)) - - return { - blocks: [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: `*<${FRONTEND_URL}/contacts/${activity.member.id}|${activity.member.displayName}>* *${display.text}*`, - }, - ...(activity.url - ? { - accessory: { - type: 'button', - text: { - type: 'plain_text', - text: `:arrow_upper_right: ${ - activity.platform !== 'other' - ? `Open on ${integrationLabel[activity.platform]}` - : 'Open link' - }`, - emoji: true, - }, - url: activity.url, - }, - } - : {}), - }, - ...(activity.title || activity.body - ? [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: `>${ - activity.title && activity.title !== activity.display.default - ? `*${truncateText(htmlToMrkdwn(activity.title).text, 120).replaceAll( - '\n', - '\n>', - )}* \n>` - : '' - }${truncateText(htmlToMrkdwn(activity.body).text, 260).replaceAll('\n', '\n>')}`, - }, - }, - ] - : []), - ...(memberProperties.length > 0 - ? [ - { - type: 'divider', - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: memberProperties.join('\n'), - }, - accessory: { - type: 'image', - image_url: member.attributes?.avatarUrl?.default ?? defaultAvatarUrl, - alt_text: 'computer thumbnail', - }, - }, - ] - : []), - { - type: 'actions', - elements: [ - { - type: 'button', - text: { - type: 'plain_text', - text: 'View in crowd.dev', - emoji: true, - }, - url: `${FRONTEND_URL}/contacts/${member.id}`, - }, - ...(buttonProfiles || []) - .map(({ platform, url }) => ({ - type: 'button', - text: { - type: 'plain_text', - text: `${integrationLabel[platform] ?? platform} profile`, - emoji: true, - }, - url, - })) - .filter((action) => !!action.url), - ...(menuProfiles.length > 0 - ? [ - { - type: 'overflow', - options: menuProfiles.map(({ platform, url }) => ({ - text: { - type: 'plain_text', - text: `${integrationLabel[platform] ?? platform} profile`, - emoji: true, - }, - url, - })), - }, - ] - : []), - ], - }, - ], - } -} diff --git a/services/apps/automations_worker/src/services/slack/newMemberBlocks.ts b/services/apps/automations_worker/src/services/slack/newMemberBlocks.ts deleted file mode 100644 index d74bee96d6..0000000000 --- a/services/apps/automations_worker/src/services/slack/newMemberBlocks.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { integrationLabel, integrationProfileUrl } from '@crowd/types' - -import { FRONTEND_URL } from '../../main' - -const defaultAvatarUrl = - 'https://uploads-ssl.webflow.com/635150609746eee5c60c4aac/6502afc9d75946873c1efa93_image%20(292).png' - -export const newMemberBlocks = (member) => { - // Which platform identities are displayed as buttons and which ones go to menu - let buttonPlatforms = ['github', 'twitter', 'linkedin'] - - const platforms = member.activeOn - const reach = - platforms && platforms.length > 0 ? member.reach?.[platforms[0]] : member.reach?.total - const details = [] - if (member.attributes.jobTitle?.default) { - details.push(`*💼 Job title:* ${member.attributes.jobTitle?.default}`) - } - if (member.organizations.length > 0) { - const orgs = member.organizations.map( - (org) => `<${`${FRONTEND_URL}/organizations/${org.id}`}|${org.name || org.displayName}>`, - ) - details.push(`*🏢 Organization:* ${orgs.join(' | ')}`) - } - if (reach > 0) { - details.push(`*👥 Reach:* ${reach} followers`) - } - if (member.attributes?.location?.default) { - details.push(`*📍 Location:* ${member.attributes?.location?.default}`) - } - if (member.emails.length > 0) { - const [email] = member.emails - details.push(`*✉️ Email:* `) - } - const profiles = Object.keys(member.username) - .map((p) => { - const username = (member.username?.[p] || []).length > 0 ? member.username[p][0] : null - const url = - member.attributes?.url?.[p] || (username && integrationProfileUrl[p](username)) || null - return { - platform: p, - url, - } - }) - .filter((p) => !!p.url) - - if (platforms.length > 0 && !buttonPlatforms.includes(platforms[0])) { - buttonPlatforms = [platforms[0], ...buttonPlatforms] - } - - const buttonProfiles = buttonPlatforms - .map((platform) => profiles.find((profile) => profile.platform === platform)) - .filter((profiles) => !!profiles) - - const menuProfiles = profiles.filter((profile) => !buttonPlatforms.includes(profile.platform)) - - return { - blocks: [ - { - type: 'header', - text: { - type: 'plain_text', - text: member.displayName, - emoji: true, - }, - }, - ...(platforms && platforms.length > 0 - ? [ - { - type: 'context', - elements: [ - { - type: 'mrkdwn', - text: `Joined your community on *${ - integrationLabel[platforms[0]] || platforms[0] - }*`, - }, - ], - }, - ] - : []), - ...(details.length > 0 - ? [ - { - type: 'divider', - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: details.length > 0 ? details.join('\n') : '\n', - }, - accessory: { - type: 'image', - image_url: member.attributes?.avatarUrl?.default ?? defaultAvatarUrl, - alt_text: 'computer thumbnail', - }, - }, - { - type: 'divider', - }, - ] - : []), - { - type: 'actions', - elements: [ - { - type: 'button', - text: { - type: 'plain_text', - text: 'View in crowd.dev', - emoji: true, - }, - url: `${FRONTEND_URL}/contacts/${member.id}`, - }, - ...(buttonProfiles || []) - .map(({ platform, url }) => ({ - type: 'button', - text: { - type: 'plain_text', - text: `${integrationLabel[platform] ?? platform} profile`, - emoji: true, - }, - url, - })) - .filter((action) => !!action.url), - ...(menuProfiles.length > 0 - ? [ - { - type: 'overflow', - options: menuProfiles.map(({ platform, url }) => ({ - text: { - type: 'plain_text', - text: `${integrationLabel[platform] ?? platform} profile`, - emoji: true, - }, - url, - })), - }, - ] - : []), - ], - }, - ], - } -} diff --git a/services/apps/automations_worker/src/workflows.ts b/services/apps/automations_worker/src/workflows.ts deleted file mode 100644 index 72454b7b0b..0000000000 --- a/services/apps/automations_worker/src/workflows.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - processNewActivityAutomation, - triggerActivityAutomationExecution, -} from './workflows/newActivityAutomations' -import { - processNewMemberAutomation, - triggerMemberAutomationExecution, -} from './workflows/newMemberAutomations' - -export { - processNewActivityAutomation, - processNewMemberAutomation, - triggerActivityAutomationExecution, - triggerMemberAutomationExecution, -} diff --git a/services/apps/automations_worker/src/workflows/newActivityAutomations.ts b/services/apps/automations_worker/src/workflows/newActivityAutomations.ts deleted file mode 100644 index ff474fbe5f..0000000000 --- a/services/apps/automations_worker/src/workflows/newActivityAutomations.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - WorkflowIdReusePolicy, - executeChild, - proxyActivities, - workflowInfo, -} from '@temporalio/workflow' - -import { IProcessNewActivityAutomationArgs, ITriggerActivityAutomationArgs } from '@crowd/types' - -import * as activities from '../activities/newActivityAutomations' - -const activity = proxyActivities({ startToCloseTimeout: '1 minute' }) - -export async function processNewActivityAutomation( - args: IProcessNewActivityAutomationArgs, -): Promise { - const automationsToTrigger = await activity.detectNewActivityAutomations( - args.tenantId, - args.activityId, - ) - - const info = workflowInfo() - - if (automationsToTrigger.length > 0) { - await Promise.all( - automationsToTrigger.map((a) => - executeChild(triggerActivityAutomationExecution, { - workflowId: `${info.workflowId}/${a}`, - workflowIdReusePolicy: WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: info.retryPolicy?.maximumAttempts ?? 100, - }, - args: [ - { - automationId: a, - activityId: args.activityId, - }, - ], - searchAttributes: { - TenantId: [args.tenantId], - }, - }), - ), - ) - } -} - -export async function triggerActivityAutomationExecution( - args: ITriggerActivityAutomationArgs, -): Promise { - await activity.triggerActivityAutomationExecution(args.automationId, args.activityId) -} diff --git a/services/apps/automations_worker/src/workflows/newMemberAutomations.ts b/services/apps/automations_worker/src/workflows/newMemberAutomations.ts deleted file mode 100644 index 291aba11f9..0000000000 --- a/services/apps/automations_worker/src/workflows/newMemberAutomations.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - WorkflowIdReusePolicy, - executeChild, - proxyActivities, - workflowInfo, -} from '@temporalio/workflow' - -import { IProcessNewMemberAutomationArgs, ITriggerMemberAutomationArgs } from '@crowd/types' - -import * as activities from '../activities/newMemberAutomations' - -const activity = proxyActivities({ startToCloseTimeout: '1 minute' }) - -export async function processNewMemberAutomation( - args: IProcessNewMemberAutomationArgs, -): Promise { - // first detect if there are any automations to trigger - const automationsToTrigger = await activity.detectNewMemberAutomations( - args.tenantId, - args.memberId, - ) - - const info = workflowInfo() - - // if there are any automations to trigger, trigger them - if (automationsToTrigger.length > 0) { - await Promise.all( - automationsToTrigger.map((a) => - executeChild(triggerMemberAutomationExecution, { - workflowId: `${info.workflowId}/${a}`, - workflowIdReusePolicy: WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: info.retryPolicy?.maximumAttempts ?? 100, - }, - args: [ - { - automationId: a, - memberId: args.memberId, - }, - ], - searchAttributes: { - TenantId: [args.tenantId], - }, - }), - ), - ) - } -} - -export async function triggerMemberAutomationExecution( - args: ITriggerMemberAutomationArgs, -): Promise { - await activity.triggerMemberAutomationExecution(args.automationId, args.memberId) -} diff --git a/services/apps/automations_worker/tsconfig.json b/services/apps/automations_worker/tsconfig.json deleted file mode 100644 index bf7f183850..0000000000 --- a/services/apps/automations_worker/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../base.tsconfig.json", - "include": ["src/**/*"] -} diff --git a/services/apps/data_sink_worker/config/default.json b/services/apps/data_sink_worker/config/default.json index a33f0334d8..9313fc56f0 100644 --- a/services/apps/data_sink_worker/config/default.json +++ b/services/apps/data_sink_worker/config/default.json @@ -3,9 +3,7 @@ "queue": {}, "redis": {}, "unleash": {}, - "temporal": { - "automationsTaskQueue": "automations" - }, + "temporal": {}, "worker": { "maxStreamRetries": 5, "queuePriorityLevel": "normal" diff --git a/services/apps/data_sink_worker/src/conf/index.ts b/services/apps/data_sink_worker/src/conf/index.ts index 014a91be2a..a7a2cc4a1a 100644 --- a/services/apps/data_sink_worker/src/conf/index.ts +++ b/services/apps/data_sink_worker/src/conf/index.ts @@ -6,7 +6,6 @@ import { IUnleashConfig } from '@crowd/feature-flags' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' -import { ITemporalConfig } from '@crowd/temporal' import { QueuePriorityLevel } from '@crowd/types' export interface ISlackAlertingConfig { @@ -67,19 +66,6 @@ export const UNLEASH_CONFIG = (): IUnleashConfig | undefined => { return unleashConfig } -export interface IDataSinkWorkerTemporalConfig extends ITemporalConfig { - automationsTaskQueue: string -} - -let temporalConfig: IDataSinkWorkerTemporalConfig | undefined -export const TEMPORAL_CONFIG = (): IDataSinkWorkerTemporalConfig | undefined => { - if (temporalConfig) return temporalConfig - - temporalConfig = config.get('temporal') - - return temporalConfig -} - export const SEARCH_SYNC_API_CONFIG = (): ISearchSyncApiConfig => { return config.get('searchSyncApi') } diff --git a/services/apps/data_sink_worker/src/service/activity.service.ts b/services/apps/data_sink_worker/src/service/activity.service.ts index 9e4c1740fd..73e6f58919 100644 --- a/services/apps/data_sink_worker/src/service/activity.service.ts +++ b/services/apps/data_sink_worker/src/service/activity.service.ts @@ -4,7 +4,6 @@ import mergeWith from 'lodash.mergewith' import moment from 'moment-timezone' import { - EDITION, escapeNullByte, generateUUIDv4, isObjectEmpty, @@ -36,19 +35,15 @@ import { DEFAULT_ACTIVITY_TYPE_SETTINGS, GithubActivityType } from '@crowd/integ import { GitActivityType } from '@crowd/integrations/src/integrations/git/types' import { Logger, LoggerBase, getChildLogger } from '@crowd/logging' import { RedisClient } from '@crowd/redis' -import { Client as TemporalClient, WorkflowIdReusePolicy } from '@crowd/temporal' +import { Client as TemporalClient } from '@crowd/temporal' import { - Edition, IActivityData, ISentimentAnalysisResult, MemberAttributeName, MemberIdentityType, PlatformType, - TemporalWorkflowId, } from '@crowd/types' -import { TEMPORAL_CONFIG } from '../conf' - import { IActivityCreateData, IActivityUpdateData, ISentimentActivityInput } from './activity.data' import MemberService from './member.service' import MemberAffiliationService from './memberAffiliation.service' @@ -145,38 +140,6 @@ export default class ActivityService extends LoggerBase { return activity.id }) - if (EDITION !== Edition.LFX) { - try { - const handle = await this.temporal.workflow.start('processNewActivityAutomation', { - workflowId: `${TemporalWorkflowId.NEW_ACTIVITY_AUTOMATION}/${id}`, - taskQueue: TEMPORAL_CONFIG().automationsTaskQueue, - workflowIdReusePolicy: WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: 100, - }, - args: [ - { - tenantId, - activityId: id, - }, - ], - searchAttributes: { - TenantId: [tenantId], - }, - }) - this.log.info( - { workflowId: handle.workflowId }, - 'Started temporal workflow to process new activity automation!', - ) - } catch (err) { - this.log.error( - err, - 'Error while starting temporal workflow to process new activity automation!', - ) - throw err - } - } - return id } catch (err) { this.log.error(err, 'Error while creating an activity!') diff --git a/services/apps/data_sink_worker/src/service/member.service.ts b/services/apps/data_sink_worker/src/service/member.service.ts index caa156cfcb..31f6822022 100644 --- a/services/apps/data_sink_worker/src/service/member.service.ts +++ b/services/apps/data_sink_worker/src/service/member.service.ts @@ -3,7 +3,6 @@ import mergeWith from 'lodash.mergewith' import uniqby from 'lodash.uniqby' import { - EDITION, getEarliestValidDate, getProperDisplayName, isDomainExcluded, @@ -21,9 +20,8 @@ import { import MemberRepository from '@crowd/data-access-layer/src/old/apps/data_sink_worker/repo/member.repo' import { Logger, LoggerBase, getChildLogger } from '@crowd/logging' import { RedisClient } from '@crowd/redis' -import { Client as TemporalClient, WorkflowIdReusePolicy } from '@crowd/temporal' +import { Client as TemporalClient } from '@crowd/temporal' import { - Edition, IMemberData, IMemberIdentity, IOrganizationIdSource, @@ -32,11 +30,8 @@ import { OrganizationIdentityType, OrganizationSource, PlatformType, - TemporalWorkflowId, } from '@crowd/types' -import { TEMPORAL_CONFIG } from '../conf' - import { IMemberCreateData, IMemberUpdateData } from './member.data' import MemberAttributeService from './memberAttribute.service' import { OrganizationService } from './organization.service' @@ -162,40 +157,6 @@ export default class MemberService extends LoggerBase { } }) - if (EDITION !== Edition.LFX) { - try { - const handle = await this.temporal.workflow.start('processNewMemberAutomation', { - workflowId: `${TemporalWorkflowId.NEW_MEMBER_AUTOMATION}/${id}`, - taskQueue: TEMPORAL_CONFIG().automationsTaskQueue, - workflowIdReusePolicy: WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE, - retry: { - maximumAttempts: 100, - }, - - args: [ - { - tenantId, - memberId: id, - }, - ], - searchAttributes: { - TenantId: [tenantId], - }, - }) - - this.log.info( - { workflowId: handle.workflowId }, - 'Started temporal workflow to process new member automation!', - ) - } catch (err) { - this.log.error( - err, - 'Error while starting temporal workflow to process new member automation!', - ) - throw err - } - } - if (fireSync) { await this.searchSyncWorkerEmitter.triggerMemberSync(tenantId, id, onboarding, segmentId) } diff --git a/services/apps/integration_run_worker/src/main.ts b/services/apps/integration_run_worker/src/main.ts index 4d88dfa7dc..e27a061974 100644 --- a/services/apps/integration_run_worker/src/main.ts +++ b/services/apps/integration_run_worker/src/main.ts @@ -1,7 +1,6 @@ import { IntegrationRunWorkerEmitter, IntegrationStreamWorkerEmitter, - IntegrationSyncWorkerEmitter, PriorityLevelContextRepository, QueuePriorityContextLoader, SearchSyncWorkerEmitter, @@ -32,12 +31,6 @@ setImmediate(async () => { const runWorkerEmitter = new IntegrationRunWorkerEmitter(queueClient, redis, loader, log) const streamWorkerEmitter = new IntegrationStreamWorkerEmitter(queueClient, redis, loader, log) const searchSyncWorkerEmitter = new SearchSyncWorkerEmitter(queueClient, redis, loader, log) - const integrationSyncWorkerEmitter = new IntegrationSyncWorkerEmitter( - queueClient, - redis, - loader, - log, - ) const apiPubSubEmitter = new ApiPubSubEmitter(redis, log) @@ -49,7 +42,6 @@ setImmediate(async () => { streamWorkerEmitter, runWorkerEmitter, searchSyncWorkerEmitter, - integrationSyncWorkerEmitter, apiPubSubEmitter, log, MAX_CONCURRENT_PROCESSING, @@ -59,7 +51,6 @@ setImmediate(async () => { await streamWorkerEmitter.init() await runWorkerEmitter.init() await searchSyncWorkerEmitter.init() - await integrationSyncWorkerEmitter.init() await queue.start() } catch (err) { log.error({ err }, 'Failed to start queues!') diff --git a/services/apps/integration_run_worker/src/queue/index.ts b/services/apps/integration_run_worker/src/queue/index.ts index 0241187896..110a427a02 100644 --- a/services/apps/integration_run_worker/src/queue/index.ts +++ b/services/apps/integration_run_worker/src/queue/index.ts @@ -1,7 +1,6 @@ import { IntegrationRunWorkerEmitter, IntegrationStreamWorkerEmitter, - IntegrationSyncWorkerEmitter, SearchSyncWorkerEmitter, } from '@crowd/common_services' import { DbConnection, DbStore } from '@crowd/data-access-layer/src/database' @@ -14,7 +13,6 @@ import { IntegrationRunWorkerQueueMessageType, QueuePriorityLevel, StartIntegrationRunQueueMessage, - StreamProcessedQueueMessage, } from '@crowd/types' import IntegrationRunService from '../service/integrationRunService' @@ -30,7 +28,6 @@ export class WorkerQueueReceiver extends PrioritizedQueueReciever { private readonly streamWorkerEmitter: IntegrationStreamWorkerEmitter, private readonly runWorkerEmitter: IntegrationRunWorkerEmitter, private readonly searchSyncWorkerEmitter: SearchSyncWorkerEmitter, - private readonly integrationSyncWorkerEmitter: IntegrationSyncWorkerEmitter, private readonly apiPubSubEmitter: ApiPubSubEmitter, parentLog: Logger, maxConcurrentProcessing: number, @@ -53,7 +50,6 @@ export class WorkerQueueReceiver extends PrioritizedQueueReciever { this.streamWorkerEmitter, this.runWorkerEmitter, this.searchSyncWorkerEmitter, - this.integrationSyncWorkerEmitter, this.apiPubSubEmitter, new DbStore(this.log, this.dbConn), this.log, @@ -82,9 +78,6 @@ export class WorkerQueueReceiver extends PrioritizedQueueReciever { msg2.additionalInfo, ) break - case IntegrationRunWorkerQueueMessageType.STREAM_PROCESSED: - await service.handleStreamProcessed((message as StreamProcessedQueueMessage).runId) - break default: throw new Error(`Unknown message type: ${message.type}`) } diff --git a/services/apps/integration_run_worker/src/service/integrationRunService.ts b/services/apps/integration_run_worker/src/service/integrationRunService.ts index e07ff4d254..824a10e6fa 100644 --- a/services/apps/integration_run_worker/src/service/integrationRunService.ts +++ b/services/apps/integration_run_worker/src/service/integrationRunService.ts @@ -2,36 +2,28 @@ import { singleOrDefault } from '@crowd/common' import { IntegrationRunWorkerEmitter, IntegrationStreamWorkerEmitter, - IntegrationSyncWorkerEmitter, SearchSyncWorkerEmitter, } from '@crowd/common_services' import { DbStore } from '@crowd/data-access-layer/src/database' -import { AutomationRepository } from '@crowd/data-access-layer/src/old/apps/integration_run_worker/automation.repo' import IntegrationRunRepository from '@crowd/data-access-layer/src/old/apps/integration_run_worker/integrationRun.repo' import MemberAttributeSettingsRepository from '@crowd/data-access-layer/src/old/apps/integration_run_worker/memberAttributeSettings.repo' import SampleDataRepository from '@crowd/data-access-layer/src/old/apps/integration_run_worker/sampleData.repo' -import { - IGenerateStreamsContext, - IIntegrationStartRemoteSyncContext, - INTEGRATION_SERVICES, -} from '@crowd/integrations' +import { IGenerateStreamsContext, INTEGRATION_SERVICES } from '@crowd/integrations' import { Logger, LoggerBase, getChildLogger } from '@crowd/logging' import { ApiPubSubEmitter, RedisCache, RedisClient } from '@crowd/redis' -import { IntegrationRunState, IntegrationStreamState } from '@crowd/types' +import { IntegrationRunState } from '@crowd/types' -import { NANGO_CONFIG, PLATFORM_CONFIG, WORKER_CONFIG } from '../conf' +import { NANGO_CONFIG, PLATFORM_CONFIG } from '../conf' export default class IntegrationRunService extends LoggerBase { private readonly repo: IntegrationRunRepository private readonly sampleDataRepo: SampleDataRepository - private readonly automationRepo: AutomationRepository constructor( private readonly redisClient: RedisClient, private readonly streamWorkerEmitter: IntegrationStreamWorkerEmitter, private readonly runWorkerEmitter: IntegrationRunWorkerEmitter, private readonly searchSyncWorkerEmitter: SearchSyncWorkerEmitter, - private readonly integrationSyncWorkerEmitter: IntegrationSyncWorkerEmitter, private readonly apiPubSubEmitter: ApiPubSubEmitter, private readonly store: DbStore, parentLog: Logger, @@ -40,167 +32,6 @@ export default class IntegrationRunService extends LoggerBase { this.repo = new IntegrationRunRepository(store, this.log) this.sampleDataRepo = new SampleDataRepository(store, this.log) - this.automationRepo = new AutomationRepository(store, this.log) - } - - public async handleStreamProcessed(runId: string): Promise { - this.log = getChildLogger('stream-processed', this.log, { - runId, - }) - - this.log.debug('Checking whether run is processed or not!') - - const counts = await this.repo.getStreamCountsByState(runId) - - let count = 0 - let finishedCount = 0 - let error = false - for (const [state, stateCount] of counts.entries()) { - count += stateCount - - if (state === IntegrationStreamState.ERROR) { - finishedCount += stateCount - error = true - } else if (state === IntegrationStreamState.PROCESSED) { - finishedCount += stateCount - } - } - - if (count === finishedCount) { - const runInfo = await this.repo.getGenerateStreamData(runId) - - if (error) { - this.log.warn('Some streams have resulted in error!') - - const pendingRetry = await this.repo.getErrorStreamsPendingRetry( - runId, - WORKER_CONFIG().maxRetries, - ) - if (pendingRetry === 0) { - this.log.error('No streams pending retry and all are in final state - run failed!') - await this.repo.markRunError(runId, { - location: 'all-streams-processed', - message: 'Some streams failed!', - }) - - if (runInfo.onboarding) { - this.log.warn('Onboarding - marking integration as failed!') - await this.repo.markIntegration(runId, 'error') - - this.apiPubSubEmitter.emitIntegrationCompleted( - runInfo.tenantId, - runInfo.integrationId, - 'error', - ) - } else { - const last5RunStates = await this.repo.getLastRuns(runId, 3) - if ( - last5RunStates.length === 3 && - last5RunStates.find((s) => s !== IntegrationRunState.ERROR) === undefined - ) { - this.log.warn( - 'Last 3 runs have all failed and now this one has failed - marking integration as failed!', - ) - await this.repo.markIntegration(runId, 'error') - } - } - } else { - this.log.debug('Some streams are pending retry - run is not finished yet!') - } - } else { - this.log.info('Run finished successfully!') - - try { - this.log.info('Trying to post process integration settings!') - - const service = singleOrDefault( - INTEGRATION_SERVICES, - (s) => s.type === runInfo.integrationType, - ) - - if (service.postProcess) { - let settings = runInfo.integrationSettings as object - const newSettings = service.postProcess(settings) - - if (newSettings) { - settings = { ...settings, ...newSettings } - await this.updateIntegrationSettings(runId, settings) - } - - this.log.info('Finished post processing integration settings!') - } else { - this.log.info('Integration does not have post processing!') - } - } catch (err) { - this.log.error({ err }, 'Error while post processing integration settings!') - } - - try { - this.log.info('Trying to process startSyncRemote!') - - const service = singleOrDefault( - INTEGRATION_SERVICES, - (s) => s.type === runInfo.integrationType, - ) - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const settings = runInfo.integrationSettings as any - - if ( - service.startSyncRemote && - settings.syncRemoteEnabled && - settings.blockSyncRemote !== true - ) { - const syncAutomations = await this.automationRepo.findSyncAutomations( - runInfo.tenantId, - runInfo.integrationType, - ) - - const syncRemoteContext: IIntegrationStartRemoteSyncContext = { - integrationSyncWorkerEmitter: this.integrationSyncWorkerEmitter, - integration: { - id: runInfo.integrationId, - identifier: runInfo.integrationIdentifier, - platform: runInfo.integrationType, - status: runInfo.integrationState, - settings: runInfo.integrationSettings, - token: runInfo.integrationToken, - refreshToken: runInfo.integrationRefreshToken, - }, - automations: syncAutomations, - tenantId: runInfo.tenantId, - log: this.log, - } - - await service.startSyncRemote(syncRemoteContext) - - this.log.info('Finished processing startSyncRemote!') - } else { - this.log.info( - { - syncRemoteEnabled: settings.syncRemoteEnabled, - blockSyncRemote: settings.blockSyncRemote, - }, - `Integration does not have a startSyncRemote function or settings disable sync remote!`, - ) - } - } catch (err) { - this.log.error({ err }, 'Error while starting integration sync remote!') - } - - this.log.info('Marking run and integration as successfully processed!') - await this.repo.markRunProcessed(runId) - await this.repo.markIntegration(runId, 'done') - - if (runInfo.onboarding) { - this.apiPubSubEmitter.emitIntegrationCompleted( - runInfo.tenantId, - runInfo.integrationId, - 'done', - ) - } - } - } } public async checkRuns(): Promise { diff --git a/services/apps/integration_sync_worker/config/custom-environment-variables.json b/services/apps/integration_sync_worker/config/custom-environment-variables.json deleted file mode 100644 index 63ca0e12b7..0000000000 --- a/services/apps/integration_sync_worker/config/custom-environment-variables.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "service": { - "edition": "CROWD_EDITION", - "queuePriorityLevel": "QUEUE_PRIORITY_LEVEL" - }, - "db": { - "host": "CROWD_DB_WRITE_HOST", - "port": "CROWD_DB_PORT", - "database": "CROWD_DB_DATABASE", - "user": "CROWD_DB_USERNAME", - "password": "CROWD_DB_PASSWORD" - }, - "queue": { - "brokers": "CROWD_KAFKA_BROKERS", - "extra": "CROWD_KAFKA_EXTRA" - }, - "redis": { - "username": "CROWD_REDIS_USERNAME", - "password": "CROWD_REDIS_PASSWORD", - "host": "CROWD_REDIS_HOST", - "port": "CROWD_REDIS_PORT" - }, - "opensearch": { - "node": "CROWD_OPENSEARCH_NODE", - "username": "CROWD_OPENSEARCH_USERNAME", - "password": "CROWD_OPENSEARCH_PASSWORD" - }, - "nango": { - "url": "CROWD_NANGO_URL", - "secretKey": "CROWD_NANGO_SECRET_KEY" - } -} diff --git a/services/apps/integration_sync_worker/config/default.json b/services/apps/integration_sync_worker/config/default.json deleted file mode 100644 index 808bb07ab4..0000000000 --- a/services/apps/integration_sync_worker/config/default.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "service": { - "queuePriorityLevel": "normal" - }, - "db": {}, - "queue": {}, - "redis": {}, - "opensearch": {}, - "nango": {} -} diff --git a/services/apps/integration_sync_worker/config/docker.json b/services/apps/integration_sync_worker/config/docker.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/services/apps/integration_sync_worker/config/docker.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/services/apps/integration_sync_worker/config/production.json b/services/apps/integration_sync_worker/config/production.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/services/apps/integration_sync_worker/config/production.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/services/apps/integration_sync_worker/config/staging.json b/services/apps/integration_sync_worker/config/staging.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/services/apps/integration_sync_worker/config/staging.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/services/apps/integration_sync_worker/package.json b/services/apps/integration_sync_worker/package.json deleted file mode 100644 index 44cfa55f30..0000000000 --- a/services/apps/integration_sync_worker/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@crowd/integration-sync-worker", - "scripts": { - "start": "SERVICE=integration-sync-worker tsx src/main.ts", - "start:debug:local": "set -a && . ../../../backend/.env.dist.local && . ../../../backend/.env.override.local && set +a && SERVICE=integration-sync-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9235 src/main.ts", - "start:debug": "SERVICE=integration-sync-worker LOG_LEVEL=trace tsx --inspect=0.0.0.0:9235 src/main.ts", - "dev:local": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug:local", - "dev": "nodemon --watch src --watch ../../libs --ext ts --exec pnpm run start:debug", - "lint": "npx eslint --ext .ts src --max-warnings=0", - "format": "npx prettier --write \"src/**/*.ts\"", - "format-check": "npx prettier --check .", - "tsc-check": "tsc --noEmit" - }, - "dependencies": { - "@crowd/common": "workspace:*", - "@crowd/data-access-layer": "workspace:*", - "@crowd/integrations": "workspace:*", - "@crowd/logging": "workspace:*", - "@crowd/opensearch": "workspace:*", - "@crowd/queue": "workspace:*", - "@crowd/types": "workspace:*", - "@opensearch-project/opensearch": "^2.11.0", - "config": "^3.3.9", - "tsx": "^4.7.1", - "typescript": "^5.6.3" - }, - "devDependencies": { - "@types/config": "^3.3.0", - "@types/node": "^18.16.3", - "nodemon": "^2.0.22" - } -} diff --git a/services/apps/integration_sync_worker/src/conf/index.ts b/services/apps/integration_sync_worker/src/conf/index.ts deleted file mode 100644 index 5df2c660c1..0000000000 --- a/services/apps/integration_sync_worker/src/conf/index.ts +++ /dev/null @@ -1,54 +0,0 @@ -import config from 'config' - -import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' -import { IQueueClientConfig } from '@crowd/queue' -import { IOpenSearchConfig, QueuePriorityLevel } from '@crowd/types' - -export interface IServiceConfig { - edition: string - queuePriorityLevel: QueuePriorityLevel -} -export interface INangoConfig { - url: string - secretKey: string -} - -let serviceConfig: IServiceConfig -export const SERVICE_CONFIG = (): IServiceConfig => { - if (serviceConfig) return serviceConfig - - serviceConfig = config.get('service') - return serviceConfig -} - -let queueConfig: IQueueClientConfig -export const QUEUE_CONFIG = (): IQueueClientConfig => { - if (queueConfig) return queueConfig - - queueConfig = config.get('queue') - return queueConfig -} - -let dbConfig: IDatabaseConfig -export const DB_CONFIG = (): IDatabaseConfig => { - if (dbConfig) return dbConfig - - dbConfig = config.get('db') - return dbConfig -} - -let openSearchConfig: IOpenSearchConfig -export const OPENSEARCH_CONFIG = (): IOpenSearchConfig => { - if (openSearchConfig) return openSearchConfig - - openSearchConfig = config.get('opensearch') - return openSearchConfig -} - -let nangoConfig: INangoConfig -export const NANGO_CONFIG = (): INangoConfig => { - if (nangoConfig) return nangoConfig - - nangoConfig = config.get('nango') - return nangoConfig -} diff --git a/services/apps/integration_sync_worker/src/errors.ts b/services/apps/integration_sync_worker/src/errors.ts deleted file mode 100644 index 3096292c3c..0000000000 --- a/services/apps/integration_sync_worker/src/errors.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const integrationNotFound = (integrationId: string): string => - `Integration ${integrationId} not found!` - -export const automationNotFound = (automationId: string): string => - `Automation ${automationId} not found!` diff --git a/services/apps/integration_sync_worker/src/main.ts b/services/apps/integration_sync_worker/src/main.ts deleted file mode 100644 index 0bec5a813f..0000000000 --- a/services/apps/integration_sync_worker/src/main.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { getDbConnection } from '@crowd/data-access-layer/src/database' -import { getServiceLogger } from '@crowd/logging' -import { getOpensearchClient } from '@crowd/opensearch' -import { QueueFactory } from '@crowd/queue' - -import { DB_CONFIG, OPENSEARCH_CONFIG, QUEUE_CONFIG, SERVICE_CONFIG } from './conf' -import { WorkerQueueReceiver } from './queue' - -const log = getServiceLogger() - -const MAX_CONCURRENT_PROCESSING = 2 - -setImmediate(async () => { - log.info('Starting integration sync worker...') - const queueClient = QueueFactory.createQueueService(QUEUE_CONFIG()) - - const dbConnection = await getDbConnection(DB_CONFIG(), MAX_CONCURRENT_PROCESSING) - - const opensearchClient = await getOpensearchClient(OPENSEARCH_CONFIG()) - - const worker = new WorkerQueueReceiver( - SERVICE_CONFIG().queuePriorityLevel, - queueClient, - dbConnection, - opensearchClient, - log, - MAX_CONCURRENT_PROCESSING, - ) - - try { - await worker.start() - } catch (err) { - log.error(err, 'Failed to start!') - process.exit(1) - } -}) diff --git a/services/apps/integration_sync_worker/src/queue/index.ts b/services/apps/integration_sync_worker/src/queue/index.ts deleted file mode 100644 index a3e630d17f..0000000000 --- a/services/apps/integration_sync_worker/src/queue/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Client } from '@opensearch-project/opensearch' - -import { DbConnection, DbStore } from '@crowd/data-access-layer/src/database' -import { Logger } from '@crowd/logging' -import { CrowdQueue, IQueue, PrioritizedQueueReciever } from '@crowd/queue' -import { - AutomationSyncTrigger, - IQueueMessage, - IntegrationSyncWorkerQueueMessageType, - QueuePriorityLevel, -} from '@crowd/types' - -import { MemberSyncService } from '../service/member.sync.service' -import { OpenSearchService } from '../service/opensearch.service' -import { OrganizationSyncService } from '../service/organization.sync.service' - -export class WorkerQueueReceiver extends PrioritizedQueueReciever { - constructor( - level: QueuePriorityLevel, - client: IQueue, - private readonly dbConn: DbConnection, - private readonly openSearchClient: Client, - parentLog: Logger, - maxConcurrentProcessing: number, - ) { - super( - level, - client, - client.getQueueChannelConfig(CrowdQueue.INTEGRATION_SYNC_WORKER), - maxConcurrentProcessing, - parentLog, - ) - } - - private initMemberService(): MemberSyncService { - return new MemberSyncService( - new DbStore(this.log, this.dbConn), - new OpenSearchService(this.log, this.openSearchClient), - this.log, - ) - } - - private initOrganizationService(): OrganizationSyncService { - return new OrganizationSyncService(new DbStore(this.log, this.dbConn), this.log) - } - - public override async processMessage(message: T): Promise { - try { - this.log.trace({ messageType: message.type }, 'Processing message!') - - const type = message.type as IntegrationSyncWorkerQueueMessageType - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const data = message as any - - switch (type) { - // members - case IntegrationSyncWorkerQueueMessageType.SYNC_ALL_MARKED_MEMBERS: - await this.initMemberService().syncAllMarkedMembers(data.tenantId, data.integrationId) - - break - case IntegrationSyncWorkerQueueMessageType.SYNC_MEMBER: - await this.initMemberService().syncMember( - data.tenantId, - data.integrationId, - data.memberId, - data.syncRemoteId, - ) - break - case IntegrationSyncWorkerQueueMessageType.SYNC_ORGANIZATION: - await this.initOrganizationService().syncOrganization( - data.tenantId, - data.integrationId, - data.organizationId, - data.syncRemoteId, - ) - break - case IntegrationSyncWorkerQueueMessageType.SYNC_ALL_MARKED_ORGANIZATIONS: - await this.initOrganizationService().syncAllMarkedOrganizations( - data.tenantId, - data.integrationId, - ) - break - case IntegrationSyncWorkerQueueMessageType.ONBOARD_AUTOMATION: - if (data.automationTrigger === AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH) { - await this.initMemberService().syncAllFilteredMembers( - data.tenantId, - data.integrationId, - data.automationId, - ) - } else if ( - data.automationTrigger === AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH - ) { - const organizationIds = - await this.initOrganizationService().syncAllFilteredOrganizations( - data.tenantId, - data.integrationId, - data.automationId, - ) - - // also sync organization members if syncAllFilteredOrganizations return the ids - while (organizationIds.length > 0) { - const organizationId = organizationIds.shift() - await this.initMemberService().syncOrganizationMembers( - data.tenantId, - data.integrationId, - data.automationId, - organizationId, - ) - } - } else { - const errorMessage = `Unsupported trigger for onboard automation message!` - this.log.error({ message }, errorMessage) - throw new Error(errorMessage) - } - break - - default: - throw new Error(`Unknown message type: ${message.type}`) - } - } catch (err) { - this.log.error(err, 'Error while processing message!') - throw err - } - } -} diff --git a/services/apps/integration_sync_worker/src/service/member.sync.service.ts b/services/apps/integration_sync_worker/src/service/member.sync.service.ts deleted file mode 100644 index 33e79a05be..0000000000 --- a/services/apps/integration_sync_worker/src/service/member.sync.service.ts +++ /dev/null @@ -1,638 +0,0 @@ -import { singleOrDefault } from '@crowd/common' -import { DbStore } from '@crowd/data-access-layer/src/database' -import { AutomationRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/automation.repo' -import { AutomationExecutionRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo' -import { IDbIntegration } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/integration.data' -import { IntegrationRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/integration.repo' -import { MemberRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/member.repo' -import { - IBatchCreateMembersResult, - IBatchUpdateMembersResult, - IIntegrationProcessRemoteSyncContext, - INTEGRATION_SERVICES, -} from '@crowd/integrations' -import { Logger, LoggerBase } from '@crowd/logging' -import { FieldTranslatorFactory, OpensearchQueryParser } from '@crowd/opensearch' -import { Entity, HubspotSettings, IMember, OpenSearchIndex } from '@crowd/types' -import { Edition } from '@crowd/types' - -import { NANGO_CONFIG, SERVICE_CONFIG } from '../conf' -import { automationNotFound, integrationNotFound } from '../errors' - -import { ISearchHit } from './opensearch.data' -import { OpenSearchService } from './opensearch.service' - -export class MemberSyncService extends LoggerBase { - private readonly memberRepo: MemberRepository - private readonly integrationRepo: IntegrationRepository - private readonly automationRepo: AutomationRepository - private readonly automationExecutionRepo: AutomationExecutionRepository - - constructor( - store: DbStore, - private readonly openSearchService: OpenSearchService, - parentLog: Logger, - ) { - super(parentLog) - - this.memberRepo = new MemberRepository(store, this.log) - this.integrationRepo = new IntegrationRepository(store, this.log) - this.automationRepo = new AutomationRepository(store, this.log) - this.automationExecutionRepo = new AutomationExecutionRepository(store, this.log) - } - - public async syncMember( - tenantId: string, - integrationId: string, - memberId: string, - syncRemoteId: string, - ): Promise { - const integration = await this.integrationRepo.findById(integrationId) - - if (!integration) { - const message = integrationNotFound(integrationId) - this.log.warn(message) - return - } - - const member = await this.memberRepo.findMember(memberId) - - if (!member) { - this.log.warn(`Member ${memberId} is not found for syncing remote!`) - return - } - - const syncRemote = await this.memberRepo.findSyncRemoteById(syncRemoteId) - - const membersToCreate = [] - const membersToUpdate = [] - - if (syncRemote.sourceId) { - member.attributes = { - ...member.attributes, - sourceId: { - ...(member.attributes.sourceId || {}), - [integration.platform]: syncRemote.sourceId, - }, - } - - membersToUpdate.push(member) - } else { - membersToCreate.push(member) - } - - const service = singleOrDefault(INTEGRATION_SERVICES, (s) => s.type === integration.platform) - - this.log.info(`Syncing member ${memberId} to ${integration.platform} remote!`) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - membersToCreate, - membersToUpdate, - Entity.MEMBERS, - context, - ) - - if (created.length > 0) { - const memberCreated = created[0] as IBatchCreateMembersResult - await this.memberRepo.setSyncRemoteSourceId(syncRemoteId, memberCreated.sourceId) - await this.memberRepo.setLastSyncedAtBySyncRemoteId( - syncRemoteId, - memberCreated.lastSyncedPayload, - ) - } - - if (updated.length > 0) { - const memberUpdated = updated[0] as IBatchUpdateMembersResult - await this.memberRepo.setLastSyncedAtBySyncRemoteId( - syncRemoteId, - memberUpdated.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } - - public async syncAllMarkedMembers( - tenantId: string, - integrationId: string, - batchSize = 100, - ): Promise { - const integration: IDbIntegration = await this.integrationRepo.findById(integrationId) - - if (!integration) { - const message = integrationNotFound(integrationId) - this.log.warn(message) - return - } - - const platforms = await this.memberRepo.getExistingPlatforms(tenantId) - - const attributes = await this.memberRepo.getTenantMemberAttributes(tenantId) - - const isMultiSegment = SERVICE_CONFIG().edition === Edition.LFX - - const translator = FieldTranslatorFactory.getTranslator(OpenSearchIndex.MEMBERS, attributes, [ - 'default', - 'custom', - 'crowd', - 'enrichment', - integration.platform, // it could be that no members have the outgoing identity yet, but member could be marked through attributes - ...platforms, - ]) - - let markedMembers - let offset - - do { - const membersToCreate: IMember[] = [] - const membersToUpdate: IMember[] = [] - - offset = markedMembers ? offset + batchSize : 0 - markedMembers = await this.memberRepo.findMarkedMembers(integration.id, batchSize, offset) - - while (markedMembers.length > 0) { - const memberToSync = markedMembers.shift() - - this.log.info(`Syncing member ${memberToSync.memberId} to ${integration.platform} remote!`) - - // find member in opensearch - const query = { - bool: { - must: [ - { - term: { - [`uuid_memberId`]: memberToSync.memberId, - }, - }, - ], - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any - - if (isMultiSegment) { - query.must.push({ - term: { - uuid_segmentId: integration.segmentId, - }, - }) - } - - const memberFromOpensearch = (await this.openSearchService.search( - OpenSearchIndex.MEMBERS, - query, - undefined, - 1, - undefined, - undefined, - )) as ISearchHit[] - - const translatedMembers: IMember[] = memberFromOpensearch.reduce((acc, member) => { - const membersWithCrowdFields = translator.translateObjectToCrowd(member._source) - acc.push(membersWithCrowdFields) - return acc - }, []) - - if (translatedMembers.length !== 1) { - this.log.warn('Found more than one member matching the id from opensearch - exiting!') - return - } - - if (memberToSync.sourceId) { - // append sourceId to object - it'll be used for updating the remote counterpart - translatedMembers[0].attributes = { - ...translatedMembers[0].attributes, - sourceId: { - ...(translatedMembers[0].attributes.sourceId || {}), - [integration.platform]: memberToSync.sourceId, - }, - } - membersToUpdate.push(translatedMembers[0]) - } else { - membersToCreate.push(translatedMembers[0]) - } - } - - const service = singleOrDefault(INTEGRATION_SERVICES, (s) => s.type === integration.platform) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - membersToCreate, - membersToUpdate, - Entity.MEMBERS, - context, - ) - - for (const newMember of created as IBatchCreateMembersResult[]) { - await this.memberRepo.setIntegrationSourceId( - newMember.memberId, - integration.id, - newMember.sourceId, - ) - await this.memberRepo.setLastSyncedAt( - newMember.memberId, - integration.id, - newMember.lastSyncedPayload, - ) - } - - for (const updatedMember of updated as IBatchUpdateMembersResult[]) { - await this.memberRepo.setLastSyncedAt( - updatedMember.memberId, - integration.id, - updatedMember.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } while (markedMembers.length > 0) - } - - public async syncAllFilteredMembers( - tenantId: string, - integrationId: string, - automationId: string, - batchSize = 50, - ) { - const integration: IDbIntegration = await this.integrationRepo.findById(integrationId) - - if (!integration) { - const message = integrationNotFound(integrationId) - this.log.warn(message) - return - } - const automation = await this.automationRepo.findById(automationId) - - if (!automation) { - const message = automationNotFound(automationId) - this.log.warn(message) - return - } - - const platforms = await this.memberRepo.getExistingPlatforms(tenantId) - - const attributes = await this.memberRepo.getTenantMemberAttributes(tenantId) - - const isMultiSegment = SERVICE_CONFIG().edition === Edition.LFX - - const translator = FieldTranslatorFactory.getTranslator(OpenSearchIndex.MEMBERS, attributes, [ - 'default', - 'custom', - 'crowd', - 'enrichment', - automation.type, // it could be that no members have the outgoing identity yet, but member could be marked through attributes - ...platforms, - ]) - - const parseOptions = { - filter: (automation.settings as HubspotSettings).filter, - limit: batchSize, - offset: 0, - orderBy: 'createdAt_DESC', - } - - const parsed = OpensearchQueryParser.parse(parseOptions, OpenSearchIndex.MEMBERS, translator) - - // add tenant filter - parsed.query.bool.must.push({ - term: { - [`uuid_tenantId`]: tenantId, - }, - }) - - // discard team members, bots and organizations - parsed.query.bool.must.push({ - bool: { - must: [ - { - bool: { - must_not: { - term: { - [`obj_attributes.obj_isTeamMember.bool_default`]: true, - }, - }, - }, - }, - { - bool: { - must_not: { - term: { - [`obj_attributes.obj_isBot.bool_default`]: true, - }, - }, - }, - }, - { - bool: { - must_not: { - term: { - [`obj_attributes.obj_isOrganization.bool_default`]: true, - }, - }, - }, - }, - ], - }, - }) - - if (isMultiSegment) { - parsed.query.bool.must.push({ - term: { - uuid_segmentId: integration.segmentId, - }, - }) - } - - let filteredMembers - let offset - - this.log.trace( - { filter: (automation.settings as HubspotSettings).filter }, - 'Trying to sync members that conform to sent filter!', - ) - - try { - do { - const membersToCreate: IMember[] = [] - const membersToUpdate: IMember[] = [] - - offset = filteredMembers ? offset + batchSize : 0 - parsed.from = offset - - filteredMembers = await this.openSearchService.client.search({ - index: OpenSearchIndex.MEMBERS, - body: parsed, - }) - - this.log.trace('Found members: ') - this.log.trace(filteredMembers) - - const translatedMembers: IMember[] = filteredMembers.body.hits.hits.reduce( - (acc, member) => { - const membersWithCrowdFields = translator.translateObjectToCrowd(member._source) - acc.push(membersWithCrowdFields) - return acc - }, - [], - ) - - while (translatedMembers.length > 0) { - const memberToSync = translatedMembers.shift() - - this.log.info(`Syncing member ${memberToSync.id} to ${integration.platform} remote!`) - - let syncRemote = await this.memberRepo.findSyncRemote( - memberToSync.id, - integration.id, - automation.id, - ) - - // member isn't marked yet, mark it - if (!syncRemote) { - syncRemote = await this.memberRepo.markMemberForSyncing({ - integrationId: integration.id, - memberId: memberToSync.id, - metaData: null, - syncFrom: automation.id, - }) - } - - if (syncRemote.sourceId) { - memberToSync.attributes = { - ...memberToSync.attributes, - sourceId: { - ...(memberToSync.attributes.sourceId || {}), - [integration.platform]: syncRemote.sourceId, - }, - } - membersToUpdate.push(memberToSync) - } else { - membersToCreate.push(memberToSync) - } - } - - const service = singleOrDefault( - INTEGRATION_SERVICES, - (s) => s.type === integration.platform, - ) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - automation, - } - - const { created, updated } = await service.processSyncRemote( - membersToCreate, - membersToUpdate, - Entity.MEMBERS, - context, - ) - - for (const newMember of created as IBatchCreateMembersResult[]) { - await this.memberRepo.setIntegrationSourceId( - newMember.memberId, - integration.id, - newMember.sourceId, - ) - - await this.memberRepo.setLastSyncedAt( - newMember.memberId, - integration.id, - newMember.lastSyncedPayload, - ) - } - - for (const updatedMember of updated as IBatchUpdateMembersResult[]) { - await this.memberRepo.setLastSyncedAt( - updatedMember.memberId, - integration.id, - updatedMember.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } while (filteredMembers.length > 0) - - await this.automationExecutionRepo.addExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - state: 'success', - payload: { - type: automation.type, - trigger: automation.trigger, - }, - error: null, - }) - } catch (e) { - await this.automationExecutionRepo.addExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - state: 'error', - payload: { - type: automation.type, - trigger: automation.trigger, - }, - error: JSON.stringify(e), - }) - - throw e - } - } - - public async syncOrganizationMembers( - tenantId: string, - integrationId: string, - automationId: string, - organizationId: string, - batchSize = 100, - ) { - const integration: IDbIntegration = await this.integrationRepo.findById(integrationId) - - if (!integration) { - const message = integrationNotFound(integrationId) - this.log.warn(message) - return - } - - const automation = await this.automationRepo.findById(automationId) - - if (!automation) { - const message = automationNotFound(automationId) - this.log.warn(message) - return - } - - let organizationMembers - let offset - - do { - const membersToCreate: IMember[] = [] - const membersToUpdate: IMember[] = [] - - offset = organizationMembers ? offset + batchSize : 0 - organizationMembers = await this.memberRepo.findOrganizationMembers( - organizationId, - batchSize, - offset, - ) - - while (organizationMembers.length > 0) { - const memberToSync = organizationMembers.shift() - - this.log.info(`Syncing member ${memberToSync.memberId} to ${integration.platform} remote!`) - const member = await this.memberRepo.findMember(memberToSync.memberId) - - let syncRemote = await this.memberRepo.findSyncRemote( - member.id, - integration.id, - automation.id, - ) - - // member isn't marked yet, mark it - if (!syncRemote) { - syncRemote = await this.memberRepo.markMemberForSyncing({ - integrationId: integration.id, - memberId: member.id, - metaData: null, - syncFrom: automation.id, - }) - } - - if (syncRemote.sourceId) { - member.attributes = { - ...member.attributes, - sourceId: { - ...(member.attributes.sourceId || {}), - [integration.platform]: syncRemote.sourceId, - }, - } - membersToUpdate.push(member) - } else { - membersToCreate.push(member) - } - } - - const service = singleOrDefault(INTEGRATION_SERVICES, (s) => s.type === integration.platform) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - membersToCreate, - membersToUpdate, - Entity.MEMBERS, - context, - ) - - for (const newMember of created as IBatchCreateMembersResult[]) { - await this.memberRepo.setIntegrationSourceId( - newMember.memberId, - integration.id, - newMember.sourceId, - ) - await this.memberRepo.setLastSyncedAt( - newMember.memberId, - integration.id, - newMember.lastSyncedPayload, - ) - } - - for (const updatedMember of updated as IBatchUpdateMembersResult[]) { - await this.memberRepo.setLastSyncedAt( - updatedMember.memberId, - integration.id, - updatedMember.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } while (organizationMembers.length > 0) - } -} diff --git a/services/apps/integration_sync_worker/src/service/opensearch.data.ts b/services/apps/integration_sync_worker/src/service/opensearch.data.ts deleted file mode 100644 index 13deac5cb8..0000000000 --- a/services/apps/integration_sync_worker/src/service/opensearch.data.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ISearchHit { - _id: string - - _source?: T -} diff --git a/services/apps/integration_sync_worker/src/service/opensearch.service.ts b/services/apps/integration_sync_worker/src/service/opensearch.service.ts deleted file mode 100644 index f99f727de2..0000000000 --- a/services/apps/integration_sync_worker/src/service/opensearch.service.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Client } from '@opensearch-project/opensearch' - -import { Logger, LoggerBase } from '@crowd/logging' -import { OpenSearchIndex } from '@crowd/types' - -import { ISearchHit } from './opensearch.data' - -export class OpenSearchService extends LoggerBase { - public readonly client: Client - - constructor(parentLog: Logger, client: Client) { - super(parentLog) - this.client = client - } - - public async search( - index: OpenSearchIndex, - query?: unknown, - aggs?: unknown, - size?: number, - sort?: unknown[], - searchAfter?: unknown, - sourceIncludeFields?: string[], - sourceExcludeFields?: string[], - ): Promise[] | unknown> { - try { - const payload = { - index, - _source_excludes: sourceExcludeFields, - _source_includes: sourceIncludeFields, - body: { - size: aggs ? 0 : undefined, - query, - aggs, - search_after: searchAfter ? [searchAfter] : undefined, - sort, - }, - size, - } - - const data = await this.client.search(payload) - - if (query) { - return data.body.hits.hits - } else { - return data.body.aggregations - } - } catch (err) { - this.log.error(err, { index, query }, 'Failed to search documents!') - throw new Error('Failed to search documents!') - } - } -} diff --git a/services/apps/integration_sync_worker/src/service/organization.sync.service.ts b/services/apps/integration_sync_worker/src/service/organization.sync.service.ts deleted file mode 100644 index 74c6957753..0000000000 --- a/services/apps/integration_sync_worker/src/service/organization.sync.service.ts +++ /dev/null @@ -1,367 +0,0 @@ -import { singleOrDefault } from '@crowd/common' -import { DbStore } from '@crowd/data-access-layer/src/database' -import { AutomationRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/automation.repo' -import { AutomationExecutionRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo' -import { IDbIntegration } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/integration.data' -import { IntegrationRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/integration.repo' -import { OrganizationRepository } from '@crowd/data-access-layer/src/old/apps/integration_sync_worker/organization.repo' -import { - IBatchCreateOrganizationsResult, - IBatchUpdateOrganizationsResult, - IIntegrationProcessRemoteSyncContext, - INTEGRATION_SERVICES, -} from '@crowd/integrations' -import { Logger, LoggerBase } from '@crowd/logging' -import { Entity, HubspotSettings, IOrganization, IOrganizationSyncRemoteData } from '@crowd/types' - -import { NANGO_CONFIG } from '../conf' - -export class OrganizationSyncService extends LoggerBase { - private readonly organizationRepo: OrganizationRepository - private readonly integrationRepo: IntegrationRepository - private readonly automationRepo: AutomationRepository - private readonly automationExecutionRepo: AutomationExecutionRepository - - constructor(store: DbStore, parentLog: Logger) { - super(parentLog) - - this.integrationRepo = new IntegrationRepository(store, this.log) - this.organizationRepo = new OrganizationRepository(store, this.log) - this.automationRepo = new AutomationRepository(store, this.log) - this.automationExecutionRepo = new AutomationExecutionRepository(store, this.log) - } - - public async syncOrganization( - tenantId: string, - integrationId: string, - organizationId: string, - syncRemoteId: string, - ): Promise { - const integration = await this.integrationRepo.findById(integrationId) - - const organization = await this.organizationRepo.findOrganization( - organizationId, - tenantId, - integration.segmentId, - ) - - const syncRemote = await this.organizationRepo.findSyncRemoteById(syncRemoteId) - - const oranizationsToCreate = [] - const organizationsToUpdate = [] - - if (syncRemote.sourceId) { - // organization.attributes = { - // ...organization.attributes, - // sourceId: { - // ...(organization.attributes.sourceId || {}), - // [integration.platform]: syncRemote.sourceId, - // }, - // } - organizationsToUpdate.push(organization) - } else { - oranizationsToCreate.push(organization) - } - - const service = singleOrDefault(INTEGRATION_SERVICES, (s) => s.type === integration.platform) - - this.log.info(`Syncing organization ${organizationId} to ${integration.platform} remote!`) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - oranizationsToCreate, - organizationsToUpdate, - Entity.ORGANIZATIONS, - context, - ) - - if (created.length > 0) { - const orgCreated = created[0] as IBatchCreateOrganizationsResult - await this.organizationRepo.setSyncRemoteSourceId(syncRemoteId, orgCreated.sourceId) - await this.organizationRepo.setLastSyncedAtBySyncRemoteId( - syncRemoteId, - orgCreated.lastSyncedPayload, - ) - } - - if (updated.length > 0) { - const orgUpdated = updated[0] as IBatchUpdateOrganizationsResult - await this.organizationRepo.setLastSyncedAtBySyncRemoteId( - syncRemoteId, - orgUpdated.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } - - public async syncAllMarkedOrganizations( - tenantId: string, - integrationId: string, - batchSize = 100, - ): Promise { - const integration: IDbIntegration = await this.integrationRepo.findById(integrationId) - - let markedOrganizations: IOrganizationSyncRemoteData[] - let offset - - do { - const organizationsToCreate: IOrganization[] = [] - const organizationsToUpdate: IOrganization[] = [] - - offset = markedOrganizations ? offset + batchSize : 0 - - markedOrganizations = await this.organizationRepo.findMarkedOrganizations( - integration.id, - batchSize, - offset, - ) - - for (const organizationToSync of markedOrganizations) { - this.log.info( - `Syncing organization ${organizationToSync.organizationId} to ${integration.platform} remote!`, - ) - - const organization = await this.organizationRepo.findOrganization( - organizationToSync.organizationId, - tenantId, - integration.segmentId, - ) - - if (organizationToSync.sourceId) { - // append sourceId to object - it'll be used for updating the remote counterpart - // organization.attributes = organization.attributes || {} - - // organization.attributes = { - // ...organization.attributes, - // sourceId: { - // ...(organization.attributes.sourceId || {}), - // [integration.platform]: organizationToSync.sourceId, - // }, - // } - organizationsToUpdate.push(organization) - } else { - organizationsToCreate.push(organization) - } - } - - const service = singleOrDefault(INTEGRATION_SERVICES, (s) => s.type === integration.platform) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - organizationsToCreate, - organizationsToUpdate, - Entity.ORGANIZATIONS, - context, - ) - - for (const newOrganization of created as IBatchCreateOrganizationsResult[]) { - await this.organizationRepo.setIntegrationSourceId( - newOrganization.organizationId, - integration.id, - newOrganization.sourceId, - ) - - await this.organizationRepo.setLastSyncedAt( - newOrganization.organizationId, - integration.id, - newOrganization.lastSyncedPayload, - ) - } - - for (const updatedOrganization of updated as IBatchUpdateOrganizationsResult[]) { - await this.organizationRepo.setLastSyncedAt( - updatedOrganization.organizationId, - integration.id, - updatedOrganization.lastSyncedPayload, - ) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } while (markedOrganizations.length > 0) - } - - public async syncAllFilteredOrganizations( - tenantId: string, - integrationId: string, - automationId: string, - batchSize = 50, - ) { - const integration: IDbIntegration = await this.integrationRepo.findById(integrationId) - const automation = await this.automationRepo.findById(automationId) - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const syncOrganizationMembers = (automation.settings as any)?.syncCompanyContacts === true - - const organizationsIdsSyncedToReturn = [] - - let filteredOrganizations: { id: string }[] - let offset - - try { - do { - const organizationsToCreate: IOrganization[] = [] - const organizationsToUpdate: IOrganization[] = [] - - offset = filteredOrganizations ? offset + batchSize : 0 - - filteredOrganizations = await this.organizationRepo.findFilteredOrganizations( - tenantId, - [integration.segmentId], - integration.platform, - (automation.settings as HubspotSettings).filter, - batchSize, - offset, - ) - - for (const organizationToSync of filteredOrganizations) { - this.log.info( - `Syncing organization ${organizationToSync.id} to ${integration.platform} remote!`, - ) - - let syncRemote = await this.organizationRepo.findSyncRemote( - organizationToSync.id, - integration.id, - automation.id, - ) - - // member isn't marked yet, mark it - if (!syncRemote) { - syncRemote = await this.organizationRepo.markOrganizationForSyncing({ - integrationId: integration.id, - organizationId: organizationToSync.id, - metaData: null, - syncFrom: automation.id, - }) - } - - const organization = await this.organizationRepo.findOrganization( - organizationToSync.id, - tenantId, - integration.segmentId, - ) - - if (syncRemote.sourceId) { - // organization.attributes = { - // ...organization.attributes, - // sourceId: { - // ...(organization.attributes.sourceId || {}), - // [integration.platform]: syncRemote.sourceId, - // }, - // } - organizationsToUpdate.push(organization) - } else { - organizationsToCreate.push(organization) - } - } - - const service = singleOrDefault( - INTEGRATION_SERVICES, - (s) => s.type === integration.platform, - ) - - if (service.processSyncRemote) { - const context: IIntegrationProcessRemoteSyncContext = { - integration, - log: this.log, - serviceSettings: { - nangoId: `${tenantId}-${integration.platform}`, - nangoUrl: NANGO_CONFIG().url, - nangoSecretKey: NANGO_CONFIG().secretKey, - }, - tenantId, - } - - const { created, updated } = await service.processSyncRemote( - organizationsToCreate, - organizationsToUpdate, - Entity.ORGANIZATIONS, - context, - ) - - for (const newOrganization of created as IBatchCreateOrganizationsResult[]) { - await this.organizationRepo.setIntegrationSourceId( - newOrganization.organizationId, - integration.id, - newOrganization.sourceId, - ) - - await this.organizationRepo.setLastSyncedAt( - newOrganization.organizationId, - integration.id, - newOrganization.lastSyncedPayload, - ) - } - - for (const updatedOrganization of updated as IBatchUpdateOrganizationsResult[]) { - await this.organizationRepo.setLastSyncedAt( - updatedOrganization.organizationId, - integration.id, - updatedOrganization.lastSyncedPayload, - ) - } - - if (syncOrganizationMembers) { - organizationsIdsSyncedToReturn.push(...organizationsToCreate.map((o) => o.id)) - organizationsIdsSyncedToReturn.push(...organizationsToUpdate.map((o) => o.id)) - } - } else { - this.log.warn(`Integration ${integration.platform} has no processSyncRemote function!`) - } - } while (filteredOrganizations.length > 0) - - await this.automationExecutionRepo.addExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - state: 'success', - payload: { - type: automation.type, - trigger: automation.trigger, - }, - error: null, - }) - } catch (e) { - await this.automationExecutionRepo.addExecution({ - automationId: automation.id, - type: automation.type, - trigger: automation.trigger, - tenantId: automation.tenantId, - state: 'error', - payload: { - type: automation.type, - trigger: automation.trigger, - }, - error: JSON.stringify(e), - }) - throw e - } - - return syncOrganizationMembers ? organizationsIdsSyncedToReturn : [] - } -} diff --git a/services/apps/integration_sync_worker/src/types.ts b/services/apps/integration_sync_worker/src/types.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/apps/integration_sync_worker/tsconfig.json b/services/apps/integration_sync_worker/tsconfig.json deleted file mode 100644 index bf7f183850..0000000000 --- a/services/apps/integration_sync_worker/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../base.tsconfig.json", - "include": ["src/**/*"] -} diff --git a/services/libs/common/src/i18n/en.ts b/services/libs/common/src/i18n/en.ts index 4c83b7581b..0f8791abb4 100644 --- a/services/libs/common/src/i18n/en.ts +++ b/services/libs/common/src/i18n/en.ts @@ -156,9 +156,6 @@ const en = { 'Can not trigger nboarding because integration is not in state pending-action!', noOrganizationFound: 'No organization found for given id!', }, - hubspot: { - notInPlan: 'Hubspot integration requires Scale plan.', - }, members: { activeList: { activityTimestampFrom: 'activityTimestampFrom is required query parameter!', @@ -215,11 +212,6 @@ const en = { discourse: 'Discourse', }, }, - automation: { - errors: { - planLimitExceeded: 'You have exceeded # of automations you can have in your plan.', - }, - }, eagleEye: { errors: { planLimitExceeded: diff --git a/services/libs/common_services/src/services/emitters/index.ts b/services/libs/common_services/src/services/emitters/index.ts index cdb07551dc..51a995b3f0 100644 --- a/services/libs/common_services/src/services/emitters/index.ts +++ b/services/libs/common_services/src/services/emitters/index.ts @@ -1,5 +1,4 @@ export * from './dataSinkWorker.emitter' export * from './integrationRunWorker.emitter' export * from './integrationStreamWorker.emitter' -export * from './integrationSyncWorker.emitter' export * from './searchSyncWorker.emitter' diff --git a/services/libs/common_services/src/services/emitters/integrationSyncWorker.emitter.ts b/services/libs/common_services/src/services/emitters/integrationSyncWorker.emitter.ts deleted file mode 100644 index 9017fbaad3..0000000000 --- a/services/libs/common_services/src/services/emitters/integrationSyncWorker.emitter.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { Logger } from '@crowd/logging' -import { CrowdQueue, IQueue } from '@crowd/queue' -import { RedisClient } from '@crowd/redis' -import { - AutomationSyncTrigger, - IIntegrationSyncWorkerEmitter, - IntegrationSyncWorkerQueueMessageType, -} from '@crowd/types' - -import { QueuePriorityContextLoader, QueuePriorityService } from '../priority.service' - -export class IntegrationSyncWorkerEmitter - extends QueuePriorityService - implements IIntegrationSyncWorkerEmitter -{ - public constructor( - client: IQueue, - redis: RedisClient, - priorityLevelCalculationContextLoader: QueuePriorityContextLoader, - parentLog: Logger, - ) { - super( - CrowdQueue.INTEGRATION_SYNC_WORKER, - client.getQueueChannelConfig(CrowdQueue.INTEGRATION_SYNC_WORKER), - client, - redis, - priorityLevelCalculationContextLoader, - parentLog, - ) - } - - public async triggerSyncMarkedMembers(tenantId: string, integrationId: string): Promise { - if (!tenantId) { - throw new Error('tenantId is required!') - } - if (!integrationId) { - throw new Error('integrationId is required!') - } - await this.sendMessage( - tenantId, - integrationId, - { - type: IntegrationSyncWorkerQueueMessageType.SYNC_ALL_MARKED_MEMBERS, - tenantId, - integrationId, - }, - integrationId, - ) - } - - public async triggerSyncMember( - tenantId: string, - integrationId: string, - memberId: string, - syncRemoteId: string, - ): Promise { - if (!tenantId) { - throw new Error('tenantId is required!') - } - if (!integrationId) { - throw new Error('integrationId is required!') - } - - if (!memberId) { - throw new Error('memberId is required!') - } - - if (!syncRemoteId) { - throw new Error('syncRemoteId is required!') - } - - await this.sendMessage( - tenantId, - memberId, - { - type: IntegrationSyncWorkerQueueMessageType.SYNC_MEMBER, - tenantId, - integrationId, - memberId, - syncRemoteId, - }, - memberId, - ) - } - - public async triggerOnboardAutomation( - tenantId: string, - integrationId: string, - automationId: string, - automationTrigger: AutomationSyncTrigger, - ): Promise { - if (!tenantId) { - throw new Error('tenantId is required!') - } - if (!automationId) { - throw new Error('automationId is required!') - } - if (!integrationId) { - throw new Error('integrationId is required!') - } - await this.sendMessage( - tenantId, - automationId, - { - type: IntegrationSyncWorkerQueueMessageType.ONBOARD_AUTOMATION, - tenantId, - integrationId, - automationId, - automationTrigger, - }, - automationId, - ) - } - - public async triggerSyncMarkedOrganizations( - tenantId: string, - integrationId: string, - ): Promise { - if (!tenantId) { - throw new Error('tenantId is required!') - } - if (!integrationId) { - throw new Error('integrationId is required!') - } - await this.sendMessage( - tenantId, - integrationId, - { - type: IntegrationSyncWorkerQueueMessageType.SYNC_ALL_MARKED_ORGANIZATIONS, - tenantId, - integrationId, - }, - integrationId, - ) - } - - public async triggerSyncOrganization( - tenantId: string, - integrationId: string, - organizationId: string, - syncRemoteId: string, - ): Promise { - if (!tenantId) { - throw new Error('tenantId is required!') - } - if (!integrationId) { - throw new Error('integrationId is required!') - } - - if (!syncRemoteId) { - throw new Error('syncRemoteId is required!') - } - - await this.sendMessage( - tenantId, - organizationId, - { - type: IntegrationSyncWorkerQueueMessageType.SYNC_ORGANIZATION, - tenantId, - integrationId, - organizationId, - syncRemoteId, - }, - organizationId, - ) - } -} diff --git a/services/libs/data-access-layer/src/old/apps/automations_worker/automation.repo.ts b/services/libs/data-access-layer/src/old/apps/automations_worker/automation.repo.ts deleted file mode 100644 index ef9da6f6ed..0000000000 --- a/services/libs/data-access-layer/src/old/apps/automations_worker/automation.repo.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { generateUUIDv1 } from '@crowd/common' -import { DbColumnSet, DbStore, RepositoryBase } from '@crowd/database' -import { Logger } from '@crowd/logging' -import { - AutomationExecutionState, - AutomationSettings, - AutomationState, - AutomationSyncTrigger, - AutomationTrigger, - AutomationType, -} from '@crowd/types' - -export interface IRelevantAutomationData { - id: string - tenantId: string - type: AutomationType - settings: AutomationSettings - trigger: AutomationTrigger - slackWebHook: string | null - createdAt: string -} - -export interface IDbAutomationExecutionInsertData { - automationId: string - type: AutomationType - tenantId: string - trigger: AutomationTrigger | AutomationSyncTrigger - state: AutomationExecutionState - error: unknown | null - executedAt: Date - eventId: string - payload: unknown -} - -export class AutomationRepository extends RepositoryBase { - private insertExecutionColumnSet: DbColumnSet - - constructor(dbStore: DbStore, parentLog: Logger) { - super(dbStore, parentLog) - - this.insertExecutionColumnSet = new this.dbInstance.helpers.ColumnSet( - [ - 'id', - 'automationId', - 'type', - 'tenantId', - 'trigger', - 'state', - 'error', - 'executedAt', - 'eventId', - 'payload', - ], - { - table: { - table: 'automationExecutions', - }, - }, - ) - } - - async get(automationId: string): Promise { - const result = await this.db().oneOrNone( - ` - select a.id, - a."tenantId", - a.type, - a.trigger, - a.settings, - s."slackWebHook" - from automations a - inner join settings s on s."tenantId" = a."tenantId" - where a.id = $(automationId) - `, - { - automationId, - }, - ) - - return result - } - - async findRelevant( - tenantId: string, - trigger: AutomationTrigger, - state: AutomationState, - ): Promise { - const results = await this.db().any( - ` - select a.id, - a."tenantId", - a.type, - a.trigger, - a.settings, - s."slackWebHook", - a."createdAt" - from automations a - inner join settings s on s."tenantId" = a."tenantId" - where a."tenantId" = $(tenantId) and a.trigger = $(trigger) and a.state = $(state) - `, - { - tenantId, - trigger, - state, - }, - ) - - return results - } - - async hasAlreadyBeenTriggered(automationId: string, eventId: string): Promise { - const query = ` - select id - from "automationExecutions" - where "automationId" = $(automationId) - and "eventId" = $(eventId) - and state = '${AutomationExecutionState.SUCCESS}'; - ` - - const results = await this.db().any(query, { - automationId, - eventId, - }) - - return results.length > 0 - } - - async createExecution(data: IDbAutomationExecutionInsertData): Promise { - const id = generateUUIDv1() - const prepared = RepositoryBase.prepare({ id, ...data }, this.insertExecutionColumnSet) - const query = this.dbInstance.helpers.insert(prepared, this.insertExecutionColumnSet) - await this.db().none(query) - } -} diff --git a/services/libs/data-access-layer/src/old/apps/integration_run_worker/automation.repo.ts b/services/libs/data-access-layer/src/old/apps/integration_run_worker/automation.repo.ts deleted file mode 100644 index def38980a1..0000000000 --- a/services/libs/data-access-layer/src/old/apps/integration_run_worker/automation.repo.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { DbStore, RepositoryBase } from '@crowd/database' -import { Logger } from '@crowd/logging' -import { AutomationSyncTrigger, IAutomationData } from '@crowd/types' - -export class AutomationRepository extends RepositoryBase { - constructor(dbStore: DbStore, parentLog: Logger) { - super(dbStore, parentLog) - } - - public async findSyncAutomations( - tenantId: string, - platform: string, - ): Promise { - const pageSize = 10 - const syncAutomations: IAutomationData[] = [] - - let results - let offset - - do { - offset = results ? pageSize + offset : 0 - results = await this.db().any( - `select * from automations - where type = $(platform) and "tenantId" = $(tenantId) and trigger in ($(syncAutomationTriggers:csv)) - limit $(limit) offset $(offset)`, - { - tenantId, - platform, - syncAutomationTriggers: [ - AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH, - AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH, - ], - limit: pageSize, - offset, - }, - ) - - syncAutomations.push(...results) - } while (results.length > 0) - - return syncAutomations - } -} diff --git a/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automation.repo.ts b/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automation.repo.ts deleted file mode 100644 index 5fa898c00a..0000000000 --- a/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automation.repo.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DbStore, RepositoryBase } from '@crowd/database' -import { Logger } from '@crowd/logging' -import { IAutomationData } from '@crowd/types' - -export class AutomationRepository extends RepositoryBase { - constructor(dbStore: DbStore, parentLog: Logger) { - super(dbStore, parentLog) - } - - public async findById(id: string): Promise { - return await this.db().oneOrNone(`select * from automations where id = $(id)`, { id }) - } -} diff --git a/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo.ts b/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo.ts deleted file mode 100644 index 1403275feb..0000000000 --- a/services/libs/data-access-layer/src/old/apps/integration_sync_worker/automationExecution.repo.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { generateUUIDv1 as uuid } from '@crowd/common' -import { DbStore, RepositoryBase } from '@crowd/database' -import { Logger } from '@crowd/logging' -import { IAutomationExecution } from '@crowd/types' - -export class AutomationExecutionRepository extends RepositoryBase { - constructor(dbStore: DbStore, parentLog: Logger) { - super(dbStore, parentLog) - } - - public async addExecution(data: IAutomationExecution): Promise { - await this.db().none( - `insert into "automationExecutions" ("id", "automationId", "type", "tenantId", "trigger", "state", "error", "executedAt", "eventId", "payload") - values - ($(id), $(automationId), $(type), $(tenantId), $(trigger), $(state), $(error), now(), $(eventId), $(payload))`, - { - id: uuid(), - automationId: data.automationId, - type: data.type, - tenantId: data.tenantId, - trigger: data.trigger, - state: data.state, - error: data.error || null, - eventId: data.eventId || uuid(), - payload: JSON.stringify(data.payload) || JSON.stringify({}), - }, - ) - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/addContactsToList.ts b/services/libs/integrations/src/integrations/hubspot/api/addContactsToList.ts deleted file mode 100644 index c0ef1650e9..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/addContactsToList.ts +++ /dev/null @@ -1,36 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' - -export const addContactsToList = async ( - nangoId: string, - listId: string, - contactIds: string[], - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'post', - url: `https://api.hubapi.com/contacts/v1/lists/${listId}/add`, - data: {}, - } - try { - ctx.log.debug({ nangoId }, `Adding contacts to list ${listId} in HubSpot!`) - - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - config.headers = { Authorization: `Bearer ${accessToken}` } - - config.data = { - vids: contactIds, - } - - await throttler.throttle(() => axios(config)) - } catch (err) { - ctx.log.error({ err }, `Error while adding contacts to hubspot list!`) - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/batchCreateMembers.ts b/services/libs/integrations/src/integrations/hubspot/api/batchCreateMembers.ts deleted file mode 100644 index ca105c6c31..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/batchCreateMembers.ts +++ /dev/null @@ -1,178 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { IMember, MemberIdentityType, PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotMemberFieldMapper } from '../field-mapper/memberFieldMapper' - -import { batchUpdateMembers } from './batchUpdateMembers' -import { getContactById } from './contactById' -import { IBatchCreateMembersResult } from './types' - -export const batchCreateMembers = async ( - nangoId: string, - members: IMember[], - memberMapper: HubspotMemberFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'post', - url: `https://api.hubapi.com/crm/v3/objects/contacts/batch/create`, - data: {}, - headers: { - Authorization: '', - }, - } - - try { - const hubspotMembers = [] - - for (const member of members) { - const primaryEmail = - member.identities.filter((i) => i.type === MemberIdentityType.EMAIL && i.verified).length > - 0 - ? member.identities.find((i) => i.type === MemberIdentityType.EMAIL && i.verified)?.value - : null - - if (!primaryEmail) { - ctx.log.warn( - `Member ${member.id} can't be created in hubspot! Member doesn't have any associated email.`, - ) - } else { - const hsMember = { - properties: { - email: primaryEmail, - }, - } as any - - const fields = memberMapper.getAllCrowdFields() - - for (const crowdField of fields) { - const hubspotField = memberMapper.getHubspotFieldName(crowdField) - // if hubspot e-mail field is mapped to a crowd field, we should ignore it because - // we handle this manually above - if (hubspotField && hubspotField !== 'email') { - if (crowdField.startsWith('attributes')) { - const attributeName = crowdField.split('.')[1] || null - - if ( - attributeName && - hubspotField && - member.attributes[attributeName]?.default !== undefined - ) { - hsMember.properties[hubspotField] = member.attributes[attributeName].default - } - } else if (crowdField.startsWith('identities')) { - const identityPlatform = crowdField.split('.')[1] || null - - const identityFound = member.identities.find( - (i) => i.platform === identityPlatform && i.type === MemberIdentityType.USERNAME, - ) - - if (identityPlatform && hubspotField && identityFound) { - hsMember.properties[hubspotField] = identityFound.value - } - } else if (crowdField === 'organizationName') { - // send latest org of member as value - } else if (hubspotField && member[crowdField] !== undefined) { - hsMember.properties[hubspotField] = memberMapper.getHubspotValue(member, crowdField) - } - } - } - - if (Object.keys(hsMember.properties).length > 0) { - hubspotMembers.push(hsMember) - } - } - } - - config.data = { - inputs: hubspotMembers, - } - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ nangoId, accessToken, data: config.data }, 'Creating bulk contacts in HubSpot') - - config.headers.Authorization = `Bearer ${accessToken}` - - const result = await throttler.throttle(() => axios(config)) - - // return hubspot ids back to sync worker for saving - return result.data.results.reduce((acc, m) => { - const member = members.find( - (crowdMember) => - crowdMember.identities.filter((i) => i.type === MemberIdentityType.EMAIL && i.verified) - .length > 0 && - crowdMember.identities - .filter((i) => i.type === MemberIdentityType.EMAIL && i.verified) - .map((i) => i.value) - .includes(m.properties.email), - ) - - const hubspotPayload = hubspotMembers.find( - (hubspotMember) => hubspotMember.properties.email === m.properties.email, - ) - - acc.push({ - memberId: member.id, - sourceId: m.id, - lastSyncedPayload: hubspotPayload, - }) - return acc - }, []) - } catch (err) { - // this means that member actually exists in hubspot but we tried re-creating it - // handle it gracefully - if (err.response?.data?.category === 'CONFLICT') { - ctx.log.info( - { err }, - 'Conflict while batch create contacts in HubSpot. Trying to resolve the conflicts.', - ) - const match = err.response?.data?.message.match(/ID: (\d+)/) - const id = match ? match[1] : null - if (id) { - const member = await getContactById(nangoId, id, memberMapper, ctx, throttler) - - if (member) { - // exclude found member from batch payload - const createMembers = members.filter( - (m) => - !m.identities - .filter((i) => i.type === MemberIdentityType.EMAIL && i.verified) - .map((i) => i.value.toLowerCase()) - .includes((member.properties as any).email.toLowerCase()), - ) - - const updateMembers = members - .filter((m) => - m.identities - .filter((i) => i.type === MemberIdentityType.EMAIL && i.verified) - .map((i) => i.value.toLowerCase()) - .includes((member.properties as any).email.toLowerCase()), - ) - .map((m) => { - m.attributes = { - ...m.attributes, - sourceId: { - hubspot: id, - }, - } - return m - }) - - await batchUpdateMembers(nangoId, updateMembers, memberMapper, ctx, throttler) - return await batchCreateMembers(nangoId, createMembers, memberMapper, ctx, throttler) - } - } - } else { - ctx.log.error({ err }, 'Error while batch create contacts to HubSpot') - throw err - } - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/batchCreateOrganizations.ts b/services/libs/integrations/src/integrations/hubspot/api/batchCreateOrganizations.ts deleted file mode 100644 index 59e91d62a2..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/batchCreateOrganizations.ts +++ /dev/null @@ -1,167 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { IOrganization, OrganizationIdentityType, PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotOrganizationFieldMapper } from '../field-mapper/organizationFieldMapper' - -import { IBatchCreateOrganizationsResult } from './types' -import { getOrganizationDomain } from './utils/getOrganizationDomain' - -export const batchCreateOrganizations = async ( - nangoId: string, - organizations: IOrganization[], - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'post', - url: `https://api.hubapi.com/crm/v3/objects/companies/batch/create`, - data: {}, - headers: { - Authorization: '', - }, - } - - try { - const hubspotCompanies = [] - - for (const organization of organizations) { - const verifiedPrimaryDomains = organization.identities.filter( - (i) => i.type === OrganizationIdentityType.PRIMARY_DOMAIN && i.verified, - ) - const domains = verifiedPrimaryDomains - .map((i) => getOrganizationDomain(i.value)) - .filter((i) => i !== null) - - if (domains.length === 0) { - ctx.log.info( - `Organization ${organization.id} can't be created in hubspot! Organization doesn't have any associated website or domain can't be derived from existing website.`, - ) - } else { - const organizationDomain = domains[0] - - const hubspotCompany = { - properties: { - domain: organizationDomain, - }, - } as any - - const fields = organizationMapper.getAllCrowdFields() - - for (const crowdField of fields) { - const hubspotField = organizationMapper.getHubspotFieldName(crowdField) - // if hubspot domain field is mapped to a crowd field, we should ignore it - // because we handle this manually above - if (hubspotField && hubspotField !== 'domain') { - if (organization[crowdField] !== undefined) { - hubspotCompany.properties[hubspotField] = organizationMapper.getHubspotValue( - organization, - crowdField, - ) - } - } - } - - if (Object.keys(hubspotCompany.properties).length > 0) { - hubspotCompanies.push(hubspotCompany) - } - } - } - - config.data = { - inputs: hubspotCompanies, - } - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug( - { nangoId, accessToken, data: config.data }, - 'Creating bulk companies in HubSpot!', - ) - - config.headers.Authorization = `Bearer ${accessToken}` - - const result = await throttler.throttle(() => axios(config)) - - // return hubspot ids back to sync worker for saving - return result.data.results.reduce((acc, o) => { - const organization = organizations.find((crowdOrganization) => { - const domains = crowdOrganization.identities - .filter((i) => i.type === OrganizationIdentityType.PRIMARY_DOMAIN && i.verified) - .map((i) => getOrganizationDomain(i.value)) - .filter((i) => i !== null) - return domains.includes(o.properties.domain) - }) - - const hubspotPayload = hubspotCompanies.find( - (hubspotCompany) => hubspotCompany.properties.domain === o.properties.domain, - ) - - acc.push({ - organizationId: organization.id, - sourceId: o.id, - lastSyncedPayload: hubspotPayload, - }) - - return acc - }, []) - } catch (err) { - // this means that organization actually exists in hubspot but we tried re-creating it - // handle it gracefully - if (err.response?.data?.category === 'CONFLICT') { - ctx.log.warn( - { err }, - 'Conflict while batch create companies in HubSpot. Trying to resolve the conflicts.', - ) - // TODO uros fix this - // const match = err.response?.data?.message.match(/ID: (\d+)/) - // const id = match ? match[1] : null - // if (id) { - // const organization = await getCompanyById(nangoId, id, organizationMapper, ctx, throttler) - - // if (organization) { - // // exclude found organization from batch payload - // const createOrganizations = organizations.filter( - // (o) => !o.website.includes((organization.properties as any).domain), - // ) - - // const updateOrganizations = organizations - // .filter((o) => o.website.includes((organization.properties as any).domain)) - // .map((o) => { - // o.attributes = { - // ...o.attributes, - // sourceId: { - // hubspot: id, - // }, - // } - // return o - // }) - - // await batchUpdateOrganizations( - // nangoId, - // updateOrganizations, - // organizationMapper, - // ctx, - // throttler, - // ) - // return await batchCreateOrganizations( - // nangoId, - // createOrganizations, - // organizationMapper, - // ctx, - // throttler, - // ) - // } - // } - } else { - ctx.log.error({ err }, 'Error while batch create companies to HubSpot') - throw err - } - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/batchUpdateMembers.ts b/services/libs/integrations/src/integrations/hubspot/api/batchUpdateMembers.ts deleted file mode 100644 index a44b602301..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/batchUpdateMembers.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { IMember, MemberIdentityType, PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotMemberFieldMapper } from '../field-mapper/memberFieldMapper' - -import { IBatchUpdateMembersResult } from './types' - -export const batchUpdateMembers = async ( - nangoId: string, - members: IMember[], - memberMapper: HubspotMemberFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'post', - url: `https://api.hubapi.com/crm/v3/objects/contacts/batch/update`, - data: {}, - headers: { - Authorization: '', - }, - } - - try { - const hubspotMembers = [] - - for (const member of members) { - if (member) { - const hubspotSourceId = member.attributes?.sourceId?.hubspot - - if (!hubspotSourceId) { - ctx.log.warn( - `Member ${member.id} can't be updated in hubspot! Member doesn't have a hubspot sourceId in attributes.`, - ) - } else { - const hsMember = { - id: hubspotSourceId, - properties: {}, - } as any - - const fields = memberMapper.getAllCrowdFields() - - for (const crowdField of fields) { - const hubspotField = memberMapper.getHubspotFieldName(crowdField) - // if hubspot e-mail field is mapped to a crowd field, we should ignore it because - // we handle this manually above - if (hubspotField && hubspotField !== 'email') { - if (crowdField.startsWith('attributes')) { - const attributeName = crowdField.split('.')[1] || null - - if ( - attributeName && - hubspotField && - member.attributes[attributeName]?.default !== undefined - ) { - hsMember.properties[hubspotField] = member.attributes[attributeName].default - } - } else if (crowdField.startsWith('identities')) { - const identityPlatform = crowdField.split('.')[1] || null - - const identityFound = member.identities.find( - (i) => i.platform === identityPlatform && i.type === MemberIdentityType.USERNAME, - ) - - if (identityPlatform && hubspotField && identityFound) { - hsMember.properties[hubspotField] = identityFound.value - } - } else if (crowdField === 'organizationName') { - // send latest org of member as value - } else if (hubspotField && member[crowdField] !== undefined) { - hsMember.properties[hubspotField] = memberMapper.getHubspotValue(member, crowdField) - } - } - } - - if (Object.keys(hsMember.properties).length > 0) { - hubspotMembers.push(hsMember) - } - } - } - } - - config.data = { - inputs: hubspotMembers, - } - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ nangoId, accessToken, data: config.data }, 'Updating bulk contacts in HubSpot') - - config.headers.Authorization = `Bearer ${accessToken}` - - const result = await throttler.throttle(() => axios(config)) - - return result.data.results.reduce((acc, m) => { - const member = members.find( - (crowdMember) => crowdMember.attributes?.sourceId?.hubspot === m.id, - ) - - const hubspotPayload = hubspotMembers.find((hubspotMember) => hubspotMember.id === m.id) - - acc.push({ - memberId: member.id, - sourceId: m.id, - lastSyncedPayload: hubspotPayload, - }) - return acc - }, []) - } catch (err) { - ctx.log.error({ err }, 'Error while batch update contacts to HubSpot') - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/batchUpdateOrganizations.ts b/services/libs/integrations/src/integrations/hubspot/api/batchUpdateOrganizations.ts deleted file mode 100644 index 1063862689..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/batchUpdateOrganizations.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { IOrganization, PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotOrganizationFieldMapper } from '../field-mapper/organizationFieldMapper' - -import { IBatchUpdateOrganizationsResult } from './types' - -export const batchUpdateOrganizations = async ( - nangoId: string, - organizations: IOrganization[], - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'post', - url: `https://api.hubapi.com/crm/v3/objects/companies/batch/update`, - data: {}, - headers: { - Authorization: '', - }, - } - - try { - const hubspotCompanies = [] - - for (const organization of organizations) { - if (organization) { - // const hubspotSourceId = organization.attributes?.sourceId?.hubspot - const hubspotSourceId = undefined - - if (!hubspotSourceId) { - ctx.log.warn( - `Organization ${organization.id} can't be updated in hubspot! Organization doesn't have a hubspot sourceId.`, - ) - } else { - const hubspotCompany = { - id: hubspotSourceId, - properties: {}, - } as any - - const fields = organizationMapper.getAllCrowdFields() - - for (const crowdField of fields) { - const hubspotField = organizationMapper.getHubspotFieldName(crowdField) - // if hubspot domain field is mapped to a crowd field, we should ignore it - // because we handle this manually above - if (hubspotField && hubspotField !== 'domain') { - if (organization[crowdField] !== undefined) { - hubspotCompany.properties[hubspotField] = organizationMapper.getHubspotValue( - organization, - crowdField, - ) - } - } - } - - if (Object.keys(hubspotCompany.properties).length > 0) { - hubspotCompanies.push(hubspotCompany) - } - } - } - } - - config.data = { - inputs: hubspotCompanies, - } - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ nangoId, accessToken, data: config.data }, 'Updating bulk companies in HubSpot') - - config.headers.Authorization = `Bearer ${accessToken}` - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const result = await throttler.throttle(() => axios(config)) - - // return result.data.results.reduce((acc, o) => { - // const organization = organizations.find( - // (crowdOrganization) => crowdOrganization.attributes?.sourceId?.hubspot === o.id, - // ) - - // const hubspotPayload = hubspotCompanies.find((hubspotCompany) => hubspotCompany.id === o.id) - - // acc.push({ - // organizationId: organization.id, - // sourceId: o.id, - // lastSyncedPayload: hubspotPayload, - // }) - - // return acc - // }, []) - return [] - } catch (err) { - ctx.log.error({ err }, 'Error while batch update companies in HubSpot') - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/common.ts b/services/libs/integrations/src/integrations/hubspot/api/common.ts deleted file mode 100644 index 4d2bce6999..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/common.ts +++ /dev/null @@ -1 +0,0 @@ -export const HUBSPOT_API_PAGE_SIZE = 50 diff --git a/services/libs/integrations/src/integrations/hubspot/api/companies.ts b/services/libs/integrations/src/integrations/hubspot/api/companies.ts deleted file mode 100644 index 598cc5940a..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/companies.ts +++ /dev/null @@ -1,100 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotOrganizationFieldMapper } from '../field-mapper/organizationFieldMapper' -import { IHubspotContact, IHubspotObject } from '../types' - -import { HUBSPOT_API_PAGE_SIZE } from './common' -import { IPaginatedResponse } from './types' - -export const getCompanies = async ( - nangoId: string, - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, - after?: string, -): Promise> => { - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/objects/companies`, - params: { - limit: HUBSPOT_API_PAGE_SIZE, - properties: `name,domain,${organizationMapper.getAllHubspotFields().join(',')}`, - }, - headers: { - Authorization: '', - }, - } - - // If we're not onboarding, only get data that was updated in last 8 hours - if (!ctx.onboarding) { - const date = new Date() - date.setHours(date.getHours() - 8) - - config.params.filterGroups = JSON.stringify([ - { - filters: [ - { - value: date.getTime(), - propertyName: 'hs_lastmodifieddate', - operator: 'GT', - }, - ], - }, - ]) - } - - try { - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ nangoId, accessToken }, 'Fetching contacts from HubSpot') - - config.headers.Authorization = `Bearer ${accessToken}` - - // set pagination - config.params.after = after - - const result = await throttler.throttle(() => axios(config)) - - const elements = result.data.results as IHubspotObject[] - - if (result.data.paging?.next?.after) { - return { - elements, - after: result.data.paging.next.after, - } - } - - return { - elements, - } - } catch (err) { - ctx.log.error({ err }, 'Error while fetching companies from HubSpot') - throw err - } -} - -export async function* getAllCompanies( - nangoId: string, - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): AsyncGenerator { - let hasNextPage = true - let after = undefined - - while (hasNextPage) { - const response = await getCompanies(nangoId, organizationMapper, ctx, throttler, after) - - hasNextPage = response.after !== undefined - - after = response.after - - yield response.elements - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/companyById.ts b/services/libs/integrations/src/integrations/hubspot/api/companyById.ts deleted file mode 100644 index ef5e94efe1..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/companyById.ts +++ /dev/null @@ -1,52 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotOrganizationFieldMapper } from '../field-mapper/organizationFieldMapper' -import { IHubspotObject } from '../types' - -export const getCompanyById = async ( - nangoId: string, - companyId: string, - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/objects/companies/${companyId}`, - params: { - limit: 1, - properties: `name,domain,${organizationMapper.getAllHubspotFields().join(',')}`, - }, - headers: { - Authorization: '', - }, - } - - try { - ctx.log.debug({ nangoId, companyId }, 'Fetching company by id from HubSpot') - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ accessToken }, `nango token`) - config.headers.Authorization = `Bearer ${accessToken}` - - const result = await throttler.throttle(() => axios(config)) - - const element = result.data - - if (!element) { - return null - } - - return element - } catch (err) { - ctx.log.error({ err }, 'Error while fetching contacts from HubSpot') - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/contactAssociations.ts b/services/libs/integrations/src/integrations/hubspot/api/contactAssociations.ts deleted file mode 100644 index 96feb5519f..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/contactAssociations.ts +++ /dev/null @@ -1,40 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotAssociationType, HubspotEndpoint, IHubspotAssociation } from '../types' - -export const getContactAssociations = async ( - nangoId: string, - association: HubspotEndpoint, - type: HubspotAssociationType, - contactId: string, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/objects/contacts/${contactId}/associations/${association}`, - } - try { - ctx.log.debug( - { nangoId }, - `Fetching contact associations [${association}] of contact ${contactId} from HubSpot`, - ) - - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - config.headers = { Authorization: `Bearer ${accessToken}` } - - const result = await throttler.throttle(() => axios(config)) - - const contactAssociations: IHubspotAssociation[] = result?.data?.results || [] - - return contactAssociations.filter((a) => a.type === type) - } catch (err) { - ctx.log.error({ err }, `Error while getting hubspot contact associations [${association}]`) - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/contactById.ts b/services/libs/integrations/src/integrations/hubspot/api/contactById.ts deleted file mode 100644 index 415e2f96e1..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/contactById.ts +++ /dev/null @@ -1,52 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotMemberFieldMapper } from '../field-mapper/memberFieldMapper' -import { IHubspotObject } from '../types' - -export const getContactById = async ( - nangoId: string, - contactId: string, - memberMapper: HubspotMemberFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, -): Promise => { - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/objects/contacts/${contactId}`, - params: { - limit: 1, - properties: `email,${memberMapper.getAllHubspotFields().join(',')}`, - }, - headers: { - Authorization: '', - }, - } - - try { - ctx.log.debug({ nangoId, contactId }, 'Fetching contact by id from HubSpot') - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ accessToken }, `nango token`) - config.headers.Authorization = `Bearer ${accessToken}` - - const result = await throttler.throttle(() => axios(config)) - - const element = result.data - - if (!element) { - return null - } - - return element - } catch (err) { - ctx.log.error({ err }, 'Error while fetching contacts from HubSpot') - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/contacts.ts b/services/libs/integrations/src/integrations/hubspot/api/contacts.ts deleted file mode 100644 index cc8d34361c..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/contacts.ts +++ /dev/null @@ -1,147 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { RequestThrottler } from '@crowd/common' -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotMemberFieldMapper } from '../field-mapper/memberFieldMapper' -import { HubspotOrganizationFieldMapper } from '../field-mapper/organizationFieldMapper' -import { HubspotAssociationType, HubspotEndpoint, IHubspotContact, IHubspotObject } from '../types' - -import { HUBSPOT_API_PAGE_SIZE } from './common' -import { getCompanyById } from './companyById' -import { getContactAssociations } from './contactAssociations' -import { IPaginatedResponse } from './types' - -export const getContacts = async ( - nangoId: string, - memberMapper: HubspotMemberFieldMapper, - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, - includeOrganizations = false, - after?: string, -): Promise> => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/objects/contacts`, - params: { - limit: HUBSPOT_API_PAGE_SIZE, - properties: `email,${memberMapper.getAllHubspotFields().join(',')}`, - }, - headers: { - Authorization: '', - }, - } - - // If we're not onboarding, only get data that was updated in last 8 hours - if (!ctx.onboarding) { - const date = new Date() - date.setHours(date.getHours() - 8) - - config.params.filterGroups = JSON.stringify([ - { - filters: [ - { - value: date.getTime(), - propertyName: 'hs_lastmodifieddate', - operator: 'GT', - }, - ], - }, - ]) - } - - try { - ctx.log.debug({ nangoId }, 'Fetching contacts from HubSpot') - - // Get an access token from Nango - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx, throttler) - - ctx.log.debug({ accessToken }, `nango token`) - config.headers.Authorization = `Bearer ${accessToken}` - - // set pagination - config.params.after = after - - const result = await throttler.throttle(() => axios(config)) - - const elements = result.data.results as IHubspotContact[] - - if (includeOrganizations) { - for (const element of elements) { - // check association - const companyAssociations = await getContactAssociations( - nangoId, - HubspotEndpoint.COMPANIES, - HubspotAssociationType.CONTACT_TO_COMPANY, - element.id, - ctx, - throttler, - ) - - if (companyAssociations.length > 0) { - // get company - const company = await getCompanyById( - nangoId, - companyAssociations[0].id, - organizationMapper, - ctx, - throttler, - ) - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if ((company?.properties as any)?.name) { - element.organization = company - } - } - } - } - - if (result.data.paging?.next?.after) { - return { - elements, - after: result.data.paging.next.after, - } - } - - return { - elements, - } - } catch (err) { - ctx.log.error({ err }, 'Error while fetching contacts from HubSpot') - throw err - } -} - -export async function* getAllContacts( - nangoId: string, - memberMapper: HubspotMemberFieldMapper, - organizationMapper: HubspotOrganizationFieldMapper, - ctx: IProcessStreamContext | IGenerateStreamsContext, - throttler: RequestThrottler, - includeOrganizations = false, -): AsyncGenerator { - let hasNextPage = true - let after = undefined - - while (hasNextPage) { - const response = await getContacts( - nangoId, - memberMapper, - organizationMapper, - ctx, - throttler, - includeOrganizations, - after, - ) - - hasNextPage = response.after !== undefined - - after = response.after - - yield response.elements - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/lists.ts b/services/libs/integrations/src/integrations/hubspot/api/lists.ts deleted file mode 100644 index 0d9fff643c..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/lists.ts +++ /dev/null @@ -1,44 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { IHubspotList } from '../types' - -export const getLists = async ( - nangoId: string, - ctx: IProcessStreamContext | IGenerateStreamsContext, -): Promise => { - const PAGE_SIZE = 100 - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/contacts/v1/lists`, - } - try { - ctx.log.debug({ nangoId }, `Fetching lists from HubSpot`) - - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx) - config.headers = { Authorization: `Bearer ${accessToken}` } - - let response - let offset - const hubspotLists: IHubspotList[] = [] - - do { - offset = response === undefined ? 0 : response.offset - config.url = `https://api.hubapi.com/contacts/v1/lists?count=${PAGE_SIZE}&offset=${offset}` - - ctx.log.debug({ PAGE_SIZE, offset, url: config.url }, `Getting lists!`) - - response = (await axios(config)).data - - hubspotLists.push(...response.lists.filter((l) => l.dynamic !== true)) - } while (response[`has-more`] !== false) - - return hubspotLists - } catch (err) { - ctx.log.error({ err }, `Error while getting hubspot lists!`) - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/properties.ts b/services/libs/integrations/src/integrations/hubspot/api/properties.ts deleted file mode 100644 index 02eaf6d05b..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/properties.ts +++ /dev/null @@ -1,33 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { HubspotEndpoint, IHubspotProperty } from '../types' - -export const getProperties = async ( - nangoId: string, - endpoint: HubspotEndpoint, - ctx: IProcessStreamContext | IGenerateStreamsContext, -): Promise => { - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/crm/v3/properties/${endpoint}`, - } - try { - ctx.log.debug({ nangoId }, `Fetching ${endpoint} properties from HubSpot`) - - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx) - config.headers = { Authorization: `Bearer ${accessToken}` } - - const response = (await axios(config)).data - - const hubspotProperties: IHubspotProperty[] = response.results - - return hubspotProperties.filter((p) => !p.calculated && !p.modificationMetadata.readOnlyValue) - } catch (err) { - ctx.log.error({ err }, `Error while getting hubspot ${endpoint} properties!`) - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/tokenInfo.ts b/services/libs/integrations/src/integrations/hubspot/api/tokenInfo.ts deleted file mode 100644 index 6caf573e61..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/tokenInfo.ts +++ /dev/null @@ -1,30 +0,0 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import { PlatformType } from '@crowd/types' - -import { IGenerateStreamsContext, IProcessStreamContext } from '../../../types' -import { getNangoToken } from '../../nango' -import { IHubspotTokenInfo } from '../types' - -export const getTokenInfo = async ( - nangoId: string, - ctx: IProcessStreamContext | IGenerateStreamsContext, -): Promise => { - try { - ctx.log.debug({ nangoId }, 'Fetching custom properties from HubSpot') - - const accessToken = await getNangoToken(nangoId, PlatformType.HUBSPOT, ctx) - - const config: AxiosRequestConfig = { - method: 'get', - url: `https://api.hubapi.com/oauth/v1/access-tokens/${accessToken}`, - } - - const response: IHubspotTokenInfo = (await axios(config)).data - - return response - } catch (err) { - ctx.log.error({ err }, 'Error while getting hubspot token information!') - throw err - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/types.ts b/services/libs/integrations/src/integrations/hubspot/api/types.ts deleted file mode 100644 index 26f69af3dd..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface IPaginatedResponse { - elements: T[] - after?: string -} - -export interface IBatchCreateOrganizationsResult { - organizationId: string - sourceId: string - lastSyncedPayload: unknown -} - -export type IBatchUpdateOrganizationsResult = IBatchCreateOrganizationsResult - -export interface IBatchCreateMembersResult { - memberId: string - sourceId: string - lastSyncedPayload: unknown -} - -export type IBatchUpdateMembersResult = IBatchCreateMembersResult - -export interface IBatchOperationResult { - created: IBatchCreateMembersResult[] | IBatchCreateOrganizationsResult[] - updated: IBatchCreateMembersResult[] | IBatchCreateOrganizationsResult[] -} diff --git a/services/libs/integrations/src/integrations/hubspot/api/utils/getOrganizationDomain.ts b/services/libs/integrations/src/integrations/hubspot/api/utils/getOrganizationDomain.ts deleted file mode 100644 index 883ca1f40a..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/api/utils/getOrganizationDomain.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const getOrganizationDomain = (website: string): string => { - try { - if (website.startsWith('http')) { - return new URL(website).host - } - return website - } catch (e) { - return null - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/field-mapper/hubspotFieldMapper.ts b/services/libs/integrations/src/integrations/hubspot/field-mapper/hubspotFieldMapper.ts deleted file mode 100644 index 2538be0de7..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/field-mapper/hubspotFieldMapper.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { IMemberAttribute } from '@crowd/types' - -import { - HubspotEntity, - HubspotPropertyType, - IFieldProperty, - IHubspotObject, - ITypeInfo, -} from '../types' - -export abstract class HubspotFieldMapper { - protected fieldProperties: Record - - public fieldMap: Record - - public entity: HubspotEntity - - public hubspotId: number - - constructor(hubspotId: number) { - this.hubspotId = hubspotId - } - - abstract getFieldProperties( - attributes?: IMemberAttribute[], - platforms?: string[], - ): Record - - abstract getEntity(input: IHubspotObject, args?: unknown): unknown - - public isFieldMappableToHubspotType(field: string, type: HubspotPropertyType) { - if (!this.fieldProperties) { - throw new Error( - `${this.entity} field properties aren't initialized. Instance should be created with customAttributes and identities.`, - ) - } - - if (this.fieldProperties[field] === undefined) { - throw new Error(`${this.entity} property ${field} not found!`) - } - - return this.fieldProperties[field].hubspotType === type - } - - public getHubspotValue(entity: unknown, crowdKey: string) { - let value = entity[crowdKey] - - if (this.fieldProperties[crowdKey].serialize) { - value = this.fieldProperties[crowdKey].serialize(entity[crowdKey]) - } - - return value - } - - public getTypeMap(): Record { - if (!this.fieldProperties) { - throw new Error(`Can't find field properties of ${this.entity}!`) - } - - const typeMap: Record = {} - - Object.keys(this.fieldProperties).forEach((propertyName) => { - typeMap[propertyName] = { - hubspotType: this.fieldProperties[propertyName].hubspotType, - readonly: this.fieldProperties[propertyName].readonly || false, - } - }) - - return typeMap - } - - public getCrowdFieldName(hubspotAttributeName: string): string { - if (!this.fieldMap) { - throw new Error(`${this.entity} field map is not set!`) - } - - const crowdField = Object.keys(this.fieldMap).find( - (crowdFieldName) => this.fieldMap[crowdFieldName] === hubspotAttributeName, - ) - - return crowdField - } - - public getHubspotFieldName(crowdAttributeName: string): string { - this.ensureFieldMapExists() - - return this.fieldMap[crowdAttributeName] - } - - public getAllHubspotFields(): string[] { - this.ensureFieldMapExists() - - return Object.values(this.fieldMap) - } - - public getAllCrowdFields(): string[] { - this.ensureFieldMapExists() - - return Object.keys(this.fieldMap) - } - - public setFieldMap(fieldMap: Record): void { - this.fieldMap = fieldMap - } - - public setHubspotId(hubspotId: number): void { - this.hubspotId = hubspotId - } - - protected ensureFieldMapExists(): void { - if (!this.fieldMap) { - throw new Error(`${this.entity} field map is not set!`) - } - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/field-mapper/mapperFactory.ts b/services/libs/integrations/src/integrations/hubspot/field-mapper/mapperFactory.ts deleted file mode 100644 index 2923bde81a..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/field-mapper/mapperFactory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IMemberAttribute } from '@crowd/types' - -import { HubspotEntity } from '../types' - -import { HubspotFieldMapper } from './hubspotFieldMapper' -import { HubspotMemberFieldMapper } from './memberFieldMapper' -import { HubspotOrganizationFieldMapper } from './organizationFieldMapper' - -export class HubspotFieldMapperFactory { - static getFieldMapper( - entity: HubspotEntity, - hubspotId: number, - attributes?: IMemberAttribute[], - platforms?: string[], - ): HubspotFieldMapper { - switch (entity) { - case HubspotEntity.MEMBERS: - return new HubspotMemberFieldMapper(hubspotId, attributes, platforms) - case HubspotEntity.ORGANIZATIONS: - return new HubspotOrganizationFieldMapper(hubspotId) - default: - throw new Error(`Field mapper for ${entity} not found!`) - } - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/field-mapper/memberFieldMapper.ts b/services/libs/integrations/src/integrations/hubspot/field-mapper/memberFieldMapper.ts deleted file mode 100644 index 1f4db995ab..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/field-mapper/memberFieldMapper.ts +++ /dev/null @@ -1,237 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - IMemberAttribute, - IMemberData, - ITagOpensearch, - MemberAttributeName, - MemberAttributeType, - MemberIdentityType, - OrganizationIdentityType, - OrganizationSource, - PlatformType, -} from '@crowd/types' - -import { HubspotPropertyType, IFieldProperty, IHubspotContact } from '../types' - -import { HubspotFieldMapper } from './hubspotFieldMapper' -import { HubspotOrganizationFieldMapper } from './organizationFieldMapper' -import { serializeDate } from './utils/serialization' - -export class HubspotMemberFieldMapper extends HubspotFieldMapper { - protected fieldProperties: Record = { - displayName: { - hubspotType: HubspotPropertyType.STRING, - }, - score: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - joinedAt: { - hubspotType: HubspotPropertyType.DATE, - readonly: true, - serialize: serializeDate, - }, - createdAt: { - hubspotType: HubspotPropertyType.DATE, - readonly: true, - serialize: serializeDate, - }, - reach: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - numberOfOpensourceContributions: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - activityCount: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - activeDaysCount: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - lastActive: { - hubspotType: HubspotPropertyType.DATE, - readonly: true, - serialize: serializeDate, - }, - averageSentiment: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - tags: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (tags: ITagOpensearch[]) => { - return tags.map((t) => t.name).toString() - }, - }, - organizationName: { - hubspotType: HubspotPropertyType.STRING, - }, - } - - public customAttributes: IMemberAttribute[] - - public platforms: string[] - - constructor(hubspotId: number, customAttributes: IMemberAttribute[], platforms: string[]) { - super(hubspotId) - - this.customAttributes = customAttributes - this.platforms = platforms - this.fieldProperties = this.getFieldProperties(customAttributes, platforms) - } - - getFieldProperties( - customAttributes: IMemberAttribute[], - platforms: string[], - ): Record { - const dynamicProperties = this.getDynamicFieldProperties(customAttributes, platforms) - return { ...this.fieldProperties, ...dynamicProperties } - } - - getDynamicFieldProperties( - customAttributes: IMemberAttribute[], - platforms: string[], - ): Record { - const dynamicFieldProperties: Record = {} - - for (const customAttribute of customAttributes.filter((a) => a.show)) { - if (customAttribute.type === MemberAttributeType.BOOLEAN) { - dynamicFieldProperties[`attributes.${customAttribute.name}`] = { - hubspotType: HubspotPropertyType.BOOL, - } - } else if (customAttribute.type === MemberAttributeType.DATE) { - dynamicFieldProperties[`attributes.${customAttribute.name}`] = { - hubspotType: HubspotPropertyType.DATE, - } - } else if (customAttribute.type === MemberAttributeType.NUMBER) { - dynamicFieldProperties[`attributes.${customAttribute.name}`] = { - hubspotType: HubspotPropertyType.NUMBER, - } - } else if ( - [MemberAttributeType.EMAIL, MemberAttributeType.STRING, MemberAttributeType.URL].includes( - customAttribute.type, - ) - ) { - dynamicFieldProperties[`attributes.${customAttribute.name}`] = { - hubspotType: HubspotPropertyType.STRING, - } - } - } - - for (const platform of platforms) { - dynamicFieldProperties[`identities.${platform}`] = { - hubspotType: HubspotPropertyType.STRING, - } - } - - return dynamicFieldProperties - } - - override getEntity( - hubspotContact: IHubspotContact, - organizationMapper: HubspotOrganizationFieldMapper, - ): IMemberData { - this.ensureFieldMapExists() - - if (!this.hubspotId) { - throw new Error('Hubspot Id should be set before parsing the member!') - } - - const contactProperties = hubspotContact.properties as any - - if (!contactProperties.email) { - throw new Error( - 'Member returned from HubSpot API is missing the unique identifier e-mail field!', - ) - } - - // staticly defined member fields - const member: IMemberData = { - identities: [ - { - platform: PlatformType.HUBSPOT, - value: contactProperties.email, - type: MemberIdentityType.EMAIL, - sourceId: hubspotContact.id, - verified: true, - }, - ], - attributes: { - [MemberAttributeName.SOURCE_ID]: { - [PlatformType.HUBSPOT]: hubspotContact.id, - }, - [MemberAttributeName.URL]: { - [PlatformType.HUBSPOT]: `https://app.hubspot.com/contacts/${this.hubspotId}/contact/${hubspotContact.id}`, - }, - }, - } - - // loop through member properties - for (const hubspotPropertyName of Object.keys(contactProperties)) { - const crowdKey = this.getCrowdFieldName(hubspotPropertyName) - - // discard readonly fields, readonly fields will be only used when pushing data back to hubspot - if (crowdKey && !this.fieldProperties[crowdKey].readonly) { - // For incoming integrations, we already get the member email from hubspot defined field `email` - // if user mapped crowd field `emails` to some other field - // this will be saved to the mapped field when sending the member back to hubspot - if (contactProperties[hubspotPropertyName] !== null) { - if (crowdKey.startsWith('attributes')) { - const crowdAttributeName = crowdKey.split('.')[1] || null - - if (crowdAttributeName) { - member.attributes[crowdAttributeName] = { - [PlatformType.HUBSPOT]: contactProperties[hubspotPropertyName], - } - } - } else if (crowdKey.startsWith('identities')) { - const identityPlatform = crowdKey.split('.')[1] || null - - if (identityPlatform) { - member.identities.push({ - value: contactProperties[hubspotPropertyName], - type: MemberIdentityType.USERNAME, - platform: identityPlatform, - verified: false, - }) - } - } else if (crowdKey === 'organizationName') { - // TODO uros check if this is verified or not with anil - member.organizations = [ - { - // names: [contactProperties[hubspotPropertyName]], // TODO migrate to attributes - identities: [ - { - value: contactProperties[hubspotPropertyName], - type: OrganizationIdentityType.USERNAME, - platform: PlatformType.HUBSPOT, - verified: true, - }, - ], - source: OrganizationSource.HUBSPOT, - }, - ] - } else { - member[crowdKey] = contactProperties[hubspotPropertyName] - } - } - } - } - - if (hubspotContact.organization) { - const organization = organizationMapper.getEntity(hubspotContact.organization) - if (member.organizations && member.organizations.length > 0) { - member.organizations.push(organization) - } else { - member.organizations = [organization] - } - } - - return member - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/field-mapper/organizationFieldMapper.ts b/services/libs/integrations/src/integrations/hubspot/field-mapper/organizationFieldMapper.ts deleted file mode 100644 index cd0f1cc28b..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/field-mapper/organizationFieldMapper.ts +++ /dev/null @@ -1,301 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - IOrganization, - OrganizationIdentityType, - OrganizationSource, - PlatformType, -} from '@crowd/types' - -import { HubspotPropertyType, IFieldProperty, IHubspotObject } from '../types' - -import { HubspotFieldMapper } from './hubspotFieldMapper' -import { serializeArray } from './utils/serialization' - -export class HubspotOrganizationFieldMapper extends HubspotFieldMapper { - protected fieldProperties: Record = { - name: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - }, - url: { - hubspotType: HubspotPropertyType.STRING, - }, - description: { - hubspotType: HubspotPropertyType.STRING, - }, - emails: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - names: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - logo: { - hubspotType: HubspotPropertyType.STRING, - }, - tags: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - // revenueRange: { - // hubspotType: HubspotPropertyType.STRING, - // readonly: true, - // serialize: (revenueRange: any) => { - // return JSON.stringify(revenueRange) - // }, - // }, - revenueRangeMin: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - revenueRangeMax: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - employeeCountByCountry: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (employeeCountByCountry: any) => { - return JSON.stringify(employeeCountByCountry) - }, - }, - employees: { - hubspotType: HubspotPropertyType.NUMBER, - }, - location: { - hubspotType: HubspotPropertyType.STRING, - }, - type: { - hubspotType: HubspotPropertyType.ENUMERATION, - }, - size: { - hubspotType: HubspotPropertyType.STRING, - }, - headline: { - hubspotType: HubspotPropertyType.STRING, - }, - industry: { - hubspotType: HubspotPropertyType.ENUMERATION, - }, - founded: { - hubspotType: HubspotPropertyType.STRING, - }, - activityCount: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - memberCount: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - allSubsidiaries: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - alternativeNames: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - averageEmployeeTenure: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - averageTenureByLevel: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (averageTenureByLevel: any) => { - return JSON.stringify(averageTenureByLevel) - }, - }, - averageTenureByRole: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (averageTenureByRole: any) => { - return JSON.stringify(averageTenureByRole) - }, - }, - directSubsidiaries: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: serializeArray, - }, - // employeeChurnRate: { - // hubspotType: HubspotPropertyType.STRING, - // readonly: true, - // serialize: (employeeChurnRate: any) => { - // return JSON.stringify(employeeChurnRate) - // }, - // }, - employeeCountByMonth: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (employeeCountByMonth: any) => { - return JSON.stringify(employeeCountByMonth) - }, - }, - employeeChurnRate12Month: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - // employeeGrowthRate: { - // hubspotType: HubspotPropertyType.STRING, - // readonly: true, - // serialize: (employeeGrowthRate: any) => { - // return JSON.stringify(employeeGrowthRate) - // }, - // }, - employeeGrowthRate12Month: { - hubspotType: HubspotPropertyType.NUMBER, - readonly: true, - }, - employeeCountByMonthByLevel: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (employeeCountByMonthByLevel: any) => { - return JSON.stringify(employeeCountByMonthByLevel) - }, - }, - employeeCountByMonthByRole: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (employeeCountByMonthByRole: any) => { - return JSON.stringify(employeeCountByMonthByRole) - }, - }, - gicsSector: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - }, - grossAdditionsByMonth: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (grossAdditionsByMonth: any) => { - return JSON.stringify(grossAdditionsByMonth) - }, - }, - grossDeparturesByMonth: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - serialize: (grossDeparturesByMonth: any) => { - return JSON.stringify(grossDeparturesByMonth) - }, - }, - immediateParent: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - }, - ultimateParent: { - hubspotType: HubspotPropertyType.STRING, - readonly: true, - }, - } - - override getFieldProperties(): Record { - return this.fieldProperties - } - - public getSocialUrl(platform: string, handle: string): string { - if (!platform || !handle) { - return null - } - - switch (platform) { - case PlatformType.TWITTER: - return `https://twitter.com/${handle}` - case PlatformType.LINKEDIN: - return `https://linkedin.com/company/${handle}` - case PlatformType.CRUNCHBASE: - return `https://crunchbase.com/organization/${handle}` - case PlatformType.GITHUB: - return `https://github.com/${handle}` - default: - return null - } - } - - override getEntity(hubspotOrganization: IHubspotObject): IOrganization { - this.ensureFieldMapExists() - - if (!this.hubspotId) { - throw new Error('Hubspot Id should be set before parsing the organization!') - } - - const organizationProperties = hubspotOrganization.properties as any - - if (!organizationProperties.name) { - throw new Error( - 'Organization returned from HubSpot API is missing the unique identifier name field!', - ) - } - - // TODO uros check if this is verified or not with anil - const organization: IOrganization = { - // names: [organizationProperties.name], // TODO migrate to attributes - identities: [ - { - value: `${this.hubspotId}:${hubspotOrganization.id}`, - platform: PlatformType.HUBSPOT, - sourceId: hubspotOrganization.id, - type: OrganizationIdentityType.USERNAME, - verified: true, - }, - ], - // attributes: { - // [OrganizationAttributeName.SOURCE_ID]: { - // [PlatformType.HUBSPOT]: hubspotOrganization.id, - // }, - // [OrganizationAttributeName.URL]: { - // [PlatformType.HUBSPOT]: `https://app.hubspot.com/contacts/${this.hubspotId}/company/${hubspotOrganization.id}`, - // }, - // [OrganizationAttributeName.DOMAIN]: { - // [PlatformType.HUBSPOT]: organizationProperties.domain, - // }, - // }, - source: OrganizationSource.HUBSPOT, - } - - // loop through organization properties - for (const hubspotPropertyName of Object.keys(organizationProperties)) { - const crowdKey = this.getCrowdFieldName(hubspotPropertyName) - - // discard readonly fields, readonly fields will be only used when pushing data back to hubspot - if (crowdKey && !this.fieldProperties[crowdKey].readonly) { - if (organizationProperties[hubspotPropertyName] !== null) { - organization[crowdKey] = organizationProperties[hubspotPropertyName] - - // add additional identities to org using social fields come from hubspot - if ( - [ - PlatformType.LINKEDIN, - PlatformType.TWITTER, - PlatformType.GITHUB, - PlatformType.CRUNCHBASE, - ].includes(crowdKey as PlatformType) - ) { - // fix for linkedin social, it comes as a full url - if (crowdKey === PlatformType.LINKEDIN) { - const linkedinHandle = organizationProperties[hubspotPropertyName].split('/').pop() - organization[crowdKey] = linkedinHandle - } - - // TODO uros - check if this is verified or not with anil - organization.identities.push({ - value: organization[crowdKey], - type: OrganizationIdentityType.USERNAME, - platform: crowdKey, - sourceId: null, - verified: false, - }) - } - } - } - } - return organization - } -} diff --git a/services/libs/integrations/src/integrations/hubspot/field-mapper/utils/serialization.ts b/services/libs/integrations/src/integrations/hubspot/field-mapper/utils/serialization.ts deleted file mode 100644 index a6f327342c..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/field-mapper/utils/serialization.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const serializeArray = (array: string[]): string => { - if (!array || array.length === 0) { - return undefined - } - return array.toString() -} - -export const deserializeArray = (string: string): string[] => { - return string.split(',') -} - -export const serializeDate = (date: string): number => { - const dateObj = new Date(date) - if (isNaN(dateObj.getTime()) || dateObj.getTime() === 0) { - return undefined - } - dateObj.setUTCHours(0, 0, 0, 0) - return dateObj.getTime() -} diff --git a/services/libs/integrations/src/integrations/hubspot/generateStreams.ts b/services/libs/integrations/src/integrations/hubspot/generateStreams.ts deleted file mode 100644 index aa613def2f..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/generateStreams.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { GenerateStreamsHandler } from '../../types' - -import { - HubspotEntity, - HubspotStream, - IHubspotAttributeMap, - IHubspotIntegrationSettings, -} from './types' - -const handler: GenerateStreamsHandler = async (ctx) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - - const settings = ctx.integration.settings as IHubspotIntegrationSettings - - if (!settings.enabledFor || settings.enabledFor.length === 0) { - await ctx.abortRunWithError('Integration is not enabled for members or organizations!') - return - } - - const streams: HubspotStream[] = [] - - if (settings.enabledFor.includes(HubspotEntity.MEMBERS)) { - const fieldMap: IHubspotAttributeMap = settings.attributesMapping?.members - - if (!fieldMap) { - await ctx.abortRunWithError( - `Integration is enabled for members, but field mapping for members doesn't exist!`, - ) - return - } - - if (!settings.crowdAttributes) { - await ctx.abortRunWithError( - `Member attributes that are mapped to a hubspot field are required for member field mapper.`, - ) - return - } - - if (!settings.platforms) { - await ctx.abortRunWithError( - `Identity platforms that are mapped to a hubspot field are required for member field mapper.`, - ) - return - } - - streams.push(HubspotStream.MEMBERS) - } - - if (settings.enabledFor.includes(HubspotEntity.ORGANIZATIONS)) { - const fieldMap: IHubspotAttributeMap = settings.attributesMapping?.organizations - - if (!fieldMap) { - await ctx.abortRunWithError( - `Integration is enabled for organizations, but field mapping for organizations doesn't exist!`, - ) - return - } - - streams.push(HubspotStream.ORGANIZATIONS) - } - - if (streams.length > 0) { - await ctx.publishStream(HubspotStream.ROOT, streams) - } -} - -export default handler diff --git a/services/libs/integrations/src/integrations/hubspot/index.ts b/services/libs/integrations/src/integrations/hubspot/index.ts deleted file mode 100644 index 91a49d0c58..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IIntegrationDescriptor } from '../../types' - -import generateStreams from './generateStreams' -import { HUBSPOT_MEMBER_ATTRIBUTES } from './memberAttributes' -import processData from './processData' -import processStream from './processStream' -import processSyncRemote from './processSyncRemote' -import startSyncRemote from './startSyncRemote' - -const descriptor: IIntegrationDescriptor = { - type: 'hubspot', - memberAttributes: HUBSPOT_MEMBER_ATTRIBUTES, - checkEvery: 8 * 60, // 8 hours - generateStreams, - processStream, - processData, - startSyncRemote, - processSyncRemote, -} - -export default descriptor diff --git a/services/libs/integrations/src/integrations/hubspot/memberAttributes.ts b/services/libs/integrations/src/integrations/hubspot/memberAttributes.ts deleted file mode 100644 index da7d4ef728..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/memberAttributes.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - IMemberAttribute, - MemberAttributeName, - MemberAttributeType, - MemberAttributes, -} from '@crowd/types' - -export const HUBSPOT_MEMBER_ATTRIBUTES: IMemberAttribute[] = [ - { - name: MemberAttributes[MemberAttributeName.URL].name, - label: MemberAttributes[MemberAttributeName.URL].label, - type: MemberAttributeType.URL, - canDelete: false, - show: true, - }, - { - name: MemberAttributes[MemberAttributeName.SOURCE_ID].name, - label: MemberAttributes[MemberAttributeName.SOURCE_ID].label, - type: MemberAttributeType.STRING, - canDelete: false, - show: false, - }, -] diff --git a/services/libs/integrations/src/integrations/hubspot/processData.ts b/services/libs/integrations/src/integrations/hubspot/processData.ts deleted file mode 100644 index 648cec816d..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/processData.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { IntegrationResultType } from '@crowd/types' - -import { ProcessDataHandler } from '../../types' - -import { HubspotFieldMapperFactory } from './field-mapper/mapperFactory' -import { HubspotEntity, HubspotStream, IHubspotData, IHubspotIntegrationSettings } from './types' - -const processContact: ProcessDataHandler = async (ctx) => { - const data = ctx.data as IHubspotData - - const settings = ctx.integration.settings as IHubspotIntegrationSettings - - const memberMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.MEMBERS, - settings.hubspotId, - settings.crowdAttributes, - settings.platforms, - ) - const orgMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - settings.hubspotId, - ) - - memberMapper.setFieldMap(settings.attributesMapping[HubspotEntity.MEMBERS]) - orgMapper.setFieldMap(settings.attributesMapping[HubspotEntity.ORGANIZATIONS]) - - const member = memberMapper.getEntity(data.element, orgMapper) - - await ctx.publishCustom(member, IntegrationResultType.MEMBER_ENRICH) -} - -const processCompany: ProcessDataHandler = async (ctx) => { - const data = ctx.data as IHubspotData - const settings = ctx.integration.settings as IHubspotIntegrationSettings - - const orgMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - settings.hubspotId, - ) - - orgMapper.setFieldMap(settings.attributesMapping[HubspotEntity.ORGANIZATIONS]) - - const organization = orgMapper.getEntity(data.element, orgMapper) - - await ctx.publishCustom(organization, IntegrationResultType.ORGANIZATION_ENRICH) -} - -const handler: ProcessDataHandler = async (ctx) => { - const data = ctx.data as IHubspotData - - // only process contacts with e-mails, this will be the unique identifier when enriching - if (data.type === HubspotStream.MEMBERS && (data.element.properties as any).email) { - await processContact(ctx) - } else if (data.type === HubspotStream.ORGANIZATIONS && (data.element.properties as any).name) { - await processCompany(ctx) - } -} - -export default handler diff --git a/services/libs/integrations/src/integrations/hubspot/processStream.ts b/services/libs/integrations/src/integrations/hubspot/processStream.ts deleted file mode 100644 index 6c8d8a61a8..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/processStream.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { RequestThrottler } from '@crowd/common' - -import { ProcessStreamHandler } from '../../types' - -import { getAllCompanies } from './api/companies' -import { getAllContacts } from './api/contacts' -import { HubspotFieldMapperFactory } from './field-mapper/mapperFactory' -import { HubspotMemberFieldMapper } from './field-mapper/memberFieldMapper' -import { HubspotOrganizationFieldMapper } from './field-mapper/organizationFieldMapper' -import { - HubspotEntity, - HubspotStream, - IHubspotContact, - IHubspotData, - IHubspotIntegrationSettings, - IHubspotObject, -} from './types' - -const processRootStream: ProcessStreamHandler = async (ctx) => { - const throttler = new RequestThrottler(99, 11000, ctx.log) - - const settings = ctx.integration.settings as IHubspotIntegrationSettings - - // hubspot might have long running root stream, change stream queue message visibility to 7 hours - await ctx.setMessageVisibilityTimeout(60 * 60 * 7) - - const streams = ctx.stream.data as HubspotStream[] - - if (streams.includes(HubspotStream.MEMBERS)) { - const memberMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.MEMBERS, - settings.hubspotId, - settings.crowdAttributes, - settings.platforms, - ) as HubspotMemberFieldMapper - memberMapper.setFieldMap(settings.attributesMapping.members) - memberMapper.setHubspotId(settings.hubspotId) - - const organizationsEnabled = settings.enabledFor.includes(HubspotEntity.ORGANIZATIONS) - - let organizationMapper - - if (organizationsEnabled) { - organizationMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - settings.hubspotId, - ) as HubspotOrganizationFieldMapper - - organizationMapper.setFieldMap(settings.attributesMapping.organizations) - } - - const contactsGenerator = getAllContacts( - ctx.serviceSettings.nangoId, - memberMapper, - organizationMapper, - ctx, - throttler, - organizationsEnabled, - ) - - let contactsPage = await contactsGenerator.next() - - while (!contactsPage.done) { - const contacts = contactsPage.value as IHubspotContact[] - - while (contacts.length > 0) { - const contact = contacts.shift() - await ctx.processData({ - type: HubspotStream.MEMBERS, - element: contact as IHubspotContact, - }) - } - - contactsPage = await contactsGenerator.next() - } - } - - if (streams.includes(HubspotStream.ORGANIZATIONS)) { - const organizationMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - settings.hubspotId, - ) as HubspotOrganizationFieldMapper - - organizationMapper.setFieldMap(settings.attributesMapping.organizations) - - const companyGenerator = getAllCompanies( - ctx.serviceSettings.nangoId, - organizationMapper, - ctx, - throttler, - ) - - let companyPage = await companyGenerator.next() - - while (!companyPage.done) { - const companies = companyPage.value as IHubspotObject[] - - while (companies.length > 0) { - const company = companies.shift() - await ctx.processData({ - type: HubspotStream.ORGANIZATIONS, - element: company as IHubspotObject, - }) - } - - companyPage = await companyGenerator.next() - } - } -} - -const handler: ProcessStreamHandler = async (ctx) => { - await processRootStream(ctx) -} - -export default handler diff --git a/services/libs/integrations/src/integrations/hubspot/processSyncRemote.ts b/services/libs/integrations/src/integrations/hubspot/processSyncRemote.ts deleted file mode 100644 index bf650a5a6e..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/processSyncRemote.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { RequestThrottler } from '@crowd/common' -import { - AutomationSyncTrigger, - Entity, - HubspotSettings, - IMember, - IOrganization, -} from '@crowd/types' - -import { - IGenerateStreamsContext, - IIntegrationProcessRemoteSyncContext, - ProcessIntegrationSyncHandler, -} from '../../types' - -import { addContactsToList } from './api/addContactsToList' -import { batchCreateMembers } from './api/batchCreateMembers' -import { batchCreateOrganizations } from './api/batchCreateOrganizations' -import { batchUpdateMembers } from './api/batchUpdateMembers' -import { batchUpdateOrganizations } from './api/batchUpdateOrganizations' -import { IBatchOperationResult } from './api/types' -import { HubspotFieldMapperFactory } from './field-mapper/mapperFactory' -import { HubspotMemberFieldMapper } from './field-mapper/memberFieldMapper' -import { HubspotOrganizationFieldMapper } from './field-mapper/organizationFieldMapper' -import { HubspotEntity, IHubspotIntegrationSettings } from './types' - -const handler: ProcessIntegrationSyncHandler = async ( - toCreate: T[], - toUpdate: T[], - entity: Entity, - ctx: IIntegrationProcessRemoteSyncContext, -): Promise => { - const nangoId = `${ctx.tenantId}-${ctx.integration.platform}` - - const integrationContext = { - log: ctx.log, - serviceSettings: { - nangoId, - nangoUrl: ctx.serviceSettings.nangoUrl, - nangoSecretKey: ctx.serviceSettings.nangoSecretKey, - }, - } as IGenerateStreamsContext - - const settings = ctx.integration.settings as IHubspotIntegrationSettings - - const throttler = new RequestThrottler(100, 10000, ctx.log) - - switch (entity) { - case Entity.MEMBERS: { - let membersCreatedInHubspot = [] - let membersUpdatedInHubspot = [] - - const memberMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.MEMBERS, - settings.hubspotId, - settings.crowdAttributes, - settings.platforms, - ) as HubspotMemberFieldMapper - - memberMapper.setFieldMap( - (ctx.integration.settings as IHubspotIntegrationSettings).attributesMapping.members, - ) - - if (toCreate.length > 0) { - membersCreatedInHubspot = await batchCreateMembers( - nangoId, - toCreate as IMember[], - memberMapper, - integrationContext, - throttler, - ) - } - - if (toUpdate.length > 0) { - membersUpdatedInHubspot = await batchUpdateMembers( - nangoId, - toUpdate as IMember[], - memberMapper, - integrationContext, - throttler, - ) - } - - // we should also add members to hubspot lists, if it's coming from an automation - if ( - ctx.automation && - ctx.automation.trigger === AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH - ) { - const vids: string[] = [ - ...membersCreatedInHubspot.map((m) => m.sourceId), - ...(toUpdate as IMember[]).map((m) => m.attributes.sourceId.hubspot), - ] - - await addContactsToList( - nangoId, - (ctx.automation.settings as HubspotSettings).contactList, - vids, - integrationContext, - throttler, - ) - } - - return { created: membersCreatedInHubspot, updated: membersUpdatedInHubspot } - } - case Entity.ORGANIZATIONS: { - let companiesCreatedInHubspot = [] - let companiesUpdatedInHubspot = [] - - const organizationMapper = HubspotFieldMapperFactory.getFieldMapper( - HubspotEntity.ORGANIZATIONS, - settings.hubspotId, - ) as HubspotOrganizationFieldMapper - - organizationMapper.setFieldMap( - (ctx.integration.settings as IHubspotIntegrationSettings).attributesMapping.organizations, - ) - - if (toCreate.length > 0) { - companiesCreatedInHubspot = await batchCreateOrganizations( - nangoId, - toCreate as IOrganization[], - organizationMapper, - integrationContext, - throttler, - ) - } - - if (toUpdate.length > 0) { - companiesUpdatedInHubspot = await batchUpdateOrganizations( - nangoId, - toUpdate as IOrganization[], - organizationMapper, - integrationContext, - throttler, - ) - } - - return { created: companiesCreatedInHubspot, updated: companiesUpdatedInHubspot } - } - default: { - const message = `Unsupported entity ${entity} while processing HubSpot sync remote!` - ctx.log.error(message) - throw new Error(message) - } - } -} - -export default handler diff --git a/services/libs/integrations/src/integrations/hubspot/startSyncRemote.ts b/services/libs/integrations/src/integrations/hubspot/startSyncRemote.ts deleted file mode 100644 index e7a88c7443..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/startSyncRemote.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AutomationState, AutomationSyncTrigger } from '@crowd/types' - -import { StartIntegrationSyncHandler } from '../../types' - -import { HubspotEntity, IHubspotIntegrationSettings } from './types' - -const handler: StartIntegrationSyncHandler = async (ctx) => { - const settings = ctx.integration.settings as IHubspotIntegrationSettings - if (settings.enabledFor.includes(HubspotEntity.MEMBERS)) { - // sync members - await ctx.integrationSyncWorkerEmitter.triggerSyncMarkedMembers( - ctx.tenantId, - ctx.integration.id, - ) - - const memberSyncAutomations = ctx.automations.filter( - (a) => - a.trigger === AutomationSyncTrigger.MEMBER_ATTRIBUTES_MATCH && - a.state === AutomationState.ACTIVE, - ) - - // sync filter automations - for (const automation of memberSyncAutomations) { - await ctx.integrationSyncWorkerEmitter.triggerOnboardAutomation( - ctx.tenantId, - ctx.integration.id, - automation.id, - automation.trigger as AutomationSyncTrigger, - ) - } - } - - if (settings.enabledFor.includes(HubspotEntity.ORGANIZATIONS)) { - // sync orgs - await ctx.integrationSyncWorkerEmitter.triggerSyncMarkedOrganizations( - ctx.tenantId, - ctx.integration.id, - ) - - const organizationSyncAutomations = ctx.automations.filter( - (a) => - a.trigger === AutomationSyncTrigger.ORGANIZATION_ATTRIBUTES_MATCH && - a.state === AutomationState.ACTIVE, - ) - - // sync filter automations - for (const automation of organizationSyncAutomations) { - await ctx.integrationSyncWorkerEmitter.triggerOnboardAutomation( - ctx.tenantId, - ctx.integration.id, - automation.id, - automation.trigger as AutomationSyncTrigger, - ) - } - } -} - -export default handler diff --git a/services/libs/integrations/src/integrations/hubspot/types.ts b/services/libs/integrations/src/integrations/hubspot/types.ts deleted file mode 100644 index 7c0dcf5185..0000000000 --- a/services/libs/integrations/src/integrations/hubspot/types.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { IMemberAttribute } from '@crowd/types' - -export enum HubspotPropertyType { - BOOL = 'bool', - ENUMERATION = 'enumeration', - DATE = 'date', - DATETIME = 'dateTime', - STRING = 'string', - NUMBER = 'number', -} - -export interface IFieldProperty { - hubspotType: HubspotPropertyType - readonly?: boolean - // eslint-disable-next-line @typescript-eslint/no-explicit-any - serialize?: (object: any) => string | number - deserialize?: (string: string) => object -} - -export enum HubspotEndpoint { - CONTACTS = 'contacts', - COMPANIES = 'companies', -} - -export enum HubspotEntity { - MEMBERS = 'members', - ORGANIZATIONS = 'organizations', -} - -export enum HubspotStream { - MEMBERS = 'members', - ORGANIZATIONS = 'organizations', - ROOT = 'root', -} - -export enum HubspotAssociationType { - CONTACT_TO_COMPANY = 'contact_to_company', -} - -export interface IHubspotTokenInfo { - token: string - user: string - hub_domain: string - scopes: string[] - scope_to_scope_group_pks: number[] - hub_id: number - app_id: number - expires_in: number - user_id: number - token_type: string -} - -export interface IHubspotPropertyEnumerationOption { - label: string - value: string - hidden: boolean - description: string - displayOrder: number -} - -export interface IHubspotPropertyModificationMetadata { - archivable: boolean - readOnlyValue: boolean - readOnlyOptions: boolean - readOnlyDefinition: boolean -} - -export interface IHubspotProperty { - name: string - type: HubspotPropertyType - label: string - hidden: boolean - options: IHubspotPropertyEnumerationOption[] - createdAt: string - fieldType: string - formField: boolean - groupName: string - updatedAt: string - calculated: boolean - description: string - displayOrder: number - hasUniqueValue: boolean - hubspotDefined: boolean - externalOptions: boolean - modificationMetadata: IHubspotPropertyModificationMetadata -} - -export interface IHubspotListMetadata { - size: number - lastSizeChangeAt: number - processing: string - lastProcessingStateChangeAt: number - error: string - listReferencesCount: number - parentFolderId: number -} - -export interface IHubspotList { - portalId: number - listId: number - createdAt: number - updatedAt: number - name: string - listType: string - authorId: number - parentId: number - filters: string[] - metaData: IHubspotListMetadata - archived: boolean - teamIds: number[] - ilsFilterBranch: string - readOnly: boolean - internal: boolean - limitExempt: boolean - dynamic: boolean -} - -export interface ITypeInfo { - hubspotType: HubspotPropertyType - readonly: boolean -} - -export interface IHubspotObject { - id: string - properties: unknown - createdAt: string - updatedAt: string - archived: boolean -} - -export interface IHubspotContact extends IHubspotObject { - organization?: IHubspotObject -} - -export interface IHubspotAssociation { - id: string - type: HubspotAssociationType -} - -export interface IHubspotData { - type: HubspotStream - element: IHubspotObject | IHubspotContact -} - -export interface IHubspotAttributeMap { - [key: string]: string -} - -export interface IHubspotOnboardingSettings { - enabledFor: HubspotEntity[] - attributesMapping: { - [HubspotEntity.MEMBERS]?: IHubspotAttributeMap - [HubspotEntity.ORGANIZATIONS]?: IHubspotAttributeMap - } -} - -export interface IHubspotIntegrationSettings extends IHubspotOnboardingSettings { - hubspotId: number - hubspotProperties: IHubspotProperty[] - crowdAttributes: IMemberAttribute[] - platforms: string[] - updateMemberAttributes: boolean - syncRemoteEnabled?: boolean - blockSyncRemote?: boolean -} - -export interface IHubspotManualSyncPayload { - memberId?: string - organizationId?: string - segmentId: string -} - -export interface IHubspotBaseStream { - start?: number -} diff --git a/services/libs/integrations/src/integrations/index.ts b/services/libs/integrations/src/integrations/index.ts index 99508139b3..19ac68de40 100644 --- a/services/libs/integrations/src/integrations/index.ts +++ b/services/libs/integrations/src/integrations/index.ts @@ -28,13 +28,6 @@ export * from './linkedin/grid' export * from './linkedin/types' export * from './linkedin/memberAttributes' -export * from './hubspot/types' -export * from './hubspot/api/types' -export * from './hubspot/field-mapper/mapperFactory' -export { getProperties as getHubspotProperties } from './hubspot/api/properties' -export { getTokenInfo as getHubspotTokenInfo } from './hubspot/api/tokenInfo' -export { getLists as getHubspotLists } from './hubspot/api/lists' - export * from './reddit/grid' export * from './reddit/types' export * from './reddit/memberAttributes' diff --git a/services/libs/integrations/src/types.ts b/services/libs/integrations/src/types.ts index f81c2def26..52ed010b96 100644 --- a/services/libs/integrations/src/types.ts +++ b/services/libs/integrations/src/types.ts @@ -1,21 +1,16 @@ import { DbConnection, DbTransaction } from '@crowd/data-access-layer/src/database' import { Logger } from '@crowd/logging' import { - Entity, IActivityData, - IAutomationData, ICache, IConcurrentRequestLimiter, IIntegration, IIntegrationStream, - IIntegrationSyncWorkerEmitter, IMemberAttribute, IRateLimiter, IntegrationResultType, } from '@crowd/types' -import { IBatchOperationResult } from './integrations/hubspot/api/types' - export interface IIntegrationContext { onboarding?: boolean integration: IIntegration @@ -33,20 +28,11 @@ export interface IIntegrationContext { abortRunWithError: (message: string, metadata?: unknown, error?: Error) => Promise } -export interface IIntegrationStartRemoteSyncContext { - integrationSyncWorkerEmitter: IIntegrationSyncWorkerEmitter - integration: IIntegration - automations: IAutomationData[] - tenantId: string - log: Logger -} - export interface IIntegrationProcessRemoteSyncContext { tenantId: string integration: IIntegration log: Logger serviceSettings: IIntegrationServiceSettings - automation?: IAutomationData } export interface IGenerateStreamsContext extends IIntegrationContext { @@ -134,13 +120,6 @@ export type GenerateStreamsHandler = (ctx: IGenerateStreamsContext) => Promise Promise export type ProcessWebhookStreamHandler = (ctx: IProcessWebhookStreamContext) => Promise export type ProcessDataHandler = (ctx: IProcessDataContext) => Promise -export type StartIntegrationSyncHandler = (ctx: IIntegrationStartRemoteSyncContext) => Promise -export type ProcessIntegrationSyncHandler = ( - toCreate: T[], - toUpdate: T[], - entity: Entity, - ctx: IIntegrationProcessRemoteSyncContext, -) => Promise export interface IIntegrationDescriptor { /** @@ -205,19 +184,6 @@ export interface IIntegrationDescriptor { // if undefined it will never check // if 0 it will check the same as if it was 1 - every minute checkEvery?: number - - /** - * Function that will be called if defined, after an integration goes into done state. - * Mainly responsible for sending queue messages to integration-sync-worker - */ - startSyncRemote?: StartIntegrationSyncHandler - - /** - * Function that will be called from integration sync worker for outgoing integrations. - * Gets two arrays, entities to create and entities to update. - * Logic for calling the required api endpoints per integration lives here. - */ - processSyncRemote?: ProcessIntegrationSyncHandler } export interface IIntegrationServiceSettings { diff --git a/services/libs/queue/src/types.ts b/services/libs/queue/src/types.ts index 9519ea4472..bd2842417e 100644 --- a/services/libs/queue/src/types.ts +++ b/services/libs/queue/src/types.ts @@ -76,7 +76,6 @@ export enum CrowdQueue { INTEGRATION_STREAM_WORKER = 'integration-stream-worker', DATA_SINK_WORKER = 'data-sink-worker', SEARCH_SYNC_WORKER = 'search-sync-worker', - INTEGRATION_SYNC_WORKER = 'integration-sync-worker', } export enum QueueVendor { diff --git a/services/libs/queue/src/vendors/kafka/config.ts b/services/libs/queue/src/vendors/kafka/config.ts index a31407a30d..5b0e2b2f14 100644 --- a/services/libs/queue/src/vendors/kafka/config.ts +++ b/services/libs/queue/src/vendors/kafka/config.ts @@ -2,7 +2,6 @@ import { DATA_SINK_WORKER_PARTITIONS, INTEGRATION_RUN_WORKER_PARTITIONS, INTEGRATION_STREAM_WORKER_PARTITIONS, - INTEGRATION_SYNC_WORKER_PARTITIONS, SEARCH_SYNC_WORKER_PARTITIONS, } from '@crowd/common' @@ -37,15 +36,6 @@ export const SEARCH_SYNC_WORKER_QUEUE_SETTINGS: IKafkaChannelConfig = { }, } -export const INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS: IKafkaChannelConfig = { - name: CrowdQueue.INTEGRATION_SYNC_WORKER, - replicationFactor: 1, - partitions: { - default: 1, - ...INTEGRATION_SYNC_WORKER_PARTITIONS, - }, -} - export const INTEGRATION_STREAM_WORKER_QUEUE_SETTINGS: IKafkaChannelConfig = { name: CrowdQueue.INTEGRATION_STREAM_WORKER, replicationFactor: 1, @@ -60,5 +50,4 @@ export const configMap = { [CrowdQueue.INTEGRATION_STREAM_WORKER]: INTEGRATION_STREAM_WORKER_QUEUE_SETTINGS, [CrowdQueue.DATA_SINK_WORKER]: DATA_SINK_WORKER_QUEUE_SETTINGS, [CrowdQueue.SEARCH_SYNC_WORKER]: SEARCH_SYNC_WORKER_QUEUE_SETTINGS, - [CrowdQueue.INTEGRATION_SYNC_WORKER]: INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS, } diff --git a/services/libs/types/src/automations.ts b/services/libs/types/src/automations.ts deleted file mode 100644 index b91d951028..0000000000 --- a/services/libs/types/src/automations.ts +++ /dev/null @@ -1,104 +0,0 @@ -export enum AutomationSyncTrigger { - MEMBER_ATTRIBUTES_MATCH = 'member_attributes_match', - ORGANIZATION_ATTRIBUTES_MATCH = 'organization_attributes_match', -} - -/** - * all automation types that we are currently supporting - */ -export enum AutomationType { - WEBHOOK = 'webhook', - SLACK = 'slack', - HUBSPOT = 'hubspot', -} - -/** - * automation can either be active or disabled - */ -export enum AutomationState { - ACTIVE = 'active', - DISABLED = 'disabled', -} - -/** - * To determine the result of the execution if state == error -> error column will also be available - */ -export enum AutomationExecutionState { - SUCCESS = 'success', - ERROR = 'error', -} - -/** - * What can trigger this automation - */ -export enum AutomationTrigger { - NEW_ACTIVITY = 'new_activity', - NEW_MEMBER = 'new_member', -} - -/** - * For webhook automation we only need URL to which we will post information - */ -export interface WebhookSettings { - url: string -} - -/** - * Settings for new activity trigger based automations - */ -export interface NewActivitySettings { - types: string[] - platforms: string[] - keywords: string[] - teamMemberActivities: boolean -} - -/** - * Settings for new member trigger based automations - */ -export interface NewMemberSettings { - platforms: string[] -} - -export interface HubspotSettings { - contactList: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - filter: any -} - -/** - * Union type to contain all different types of settings - */ -export type AutomationSettings = - | WebhookSettings - | NewActivitySettings - | NewMemberSettings - | HubspotSettings - -export interface IAutomationData { - id: string - name: string - type: AutomationType - tenantId: string - trigger: AutomationTrigger | AutomationSyncTrigger - settings: AutomationSettings - state: AutomationState - createdAt: string - lastExecutionAt: string | null - lastExecutionState: AutomationExecutionState | null - lastExecutionError: unknown | null -} - -export interface IAutomationExecution { - id?: string - automationId: string - type: string - tenantId: string - trigger: string - state: string - error: string - executedAt?: string - eventId?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - payload: any -} diff --git a/services/libs/types/src/enums/organizations.ts b/services/libs/types/src/enums/organizations.ts index b7fbed720d..ef73b84f31 100644 --- a/services/libs/types/src/enums/organizations.ts +++ b/services/libs/types/src/enums/organizations.ts @@ -10,7 +10,6 @@ export enum OrganizationSource { ENRICHMENT_PROGAI = 'enrichment-progai', ENRICHMENT_CLEARBIT = 'enrichment-clearbit', ENRICHMENT_CRUSTDATA = 'enrichment-crustdata', - HUBSPOT = 'hubspot', GITHUB = 'github', UI = 'ui', } diff --git a/services/libs/types/src/enums/platforms.ts b/services/libs/types/src/enums/platforms.ts index 8f1b44487d..b2eac7f5c0 100644 --- a/services/libs/types/src/enums/platforms.ts +++ b/services/libs/types/src/enums/platforms.ts @@ -19,7 +19,6 @@ export enum PlatformType { DISCOURSE = 'discourse', GIT = 'git', CRUNCHBASE = 'crunchbase', - HUBSPOT = 'hubspot', GROUPSIO = 'groupsio', CONFLUENCE = 'confluence', GERRIT = 'gerrit', @@ -48,7 +47,6 @@ export enum IntegrationType { STACKOVERFLOW = 'stackoverflow', DISCOURSE = 'discourse', GIT = 'git', - HUBSPOT = 'hubspot', } export const integrationLabel: Record = { @@ -65,7 +63,6 @@ export const integrationLabel: Record = { [IntegrationType.STACKOVERFLOW]: 'Stack Overflow', [IntegrationType.DISCOURSE]: 'Discourse', [IntegrationType.GIT]: 'Git', - [IntegrationType.HUBSPOT]: 'HubSpot', } // Backup url from username if profile url not present in member.attributes.url @@ -84,5 +81,4 @@ export const integrationProfileUrl: Record `https://stackoverflow.com/users/${username}`, [IntegrationType.DISCOURSE]: () => null, [IntegrationType.GIT]: () => null, - [IntegrationType.HUBSPOT]: () => null, } diff --git a/services/libs/types/src/enums/temporal.ts b/services/libs/types/src/enums/temporal.ts index 464a3dafa2..836ae29477 100644 --- a/services/libs/types/src/enums/temporal.ts +++ b/services/libs/types/src/enums/temporal.ts @@ -1,7 +1,4 @@ export enum TemporalWorkflowId { - NEW_ACTIVITY_AUTOMATION = 'new-activity-automation', - NEW_MEMBER_AUTOMATION = 'new-member-automation', - EMAIL_WEEKLY_ANALYTICS = 'email-weekly-analytics', EMAIL_EAGLEEYE_DIGEST = 'email-eagleeye-digest', diff --git a/services/libs/types/src/index.ts b/services/libs/types/src/index.ts index 80b18419ee..f44b29717e 100644 --- a/services/libs/types/src/index.ts +++ b/services/libs/types/src/index.ts @@ -5,7 +5,6 @@ export * from './queue/integration_run_worker' export * from './queue/integration_stream_worker' export * from './queue/data_sink_worker' export * from './queue/search_sync_worker' -export * from './queue/integration_sync_worker' export * from './dashboard' @@ -37,8 +36,6 @@ export * from './notes' export * from './attributes' -export * from './automations' - export * from './query' export * from './sync' diff --git a/services/libs/types/src/queue/integration_sync_worker/index.ts b/services/libs/types/src/queue/integration_sync_worker/index.ts deleted file mode 100644 index 42d7b4791e..0000000000 --- a/services/libs/types/src/queue/integration_sync_worker/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AutomationSyncTrigger } from '../../automations' - -export enum IntegrationSyncWorkerQueueMessageType { - SYNC_ALL_MARKED_MEMBERS = 'sync_all_marked_members', - SYNC_MEMBER = 'sync_member', - SYNC_ALL_MARKED_ORGANIZATIONS = 'sync_all_marked_organizations', - SYNC_ORGANIZATION = 'sync_organization', - ONBOARD_AUTOMATION = 'onboard_automation', -} - -export interface IIntegrationSyncWorkerEmitter { - triggerSyncMarkedMembers(tenantId: string, integrationId: string): Promise - - triggerSyncMember( - tenantId: string, - integrationId: string, - memberId: string, - syncRemoteId: string, - ): Promise - - triggerOnboardAutomation( - tenantId: string, - integrationId: string, - automationId: string, - automationTrigger: AutomationSyncTrigger, - ): Promise - - triggerSyncMarkedOrganizations(tenantId: string, integrationId: string): Promise - - triggerSyncOrganization( - tenantId: string, - integrationId: string, - organizationId: string, - syncRemoteId: string, - ): Promise -} diff --git a/services/libs/types/src/temporal/automations.ts b/services/libs/types/src/temporal/automations.ts deleted file mode 100644 index 1264ca4f30..0000000000 --- a/services/libs/types/src/temporal/automations.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface IProcessNewActivityAutomationArgs { - tenantId: string - activityId: string -} - -export interface ITriggerActivityAutomationArgs { - automationId: string - activityId: string -} - -export interface IProcessNewMemberAutomationArgs { - tenantId: string - memberId: string -} - -export interface ITriggerMemberAutomationArgs { - automationId: string - memberId: string -} diff --git a/services/libs/types/src/temporal/index.ts b/services/libs/types/src/temporal/index.ts index ea27f66aab..18ac0264ae 100644 --- a/services/libs/types/src/temporal/index.ts +++ b/services/libs/types/src/temporal/index.ts @@ -1,3 +1,2 @@ -export * from './automations' export * from './cache' export * from './exports' From 930da3245841e96e4874de3afd12e474e157f23a Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 10 Jan 2025 14:04:31 +0530 Subject: [PATCH 14/25] clean --- backend/config/default.json | 4 +--- scripts/builders/integration-sync-worker.env | 5 ----- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 scripts/builders/integration-sync-worker.env diff --git a/backend/config/default.json b/backend/config/default.json index 8f5753a3e7..36d1115943 100644 --- a/backend/config/default.json +++ b/backend/config/default.json @@ -46,9 +46,7 @@ "crowdAnalytics": { "isEnabled": "false" }, - "temporal": { - "automationsTaskQueue": "automations" - }, + "temporal": {}, "searchSyncApi": {}, "encryption": {}, "openStatusApi": {}, diff --git a/scripts/builders/integration-sync-worker.env b/scripts/builders/integration-sync-worker.env deleted file mode 100644 index be41c3d293..0000000000 --- a/scripts/builders/integration-sync-worker.env +++ /dev/null @@ -1,5 +0,0 @@ -DOCKERFILE="./services/docker/Dockerfile.integration_sync_worker" -CONTEXT="../" -REPO="crowddotdev/integration-sync-worker" -SERVICES="integration-sync-worker" -PRIORITIZED="integration-sync-worker" \ No newline at end of file From e99dd99db4ae11136361dad80603c2614b46c625 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 10 Jan 2025 14:26:43 +0530 Subject: [PATCH 15/25] make linter happy --- backend/src/api/auth/authMe.ts | 4 +- backend/src/services/activityService.ts | 11 +- .../auth/passportStrategies/slackStrategy.ts | 1 - backend/src/services/integrationService.ts | 4 +- pnpm-lock.yaml | 104 ------------------ .../docker/Dockerfile.integration_sync_worker | 22 ---- ...rfile.integration_sync_worker.dockerignore | 19 ---- services/libs/common/src/env.ts | 12 -- services/libs/queue/src/config.ts | 5 - services/libs/queue/src/vendors/sqs/config.ts | 12 -- 10 files changed, 4 insertions(+), 190 deletions(-) delete mode 100644 scripts/services/docker/Dockerfile.integration_sync_worker delete mode 100644 scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore diff --git a/backend/src/api/auth/authMe.ts b/backend/src/api/auth/authMe.ts index 406cd5c7f5..14aab610f3 100644 --- a/backend/src/api/auth/authMe.ts +++ b/backend/src/api/auth/authMe.ts @@ -8,9 +8,7 @@ export default async (req, res) => { const payload = req.currentUser - payload.tenants = await Promise.all( - payload.tenants.map(async (tenantUser) => tenantUser), - ) + payload.tenants = await Promise.all(payload.tenants.map(async (tenantUser) => tenantUser)) await req.responseHandler.success(req, res, payload) } diff --git a/backend/src/services/activityService.ts b/backend/src/services/activityService.ts index d0280bcc6a..638e98be11 100644 --- a/backend/src/services/activityService.ts +++ b/backend/src/services/activityService.ts @@ -19,20 +19,13 @@ import { import { optionsQx } from '@crowd/data-access-layer/src/queryExecutor' import { ActivityDisplayService } from '@crowd/integrations' import { LoggerBase, logExecutionTime } from '@crowd/logging' -import { WorkflowIdReusePolicy } from '@crowd/temporal' -import { - IMemberIdentity, - IntegrationResultType, - PlatformType, - SegmentData, - TemporalWorkflowId, -} from '@crowd/types' +import { IMemberIdentity, IntegrationResultType, PlatformType, SegmentData } from '@crowd/types' import { IRepositoryOptions } from '@/database/repositories/IRepositoryOptions' import OrganizationRepository from '@/database/repositories/organizationRepository' import { getDataSinkWorkerEmitter } from '@/serverless/utils/queueService' -import { GITHUB_CONFIG, IS_DEV_ENV, IS_TEST_ENV, TEMPORAL_CONFIG } from '../conf' +import { GITHUB_CONFIG, IS_DEV_ENV, IS_TEST_ENV } from '../conf' import ActivityRepository from '../database/repositories/activityRepository' import MemberRepository from '../database/repositories/memberRepository' import SegmentRepository from '../database/repositories/segmentRepository' diff --git a/backend/src/services/auth/passportStrategies/slackStrategy.ts b/backend/src/services/auth/passportStrategies/slackStrategy.ts index 077f0eac61..7f727116ce 100644 --- a/backend/src/services/auth/passportStrategies/slackStrategy.ts +++ b/backend/src/services/auth/passportStrategies/slackStrategy.ts @@ -41,4 +41,3 @@ export function getSlackStrategy(): SlackStrategy { }, ) } - diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 5e45e5665d..3160bffbe9 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -45,9 +45,7 @@ import { } from '../serverless/integrations/usecases/github/rest/getRemoteStats' import { getOrganizations } from '../serverless/integrations/usecases/linkedin/getOrganizations' import getToken from '../serverless/integrations/usecases/nango/getToken' -import { - getIntegrationRunWorkerEmitter, -} from '../serverless/utils/queueService' +import { getIntegrationRunWorkerEmitter } from '../serverless/utils/queueService' import { encryptData } from '../utils/crypto' import { IServiceOptions } from './IServiceOptions' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6a2ea6e40..57ec147345 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -498,64 +498,6 @@ importers: specifier: ^3.0.1 version: 3.1.9 - services/apps/automations_worker: - dependencies: - '@crowd/archetype-standard': - specifier: workspace:* - version: link:../../archetypes/standard - '@crowd/archetype-worker': - specifier: workspace:* - version: link:../../archetypes/worker - '@crowd/common': - specifier: workspace:* - version: link:../../libs/common - '@crowd/data-access-layer': - specifier: workspace:* - version: link:../../libs/data-access-layer - '@crowd/integrations': - specifier: workspace:* - version: link:../../libs/integrations - '@crowd/logging': - specifier: workspace:* - version: link:../../libs/logging - '@crowd/redis': - specifier: workspace:* - version: link:../../libs/redis - '@crowd/types': - specifier: workspace:* - version: link:../../libs/types - '@temporalio/workflow': - specifier: ~1.11.1 - version: 1.11.5 - html-to-mrkdwn-ts: - specifier: ^1.1.0 - version: 1.1.0 - lodash.clonedeep: - specifier: ^4.5.0 - version: 4.5.0 - lodash.merge: - specifier: ^4.6.2 - version: 4.6.2 - superagent: - specifier: ^8.1.2 - version: 8.1.2 - tsx: - specifier: ^4.7.1 - version: 4.19.2 - typescript: - specifier: ^5.6.3 - version: 5.7.2 - devDependencies: - '@types/node': - specifier: ^20.8.2 - version: 20.17.12 - '@types/superagent': - specifier: ^4.1.20 - version: 4.1.24 - nodemon: - specifier: ^3.0.1 - version: 3.1.9 - services/apps/cache_worker: dependencies: '@crowd/archetype-standard': @@ -883,52 +825,6 @@ importers: specifier: ^2.0.22 version: 2.0.22 - services/apps/integration_sync_worker: - dependencies: - '@crowd/common': - specifier: workspace:* - version: link:../../libs/common - '@crowd/data-access-layer': - specifier: workspace:* - version: link:../../libs/data-access-layer - '@crowd/integrations': - specifier: workspace:* - version: link:../../libs/integrations - '@crowd/logging': - specifier: workspace:* - version: link:../../libs/logging - '@crowd/opensearch': - specifier: workspace:* - version: link:../../libs/opensearch - '@crowd/queue': - specifier: workspace:* - version: link:../../libs/queue - '@crowd/types': - specifier: workspace:* - version: link:../../libs/types - '@opensearch-project/opensearch': - specifier: ^2.11.0 - version: 2.13.0 - config: - specifier: ^3.3.9 - version: 3.3.12 - tsx: - specifier: ^4.7.1 - version: 4.19.2 - typescript: - specifier: ^5.6.3 - version: 5.7.2 - devDependencies: - '@types/config': - specifier: ^3.3.0 - version: 3.3.5 - '@types/node': - specifier: ^18.16.3 - version: 18.19.70 - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - services/apps/members_enrichment_worker: dependencies: '@crowd/archetype-standard': diff --git a/scripts/services/docker/Dockerfile.integration_sync_worker b/scripts/services/docker/Dockerfile.integration_sync_worker deleted file mode 100644 index 762313a320..0000000000 --- a/scripts/services/docker/Dockerfile.integration_sync_worker +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:20-alpine as builder - -RUN apk add --no-cache python3 make g++ - -WORKDIR /usr/crowd/app -RUN corepack enable - -COPY ./pnpm-workspace.yaml ./pnpm-lock.yaml ./ -RUN pnpm fetch - -COPY ./services ./services -RUN pnpm i --frozen-lockfile - -FROM node:20-alpine as runner - -WORKDIR /usr/crowd/app -RUN corepack enable - -COPY --from=builder /usr/crowd/app/node_modules ./node_modules -COPY --from=builder /usr/crowd/app/services/base.tsconfig.json ./services/base.tsconfig.json -COPY --from=builder /usr/crowd/app/services/libs ./services/libs -COPY --from=builder /usr/crowd/app/services/apps/integration_sync_worker/ ./services/apps/integration_sync_worker diff --git a/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore b/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore deleted file mode 100644 index 4eaeed9149..0000000000 --- a/scripts/services/docker/Dockerfile.integration_sync_worker.dockerignore +++ /dev/null @@ -1,19 +0,0 @@ -**/.git -**/node_modules -**/venv* -**/.webpack -**/.serverless -**/.env -**/.env.* -**/.idea -**/.vscode -**/dist -backend/src/serverless/microservices/python -.vscode/ -.github/ -frontend/ -scripts/ -.flake8 -*.md -Makefile -backend/ \ No newline at end of file diff --git a/services/libs/common/src/env.ts b/services/libs/common/src/env.ts index b30d402409..75e0c94936 100644 --- a/services/libs/common/src/env.ts +++ b/services/libs/common/src/env.ts @@ -43,18 +43,6 @@ export const SEARCH_SYNC_WORKER_PARTITIONS: Record = : undefined, } -export const INTEGRATION_SYNC_WORKER_PARTITIONS: Record = { - [QueuePriorityLevel.HIGH]: process.env.INTEGRATION_SYNC_WORKER_HIGH_PARTITIONS - ? Number(process.env.INTEGRATION_SYNC_WORKER_HIGH_PARTITIONS) - : undefined, - [QueuePriorityLevel.NORMAL]: process.env.INTEGRATION_SYNC_WORKER_NORMAL_PARTITIONS - ? Number(process.env.INTEGRATION_SYNC_WORKER_NORMAL_PARTITIONS) - : undefined, - [QueuePriorityLevel.SYSTEM]: process.env.INTEGRATION_SYNC_WORKER_SYSTEM_PARTITIONS - ? Number(process.env.INTEGRATION_SYNC_WORKER_SYSTEM_PARTITIONS) - : undefined, -} - export const INTEGRATION_RUN_WORKER_PARTITIONS: Record = { [QueuePriorityLevel.HIGH]: process.env.INTEGRATION_RUN_WORKER_HIGH_PARTITIONS ? Number(process.env.INTEGRATION_RUN_WORKER_HIGH_PARTITIONS) diff --git a/services/libs/queue/src/config.ts b/services/libs/queue/src/config.ts index 23bd128f6b..f114e68620 100644 --- a/services/libs/queue/src/config.ts +++ b/services/libs/queue/src/config.ts @@ -21,8 +21,3 @@ export const SEARCH_SYNC_WORKER_QUEUE_SETTINGS = { [QueueVendor.KAFKA]: KafkaQueueConfig.SEARCH_SYNC_WORKER_QUEUE_SETTINGS, [QueueVendor.SQS]: SqsQueueConfig.SEARCH_SYNC_WORKER_QUEUE_SETTINGS, } - -export const INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS = { - [QueueVendor.KAFKA]: KafkaQueueConfig.INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS, - [QueueVendor.SQS]: SqsQueueConfig.INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS, -} diff --git a/services/libs/queue/src/vendors/sqs/config.ts b/services/libs/queue/src/vendors/sqs/config.ts index 593135d034..70e030e335 100644 --- a/services/libs/queue/src/vendors/sqs/config.ts +++ b/services/libs/queue/src/vendors/sqs/config.ts @@ -51,21 +51,9 @@ export const SEARCH_SYNC_WORKER_QUEUE_SETTINGS: ISqsConfig = { fifoThroughputLimit: SqsFifoThroughputLimitType.PER_MESSAGE_GROUP_ID, } -export const INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS: ISqsConfig = { - name: CrowdQueue.INTEGRATION_SYNC_WORKER, - type: SqsQueueType.FIFO, - waitTimeSeconds: 20, // seconds - visibilityTimeout: 30, // seconds - messageRetentionPeriod: 345600, // 4 days - deliveryDelay: 0, - deduplicationScope: SqsQueueDeduplicationType.MESSAGE_GROUP, - fifoThroughputLimit: SqsFifoThroughputLimitType.PER_MESSAGE_GROUP_ID, -} - export const configMap = { [CrowdQueue.INTEGRATION_RUN_WORKER]: INTEGRATION_RUN_WORKER_QUEUE_SETTINGS, [CrowdQueue.INTEGRATION_STREAM_WORKER]: INTEGRATION_STREAM_WORKER_QUEUE_SETTINGS, [CrowdQueue.DATA_SINK_WORKER]: DATA_SINK_WORKER_QUEUE_SETTINGS, [CrowdQueue.SEARCH_SYNC_WORKER]: SEARCH_SYNC_WORKER_QUEUE_SETTINGS, - [CrowdQueue.INTEGRATION_SYNC_WORKER]: INTEGRATION_SYNC_WORKER_QUEUE_SETTINGS, } From b7cef70c8868b666701062f04e081a931cbec4cc Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 10 Jan 2025 14:55:20 +0530 Subject: [PATCH 16/25] fix --- backend/src/conf/index.ts | 6 +++--- .../repositories/integrationRepository.ts | 10 ---------- .../database/repositories/memberRepository.ts | 16 ---------------- services/apps/data_sink_worker/src/conf/index.ts | 10 ++++++++++ 4 files changed, 13 insertions(+), 29 deletions(-) diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index 45a175fa42..10d2edbed7 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -6,6 +6,7 @@ import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' import { IGithubIssueReporterConfiguration, IJiraIssueReporterConfiguration } from '@crowd/types' +import { ITemporalConfig } from '@crowd/temporal' import { ApiConfiguration, Auth0Configuration, @@ -21,7 +22,6 @@ import { GithubTokenConfiguration, GitlabConfiguration, GoogleConfiguration, - IBackendTemporalConfig, IOpenSearchConfig, IOpenStatusApiConfig, IRedditConfig, @@ -152,8 +152,8 @@ export const WEEKLY_EMAILS_CONFIG: WeeklyEmailsConfiguration = export const CROWD_ANALYTICS_CONFIG: CrowdAnalyticsConfiguration = config.get('crowdAnalytics') -export const TEMPORAL_CONFIG: IBackendTemporalConfig = - config.get('temporal') +export const TEMPORAL_CONFIG: ITemporalConfig = + config.get('temporal') export const SEARCH_SYNC_API_CONFIG: ISearchSyncApiConfig = config.get('searchSyncApi') diff --git a/backend/src/database/repositories/integrationRepository.ts b/backend/src/database/repositories/integrationRepository.ts index badf8d0852..ecd49e3ff2 100644 --- a/backend/src/database/repositories/integrationRepository.ts +++ b/backend/src/database/repositories/integrationRepository.ts @@ -18,8 +18,6 @@ import { IRepositoryOptions } from './IRepositoryOptions' import AuditLogRepository from './auditLogRepository' import QueryParser from './filters/queryParser' import { QueryOutput } from './filters/queryTypes' -import MemberSyncRemoteRepository from './memberSyncRemoteRepository' -import OrganizationSyncRemoteRepository from './organizationSyncRemoteRepository' import SequelizeRepository from './sequelizeRepository' const { Op } = Sequelize @@ -170,14 +168,6 @@ class IntegrationRepository { }, ) - // delete syncRemote rows coming from integration - await new MemberSyncRemoteRepository({ ...options, transaction }).destroyAllIntegration([ - record.id, - ]) - await new OrganizationSyncRemoteRepository({ ...options, transaction }).destroyAllIntegration([ - record.id, - ]) - await this._createAuditLog(AuditLogRepository.DELETE, record, record, options) } diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index 507b48a6e0..4e3b84b9da 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -67,7 +67,6 @@ import { SegmentProjectGroupNestedData, SegmentProjectNestedData, SegmentType, - SyncStatus, } from '@crowd/types' import { KUBE_MODE, SERVICE } from '@/conf' @@ -85,7 +84,6 @@ import { IRepositoryOptions } from './IRepositoryOptions' import AuditLogRepository from './auditLogRepository' import MemberAttributeSettingsRepository from './memberAttributeSettingsRepository' import MemberSegmentAffiliationRepository from './memberSegmentAffiliationRepository' -import MemberSyncRemoteRepository from './memberSyncRemoteRepository' import OrganizationRepository from './organizationRepository' import SegmentRepository from './segmentRepository' import SequelizeRepository from './sequelizeRepository' @@ -2698,20 +2696,6 @@ class MemberRepository { output.affiliations = await this.getAffiliations(record.id, options) - const manualSyncRemote = await new MemberSyncRemoteRepository(options).findMemberManualSync( - record.id, - ) - - for (const syncRemote of manualSyncRemote) { - if (output.attributes?.syncRemote) { - output.attributes.syncRemote[syncRemote.platform] = syncRemote.status === SyncStatus.ACTIVE - } else { - output.attributes.syncRemote = { - [syncRemote.platform]: syncRemote.status === SyncStatus.ACTIVE, - } - } - } - return output } diff --git a/services/apps/data_sink_worker/src/conf/index.ts b/services/apps/data_sink_worker/src/conf/index.ts index 1b38c6d29d..55759a9f05 100644 --- a/services/apps/data_sink_worker/src/conf/index.ts +++ b/services/apps/data_sink_worker/src/conf/index.ts @@ -4,6 +4,7 @@ import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' +import { ITemporalConfig } from '@crowd/temporal' import { QueuePriorityLevel } from '@crowd/types' export interface ISlackAlertingConfig { @@ -55,6 +56,15 @@ export const SLACK_ALERTING_CONFIG = (): ISlackAlertingConfig => { return slackAlertingConfig } +let temporalConfig: ITemporalConfig | undefined +export const TEMPORAL_CONFIG = (): ITemporalConfig | undefined => { + if (temporalConfig) return temporalConfig + + temporalConfig = config.get('temporal') + + return temporalConfig +} + export const SEARCH_SYNC_API_CONFIG = (): ISearchSyncApiConfig => { return config.get('searchSyncApi') } From 3605117cf74a39dc64be46adb8e4adae9f182826 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 10 Jan 2025 15:38:03 +0530 Subject: [PATCH 17/25] run prettier --- backend/src/conf/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index 10d2edbed7..c7ef999fb0 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -4,9 +4,9 @@ import { IDatabaseConfig } from '@crowd/data-access-layer/src/database' import { ISearchSyncApiConfig } from '@crowd/opensearch' import { IQueueClientConfig } from '@crowd/queue' import { IRedisConfiguration } from '@crowd/redis' +import { ITemporalConfig } from '@crowd/temporal' import { IGithubIssueReporterConfiguration, IJiraIssueReporterConfiguration } from '@crowd/types' -import { ITemporalConfig } from '@crowd/temporal' import { ApiConfiguration, Auth0Configuration, @@ -152,8 +152,7 @@ export const WEEKLY_EMAILS_CONFIG: WeeklyEmailsConfiguration = export const CROWD_ANALYTICS_CONFIG: CrowdAnalyticsConfiguration = config.get('crowdAnalytics') -export const TEMPORAL_CONFIG: ITemporalConfig = - config.get('temporal') +export const TEMPORAL_CONFIG: ITemporalConfig = config.get('temporal') export const SEARCH_SYNC_API_CONFIG: ISearchSyncApiConfig = config.get('searchSyncApi') From 728a18f3650c9856200b567d4deccb0a075afcae Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 13 Jan 2025 22:30:04 +0530 Subject: [PATCH 18/25] fix pnpm conflicts --- pnpm-lock.yaml | 126 ++----------------------------------------------- 1 file changed, 5 insertions(+), 121 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db7c15fe8a..efda1fd52b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -497,67 +497,6 @@ importers: nodemon: specifier: ^3.0.1 version: 3.1.9 -<<<<<<< HEAD -======= - - services/apps/automations_worker: - dependencies: - '@crowd/archetype-standard': - specifier: workspace:* - version: link:../../archetypes/standard - '@crowd/archetype-worker': - specifier: workspace:* - version: link:../../archetypes/worker - '@crowd/common': - specifier: workspace:* - version: link:../../libs/common - '@crowd/data-access-layer': - specifier: workspace:* - version: link:../../libs/data-access-layer - '@crowd/integrations': - specifier: workspace:* - version: link:../../libs/integrations - '@crowd/logging': - specifier: workspace:* - version: link:../../libs/logging - '@crowd/redis': - specifier: workspace:* - version: link:../../libs/redis - '@crowd/types': - specifier: workspace:* - version: link:../../libs/types - '@temporalio/workflow': - specifier: ~1.11.1 - version: 1.11.5 - html-to-mrkdwn-ts: - specifier: ^1.1.0 - version: 1.1.0 - lodash.clonedeep: - specifier: ^4.5.0 - version: 4.5.0 - lodash.merge: - specifier: ^4.6.2 - version: 4.6.2 - superagent: - specifier: ^8.1.2 - version: 8.1.2 - tsx: - specifier: ^4.7.1 - version: 4.19.2 - typescript: - specifier: ^5.6.3 - version: 5.7.2 - devDependencies: - '@types/node': - specifier: ^20.8.2 - version: 20.17.12 - '@types/superagent': - specifier: ^4.1.20 - version: 4.1.24 - nodemon: - specifier: ^3.0.1 - version: 3.1.9 ->>>>>>> main services/apps/cache_worker: dependencies: @@ -882,55 +821,6 @@ importers: '@types/node': specifier: ^18.16.3 version: 18.19.70 -<<<<<<< HEAD -======= - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - - services/apps/integration_sync_worker: - dependencies: - '@crowd/common': - specifier: workspace:* - version: link:../../libs/common - '@crowd/data-access-layer': - specifier: workspace:* - version: link:../../libs/data-access-layer - '@crowd/integrations': - specifier: workspace:* - version: link:../../libs/integrations - '@crowd/logging': - specifier: workspace:* - version: link:../../libs/logging - '@crowd/opensearch': - specifier: workspace:* - version: link:../../libs/opensearch - '@crowd/queue': - specifier: workspace:* - version: link:../../libs/queue - '@crowd/types': - specifier: workspace:* - version: link:../../libs/types - '@opensearch-project/opensearch': - specifier: ^2.11.0 - version: 2.13.0 - config: - specifier: ^3.3.9 - version: 3.3.12 - tsx: - specifier: ^4.7.1 - version: 4.19.2 - typescript: - specifier: ^5.6.3 - version: 5.7.2 - devDependencies: - '@types/config': - specifier: ^3.3.0 - version: 3.3.5 - '@types/node': - specifier: ^18.16.3 - version: 18.19.70 ->>>>>>> main nodemon: specifier: ^2.0.22 version: 2.0.22 @@ -6513,10 +6403,6 @@ packages: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -11221,7 +11107,7 @@ snapshots: exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 @@ -15433,14 +15319,12 @@ snapshots: istanbul-lib-coverage@3.2.0: {} - istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.26.0 '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -15450,21 +15334,21 @@ snapshots: '@babel/core': 7.26.0 '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 semver: 7.6.3 transitivePeerDependencies: - supports-color istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 supports-color: 7.2.0 istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.4.0(supports-color@5.5.0) - istanbul-lib-coverage: 3.2.2 + istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color From ed4c52b3ae6cad03fdfd635449009d7616763188 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 13 Jan 2025 22:39:59 +0530 Subject: [PATCH 19/25] fix pnpm lock --- pnpm-lock.yaml | 240 ------------------------------------------------- 1 file changed, 240 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de4e1898f4..f2078c82e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6072,29 +6072,6 @@ packages: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} -<<<<<<< HEAD - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - -======= ->>>>>>> main iterate-object@1.3.4: resolution: {integrity: sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==} @@ -10335,181 +10312,6 @@ snapshots: '@isaacs/ttlcache@1.4.1': {} -<<<<<<< HEAD - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.12 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.12 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@18.0.6)(typescript@5.7.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.12 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.12 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.12 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.26.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.12 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - -======= ->>>>>>> main '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -14447,48 +14249,6 @@ snapshots: istanbul-lib-coverage@3.2.0: {} -<<<<<<< HEAD - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.0(supports-color@5.5.0) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - -======= ->>>>>>> main iterate-object@1.3.4: {} jackspeak@3.4.3: From 265cdb20ede2abab911e32429c3af8f3ee210f36 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 13 Jan 2025 22:49:59 +0530 Subject: [PATCH 20/25] revert discord --- .../helpers/discordAuthenticate.ts | 9 ++++ backend/src/services/integrationService.ts | 52 ++++++++++++++++++- backend/src/types/webhooks.ts | 1 + scripts/builders/backend.env | 2 +- scripts/cli | 4 +- .../integration_run_worker/src/queue/index.ts | 4 ++ 6 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 backend/src/api/integration/helpers/discordAuthenticate.ts diff --git a/backend/src/api/integration/helpers/discordAuthenticate.ts b/backend/src/api/integration/helpers/discordAuthenticate.ts new file mode 100644 index 0000000000..1bec25085e --- /dev/null +++ b/backend/src/api/integration/helpers/discordAuthenticate.ts @@ -0,0 +1,9 @@ +import Permissions from '../../../security/permissions' +import IntegrationService from '../../../services/integrationService' +import PermissionChecker from '../../../services/user/permissionChecker' + +export default async (req, res) => { + new PermissionChecker(req).validateHas(Permissions.values.tenantEdit) + const payload = await new IntegrationService(req).discordConnect(req.params.guild_id) + await req.responseHandler.success(req, res, payload) +} diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 3160bffbe9..18db74e691 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -27,6 +27,7 @@ import { } from '@/serverless/integrations/usecases/groupsio/types' import { + DISCORD_CONFIG, GITHUB_CONFIG, GITHUB_TOKEN_CONFIG, GITLAB_CONFIG, @@ -45,11 +46,16 @@ import { } from '../serverless/integrations/usecases/github/rest/getRemoteStats' import { getOrganizations } from '../serverless/integrations/usecases/linkedin/getOrganizations' import getToken from '../serverless/integrations/usecases/nango/getToken' -import { getIntegrationRunWorkerEmitter } from '../serverless/utils/queueService' +import { + getIntegrationRunWorkerEmitter, +} from '../serverless/utils/queueService' import { encryptData } from '../utils/crypto' import { IServiceOptions } from './IServiceOptions' + +const discordToken = DISCORD_CONFIG.token || DISCORD_CONFIG.token2 + export default class IntegrationService { options: IServiceOptions @@ -625,6 +631,50 @@ export default class IntegrationService { } } + /** + * Adds discord integration to a tenant + * @param guildId Guild id of the discord server + * @returns integration object + */ + async discordConnect(guildId) { + const transaction = await SequelizeRepository.createTransaction(this.options) + + let integration + + try { + this.options.log.info('Creating Discord integration!') + integration = await this.createOrUpdate( + { + platform: PlatformType.DISCORD, + integrationIdentifier: guildId, + token: discordToken, + settings: { channels: [], updateMemberAttributes: true }, + status: 'in-progress', + }, + transaction, + ) + + await SequelizeRepository.commitTransaction(transaction) + } catch (err) { + await SequelizeRepository.rollbackTransaction(transaction) + throw err + } + + this.options.log.info( + { tenantId: integration.tenantId }, + 'Sending Discord message to int-run-worker!', + ) + const emitter = await getIntegrationRunWorkerEmitter() + await emitter.triggerIntegrationRun( + integration.tenantId, + integration.platform, + integration.id, + true, + ) + + return integration + } + async linkedinOnboard(organizationId) { let integration try { diff --git a/backend/src/types/webhooks.ts b/backend/src/types/webhooks.ts index 59530bc186..91f7524ca8 100644 --- a/backend/src/types/webhooks.ts +++ b/backend/src/types/webhooks.ts @@ -9,6 +9,7 @@ export enum WebhookState { export enum WebhookType { GITHUB = 'GITHUB', + DISCORD = 'DISCORD', DISCOURSE = 'DISCOURSE', GROUPSIO = 'GROUPSIO', } diff --git a/scripts/builders/backend.env b/scripts/builders/backend.env index 6406d000da..0d25b68d51 100644 --- a/scripts/builders/backend.env +++ b/scripts/builders/backend.env @@ -1,4 +1,4 @@ DOCKERFILE="./services/docker/Dockerfile.backend" CONTEXT="../" REPO="crowddotdev/backend" -SERVICES="api job-generator" \ No newline at end of file +SERVICES="api job-generator discord-ws" \ No newline at end of file diff --git a/scripts/cli b/scripts/cli index c062fc7976..a91019b497 100755 --- a/scripts/cli +++ b/scripts/cli @@ -741,12 +741,12 @@ while test $# -gt 0; do exit ;; start-e2e) - declare -a INGORED_SERVICES=("job-generator" "data-sink-worker" "integration-run-worker" "integration-stream-worker") + declare -a INGORED_SERVICES=("job-generator" "discord-ws" "data-sink-worker" "integration-run-worker" "integration-stream-worker") start exit ;; start-be) - declare -a INGORED_SERVICES=("frontend") + declare -a INGORED_SERVICES=("frontend" "discord-ws") start exit ;; diff --git a/services/apps/integration_run_worker/src/queue/index.ts b/services/apps/integration_run_worker/src/queue/index.ts index 110a427a02..d7c3434443 100644 --- a/services/apps/integration_run_worker/src/queue/index.ts +++ b/services/apps/integration_run_worker/src/queue/index.ts @@ -13,6 +13,7 @@ import { IntegrationRunWorkerQueueMessageType, QueuePriorityLevel, StartIntegrationRunQueueMessage, + StreamProcessedQueueMessage, } from '@crowd/types' import IntegrationRunService from '../service/integrationRunService' @@ -78,6 +79,9 @@ export class WorkerQueueReceiver extends PrioritizedQueueReciever { msg2.additionalInfo, ) break + case IntegrationRunWorkerQueueMessageType.STREAM_PROCESSED: + await service.handleStreamProcessed((message as StreamProcessedQueueMessage).runId) + break default: throw new Error(`Unknown message type: ${message.type}`) } From 40178b902895521a1a25783866f083eb88887e1a Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 13 Jan 2025 22:57:34 +0530 Subject: [PATCH 21/25] fix --- backend/src/api/auth/authMe.ts | 2 -- backend/src/conf/configTypes.ts | 5 ----- backend/src/conf/index.ts | 4 ---- scripts/cli | 4 ++-- services/apps/data_sink_worker/config/default.json | 1 - 5 files changed, 2 insertions(+), 14 deletions(-) diff --git a/backend/src/api/auth/authMe.ts b/backend/src/api/auth/authMe.ts index 14aab610f3..7046d6dcf6 100644 --- a/backend/src/api/auth/authMe.ts +++ b/backend/src/api/auth/authMe.ts @@ -8,7 +8,5 @@ export default async (req, res) => { const payload = req.currentUser - payload.tenants = await Promise.all(payload.tenants.map(async (tenantUser) => tenantUser)) - await req.responseHandler.success(req, res, payload) } diff --git a/backend/src/conf/configTypes.ts b/backend/src/conf/configTypes.ts index a1163da216..fa5a108683 100644 --- a/backend/src/conf/configTypes.ts +++ b/backend/src/conf/configTypes.ts @@ -99,11 +99,6 @@ export interface SlackConfiguration { appToken?: string } -export interface SlackNotifierConfiguration { - clientId: string - clientSecret: string -} - export interface GoogleConfiguration { clientId: string clientSecret: string diff --git a/backend/src/conf/index.ts b/backend/src/conf/index.ts index e085ba5c9b..d2fe5b5185 100644 --- a/backend/src/conf/index.ts +++ b/backend/src/conf/index.ts @@ -34,7 +34,6 @@ import { ServiceType, SlackAlertingConfiguration, SlackConfiguration, - SlackNotifierConfiguration, SnowflakeConfiguration, StackExchangeConfiguration, TenantMode, @@ -100,9 +99,6 @@ export const TWITTER_CONFIG: TwitterConfiguration = config.get('slack') -export const SLACK_NOTIFIER_CONFIG: SlackNotifierConfiguration = - config.get('slackNotifier') - export const GOOGLE_CONFIG: GoogleConfiguration = config.get('google') export const DISCORD_CONFIG: DiscordConfiguration = config.get('discord') diff --git a/scripts/cli b/scripts/cli index a91019b497..99bf145f15 100755 --- a/scripts/cli +++ b/scripts/cli @@ -847,14 +847,14 @@ while test $# -gt 0; do exit ;; service-restart-fe-dev) - IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") + IGNORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker") DEV=1 kill_all_containers service_start exit ;; clean-start-fe-dev) - INGORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "emails-worker" "entity-merging-worker") + INGORED_SERVICES=("frontend" "python-worker" "job-generator" "discord-ws" "webhook-api" "profiles-worker" "organizations-enrichment-worker" "merge-suggestions-worker" "members-enrichment-worker" "exports-worker" "entity-merging-worker") CLEAN_START=1 DEV=1 start diff --git a/services/apps/data_sink_worker/config/default.json b/services/apps/data_sink_worker/config/default.json index 9313fc56f0..3e51559501 100644 --- a/services/apps/data_sink_worker/config/default.json +++ b/services/apps/data_sink_worker/config/default.json @@ -2,7 +2,6 @@ "db": {}, "queue": {}, "redis": {}, - "unleash": {}, "temporal": {}, "worker": { "maxStreamRetries": 5, From b2a6648ce3050a72c6d45c57fd5fc002d9fc70cc Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 13 Jan 2025 23:04:47 +0530 Subject: [PATCH 22/25] make prettier happy --- backend/src/services/integrationService.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 18db74e691..47b19dc31d 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -46,14 +46,11 @@ import { } from '../serverless/integrations/usecases/github/rest/getRemoteStats' import { getOrganizations } from '../serverless/integrations/usecases/linkedin/getOrganizations' import getToken from '../serverless/integrations/usecases/nango/getToken' -import { - getIntegrationRunWorkerEmitter, -} from '../serverless/utils/queueService' +import { getIntegrationRunWorkerEmitter } from '../serverless/utils/queueService' import { encryptData } from '../utils/crypto' import { IServiceOptions } from './IServiceOptions' - const discordToken = DISCORD_CONFIG.token || DISCORD_CONFIG.token2 export default class IntegrationService { From 8cef66745b22870f23f0e7eb82fc31672f6e0060 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 16 Jan 2025 14:20:50 +0530 Subject: [PATCH 23/25] revert bin/discord-ws --- backend/src/bin/discord-ws.ts | 302 ++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 backend/src/bin/discord-ws.ts diff --git a/backend/src/bin/discord-ws.ts b/backend/src/bin/discord-ws.ts new file mode 100644 index 0000000000..8ce05eda8c --- /dev/null +++ b/backend/src/bin/discord-ws.ts @@ -0,0 +1,302 @@ +import { Client, Events, GatewayIntentBits, MessageType } from 'discord.js' +import fs from 'fs' +import moment from 'moment' +import path from 'path' +import { QueryTypes, Sequelize } from 'sequelize' + +import { processPaginated, timeout } from '@crowd/common' +import { getChildLogger, getServiceLogger } from '@crowd/logging' +import { RedisCache, RedisClient, getRedisClient } from '@crowd/redis' +import { PlatformType } from '@crowd/types' + +import { databaseInit } from '@/database/databaseConnection' +import { + getIntegrationRunWorkerEmitter, + getIntegrationStreamWorkerEmitter, +} from '@/serverless/utils/queueService' + +import { DISCORD_CONFIG, REDIS_CONFIG } from '../conf' +import IncomingWebhookRepository from '../database/repositories/incomingWebhookRepository' +import IntegrationRepository from '../database/repositories/integrationRepository' +import SequelizeRepository from '../database/repositories/sequelizeRepository' +import { DiscordWebsocketEvent, DiscordWebsocketPayload, WebhookType } from '../types/webhooks' + +const log = getServiceLogger() + +async function executeIfNotExists( + key: string, + cache: RedisCache, + fn: () => Promise, + delayMilliseconds?: number, +) { + if (delayMilliseconds) { + await timeout(delayMilliseconds) + } + + const exists = await cache.get(key) + if (!exists) { + await fn() + await cache.set(key, '1', 2 * 60 * 60) + } +} + +async function spawnClient( + name: string, + token: string, + cache: RedisCache, + delayMilliseconds?: number, +) { + const logger = getChildLogger('discord-ws', log, { clientName: name }) + + const repoOptions = await SequelizeRepository.getDefaultIRepositoryOptions() + const repo = new IncomingWebhookRepository(repoOptions) + + const processPayload = async ( + event: DiscordWebsocketEvent, + data: any, + guildId: string, + ): Promise => { + const payload: DiscordWebsocketPayload = { + event, + data, + } + + logger.info({ payload }, 'Processing Discord WS Message!') + + try { + const integration = (await IntegrationRepository.findByIdentifier( + guildId, + PlatformType.DISCORD, + )) as any + + const result = await repo.create({ + tenantId: integration.tenantId, + integrationId: integration.id, + type: WebhookType.DISCORD, + payload, + }) + + const streamEmitter = await getIntegrationStreamWorkerEmitter() + + await streamEmitter.triggerWebhookProcessing( + integration.tenantId, + integration.platform, + result.id, + ) + } catch (err) { + if (err.code === 404) { + logger.warn({ guildId }, 'No integration found for incoming Discord WS Message!') + } else { + logger.error( + err, + { + discordPayload: JSON.stringify(payload), + guildId, + }, + 'Error processing Discord WS Message!', + ) + } + } + } + + const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.GuildMessageReactions, + GatewayIntentBits.DirectMessages, + GatewayIntentBits.DirectMessageReactions, + GatewayIntentBits.MessageContent, + ], + }) + + // listen to client events + client.on(Events.ClientReady, () => { + logger.info('Discord WS client is ready!') + }) + + client.on(Events.Error, (err) => { + logger.error(err, 'Discord WS client error! Exiting...') + process.exit(1) + }) + + client.on(Events.Debug, (message) => { + logger.debug({ debugMsg: message }, 'Discord WS client debug message!') + }) + + client.on(Events.Warn, (message) => { + logger.warn({ warning: message }, 'Discord WS client warning!') + }) + + // listen to discord events + client.on(Events.GuildMemberAdd, async (m) => { + const member = m as any + await executeIfNotExists( + `member-${member.userId}`, + cache, + async () => { + logger.debug( + { + member: member.displayName, + guildId: member.guildId ?? member.guild.id, + userId: member.userId, + }, + 'Member joined guild!', + ) + await processPayload( + DiscordWebsocketEvent.MEMBER_ADDED, + member, + member.guildId ?? member.guild.id, + ) + }, + delayMilliseconds, + ) + }) + + client.on(Events.MessageCreate, async (message) => { + if (message.type === MessageType.Default || message.type === MessageType.Reply) { + await executeIfNotExists( + `msg-${message.id}`, + cache, + async () => { + logger.debug( + { + guildId: message.guildId, + channelId: message.channelId, + message: message.cleanContent, + authorId: message.author, + }, + 'Message created!', + ) + await processPayload(DiscordWebsocketEvent.MESSAGE_CREATED, message, message.guildId) + }, + delayMilliseconds, + ) + } + }) + + client.on(Events.MessageUpdate, async (oldMessage, newMessage) => { + if (newMessage.type === MessageType.Default && newMessage.editedTimestamp) { + await executeIfNotExists( + `msg-modified-${newMessage.id}-${newMessage.editedTimestamp}`, + cache, + async () => { + logger.debug( + { + guildId: newMessage.guildId, + channelId: newMessage.channelId, + oldMessageId: oldMessage.id, + newMessage: newMessage.cleanContent, + authorId: newMessage.author, + }, + 'Message updated!', + ) + await processPayload( + DiscordWebsocketEvent.MESSAGE_UPDATED, + { + message: newMessage, + oldMessage, + }, + newMessage.guildId, + ) + }, + delayMilliseconds, + ) + } + }) + + await client.login(token) + logger.info('Discord WS client logged in!') +} + +let seq: Sequelize +let redis: RedisClient +const initRedisSeq = async () => { + if (!seq) { + seq = (await databaseInit()).sequelize as Sequelize + } + + if (!redis) { + redis = await getRedisClient(REDIS_CONFIG, true) + } +} +setImmediate(async () => { + // we are saving heartbeat timestamps in redis every 2 seconds + // on boot if we detect that there has been a downtime we should trigger discord integration checks + // so we don't miss anything + await initRedisSeq() + const cache = new RedisCache('discord-ws', redis, log) + + const lastHeartbeat = await cache.get('heartbeat') + let triggerCheck = false + if (!lastHeartbeat) { + log.info('No heartbeat found, triggering check!') + triggerCheck = true + } else { + const diff = moment().diff(lastHeartbeat, 'seconds') + // if we do rolling update deploys (kubernetes default) + // we might catch a heartbeat without the need to trigger a check + if (diff > 5) { + log.warn('Heartbeat is stale, triggering check!') + triggerCheck = true + } + } + + if (triggerCheck) { + const emitter = await getIntegrationRunWorkerEmitter() + + await processPaginated( + async (page) => IntegrationRepository.findAllActive(PlatformType.DISCORD, page, 10), + async (integrations) => { + log.warn(`Found ${integrations.length} integrations to trigger check for!`) + for (const integration of integrations) { + await emitter.triggerIntegrationRun( + integration.tenantId, + integration.platform, + integration.id, + false, + ) + } + }, + ) + } + + await spawnClient( + 'first-app', + DISCORD_CONFIG.token, + cache, + DISCORD_CONFIG.token2 ? 1000 : undefined, + ) + + if (DISCORD_CONFIG.token2) { + await spawnClient('second-app', DISCORD_CONFIG.token2, cache) + } + + setInterval(async () => { + await cache.set('heartbeat', new Date().toISOString()) + }, 2 * 1000) +}) + +const liveFilePath = path.join(__dirname, 'tmp/discord-ws-live.tmp') +const readyFilePath = path.join(__dirname, 'tmp/discord-ws-ready.tmp') + +setInterval(async () => { + try { + log.debug('Checking liveness and readiness for discord ws.') + const [redisPingRes, dbPingRes] = await Promise.all([ + // ping redis, + redis.ping().then((res) => res === 'PONG'), + // ping database + seq.query('select 1', { type: QueryTypes.SELECT }).then((rows) => rows.length === 1), + ]) + if (redisPingRes && dbPingRes) { + await Promise.all([ + fs.promises.open(liveFilePath, 'a').then((file) => file.close()), + fs.promises.open(readyFilePath, 'a').then((file) => file.close()), + ]) + } + } catch (err) { + log.error(`Error checking liveness and readiness for discord ws: ${err}`) + } +}, 5000) \ No newline at end of file From c1e78b1d9f7cc2287453076084af80b698c2b1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Marolt?= Date: Thu, 16 Jan 2025 09:54:53 +0100 Subject: [PATCH 24/25] fixes for local --- backend/config/default.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/config/default.json b/backend/config/default.json index 36d1115943..aac59ef26d 100644 --- a/backend/config/default.json +++ b/backend/config/default.json @@ -50,5 +50,7 @@ "searchSyncApi": {}, "encryption": {}, "openStatusApi": {}, - "gitlab": {} + "gitlab": {}, + "jiraIssueReporter": {}, + "snowflake": {} } From a53f05ab5de446c5976f479462e9855601d2e58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Marolt?= Date: Thu, 16 Jan 2025 10:08:58 +0100 Subject: [PATCH 25/25] fixed linting --- backend/src/bin/discord-ws.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/bin/discord-ws.ts b/backend/src/bin/discord-ws.ts index 8ce05eda8c..ebb1444a31 100644 --- a/backend/src/bin/discord-ws.ts +++ b/backend/src/bin/discord-ws.ts @@ -299,4 +299,4 @@ setInterval(async () => { } catch (err) { log.error(`Error checking liveness and readiness for discord ws: ${err}`) } -}, 5000) \ No newline at end of file +}, 5000)