diff --git a/package.json b/package.json index 216ca673b6..589b515f44 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ }, "patchedDependencies": { "typedi@0.10.0": "patches/typedi@0.10.0.patch", - "@sentry/cli@2.17.0": "patches/@sentry__cli@2.17.0.patch", + "@sentry/cli@2.36.2": "patches/@sentry__cli@2.36.2.patch", "pkce-challenge@3.0.0": "patches/pkce-challenge@3.0.0.patch", "pyodide@0.23.4": "patches/pyodide@0.23.4.patch", "@types/express-serve-static-core@4.17.43": "patches/@types__express-serve-static-core@4.17.43.patch", diff --git a/packages/@n8n/config/src/configs/sentry.config.ts b/packages/@n8n/config/src/configs/sentry.config.ts new file mode 100644 index 0000000000..d1067f9984 --- /dev/null +++ b/packages/@n8n/config/src/configs/sentry.config.ts @@ -0,0 +1,12 @@ +import { Config, Env } from '../decorators'; + +@Config +export class SentryConfig { + /** Sentry DSN for the backend. */ + @Env('N8N_SENTRY_DSN') + backendDsn: string = ''; + + /** Sentry DSN for the frontend . */ + @Env('N8N_FRONTEND_SENTRY_DSN') + frontendDsn: string = ''; +} diff --git a/packages/@n8n/config/src/index.ts b/packages/@n8n/config/src/index.ts index c6e456709c..5098093db4 100644 --- a/packages/@n8n/config/src/index.ts +++ b/packages/@n8n/config/src/index.ts @@ -8,6 +8,7 @@ import { ExternalStorageConfig } from './configs/external-storage.config'; import { NodesConfig } from './configs/nodes.config'; import { PublicApiConfig } from './configs/public-api.config'; import { ScalingModeConfig } from './configs/scaling-mode.config'; +import { SentryConfig } from './configs/sentry.config'; import { TemplatesConfig } from './configs/templates.config'; import { UserManagementConfig } from './configs/user-management.config'; import { VersionNotificationsConfig } from './configs/version-notifications.config'; @@ -49,6 +50,9 @@ export class GlobalConfig { @Nested workflows: WorkflowsConfig; + @Nested + sentry: SentryConfig; + /** Path n8n is deployed to */ @Env('N8N_PATH') path: string = '/'; diff --git a/packages/@n8n/config/test/config.test.ts b/packages/@n8n/config/test/config.test.ts index 1d3e5f971d..11fd97a5db 100644 --- a/packages/@n8n/config/test/config.test.ts +++ b/packages/@n8n/config/test/config.test.ts @@ -221,6 +221,10 @@ describe('GlobalConfig', () => { }, }, }, + sentry: { + backendDsn: '', + frontendDsn: '', + }, }; it('should use all default values when no env variables are defined', () => { diff --git a/packages/cli/src/config/schema.ts b/packages/cli/src/config/schema.ts index 0db300eaf0..e811fe8e10 100644 --- a/packages/cli/src/config/schema.ts +++ b/packages/cli/src/config/schema.ts @@ -452,14 +452,6 @@ export const schema = { env: 'N8N_DIAGNOSTICS_POSTHOG_API_HOST', }, }, - sentry: { - dsn: { - doc: 'Data source name for error tracking on Sentry', - format: String, - default: '', - env: 'N8N_SENTRY_DSN', - }, - }, frontend: { doc: 'Diagnostics config for frontend.', format: String, diff --git a/packages/cli/src/error-reporting.ts b/packages/cli/src/error-reporting.ts index 5628615faa..d1ecd39198 100644 --- a/packages/cli/src/error-reporting.ts +++ b/packages/cli/src/error-reporting.ts @@ -1,9 +1,9 @@ +import { GlobalConfig } from '@n8n/config'; // eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import import { QueryFailedError } from '@n8n/typeorm'; import { createHash } from 'crypto'; import { ErrorReporterProxy, ApplicationError } from 'n8n-workflow'; - -import config from '@/config'; +import Container from 'typedi'; let initialized = false; @@ -14,7 +14,7 @@ export const initErrorHandling = async () => { ErrorReporterProxy.error(error); }); - const dsn = config.getEnv('diagnostics.config.sentry.dsn'); + const dsn = Container.get(GlobalConfig).sentry.backendDsn; if (!dsn) { initialized = true; return; diff --git a/packages/cli/src/events/events.controller.ts b/packages/cli/src/events/events.controller.ts new file mode 100644 index 0000000000..994f803242 --- /dev/null +++ b/packages/cli/src/events/events.controller.ts @@ -0,0 +1,16 @@ +import { Get, RestController } from '@/decorators'; +import { AuthenticatedRequest } from '@/requests'; + +import { EventService } from './event.service'; + +/** This controller holds endpoints that the frontend uses to trigger telemetry events */ +@RestController('/events') +export class EventsController { + constructor(private readonly eventService: EventService) {} + + @Get('/session-started') + sessionStarted(req: AuthenticatedRequest) { + const pushRef = req.headers['push-ref']; + this.eventService.emit('session-started', { pushRef }); + } +} diff --git a/packages/cli/src/requests.ts b/packages/cli/src/requests.ts index 7bdc0ac74d..5afe97f31a 100644 --- a/packages/cli/src/requests.ts +++ b/packages/cli/src/requests.ts @@ -49,6 +49,9 @@ export type AuthenticatedRequest< > = Omit, 'user' | 'cookies'> & { user: User; cookies: Record; + headers: express.Request['headers'] & { + 'push-ref': string; + }; }; // ---------------------------------- diff --git a/packages/cli/src/server.ts b/packages/cli/src/server.ts index 08f74b2936..27ac3b09a1 100644 --- a/packages/cli/src/server.ts +++ b/packages/cli/src/server.ts @@ -1,4 +1,3 @@ -import type { FrontendSettings } from '@n8n/api-types'; import cookieParser from 'cookie-parser'; import express from 'express'; import { access as fsAccess } from 'fs/promises'; @@ -21,6 +20,7 @@ import { import { CredentialsOverwrites } from '@/credentials-overwrites'; import { ControllerRegistry } from '@/decorators'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; +import { EventService } from '@/events/event.service'; import { LogStreamingEventRelay } from '@/events/log-streaming-event-relay'; import type { ICredentialsOverwrite } from '@/interfaces'; import { isLdapEnabled } from '@/ldap/helpers.ee'; @@ -58,12 +58,12 @@ import '@/controllers/user-settings.controller'; import '@/controllers/workflow-statistics.controller'; import '@/credentials/credentials.controller'; import '@/eventbus/event-bus.controller'; +import '@/events/events.controller'; import '@/executions/executions.controller'; import '@/external-secrets/external-secrets.controller.ee'; import '@/license/license.controller'; import '@/workflows/workflow-history/workflow-history.controller.ee'; import '@/workflows/workflows.controller'; -import { EventService } from './events/event.service'; @Service() export class Server extends AbstractServer { @@ -169,10 +169,6 @@ export class Server extends AbstractServer { const { frontendService } = this; if (frontendService) { - frontendService.addToSettings({ - versionCli: N8N_VERSION, - }); - await this.externalHooks.run('frontend.settings', [frontendService.getSettings()]); } @@ -244,11 +240,22 @@ export class Server extends AbstractServer { // Returns the current settings for the UI this.app.get( `/${this.restEndpoint}/settings`, - ResponseHelper.send( - async (req: express.Request): Promise => - frontendService.getSettings(req.headers['push-ref'] as string), - ), + ResponseHelper.send(async () => frontendService.getSettings()), ); + + // Return Sentry config as a static file + this.app.get(`/${this.restEndpoint}/sentry.js`, (_, res) => { + res.type('js'); + res.write('window.sentry='); + res.write( + JSON.stringify({ + dsn: this.globalConfig.sentry.frontendDsn, + environment: process.env.ENVIRONMENT || 'development', + release: N8N_VERSION, + }), + ); + res.end(); + }); } // ---------------------------------------- diff --git a/packages/cli/src/services/frontend.service.ts b/packages/cli/src/services/frontend.service.ts index 1693aa939a..6ac3a1863c 100644 --- a/packages/cli/src/services/frontend.service.ts +++ b/packages/cli/src/services/frontend.service.ts @@ -10,11 +10,10 @@ import path from 'path'; import { Container, Service } from 'typedi'; import config from '@/config'; -import { LICENSE_FEATURES } from '@/constants'; +import { LICENSE_FEATURES, N8N_VERSION } from '@/constants'; import { CredentialTypes } from '@/credential-types'; import { CredentialsOverwrites } from '@/credentials-overwrites'; import { getVariablesLimit } from '@/environments/variables/environment-helpers'; -import { EventService } from '@/events/event.service'; import { getLdapLoginLabel } from '@/ldap/helpers.ee'; import { License } from '@/license'; import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; @@ -47,7 +46,6 @@ export class FrontendService { private readonly mailer: UserManagementMailer, private readonly instanceSettings: InstanceSettings, private readonly urlService: UrlService, - private readonly eventService: EventService, ) { loadNodesAndCredentials.addPostProcessor(async () => await this.generateTypes()); void this.generateTypes(); @@ -102,7 +100,7 @@ export class FrontendService { urlBaseEditor: instanceBaseUrl, binaryDataMode: config.getEnv('binaryDataManager.mode'), nodeJsVersion: process.version.replace(/^v/, ''), - versionCli: '', + versionCli: N8N_VERSION, concurrency: config.getEnv('executions.concurrency.productionLimit'), authCookie: { secure: config.getEnv('secure_cookie'), @@ -242,9 +240,7 @@ export class FrontendService { this.writeStaticJSON('credentials', credentials); } - getSettings(pushRef?: string): FrontendSettings { - this.eventService.emit('session-started', { pushRef }); - + getSettings(): FrontendSettings { const restEndpoint = this.globalConfig.endpoints.rest; // Update all urls, in case `WEBHOOK_URL` was updated by `--tunnel` @@ -344,10 +340,6 @@ export class FrontendService { return this.settings; } - addToSettings(newSettings: Record) { - this.settings = { ...this.settings, ...newSettings }; - } - private writeStaticJSON(name: string, data: INodeTypeBaseDescription[] | ICredentialType[]) { const { staticCacheDir } = this.instanceSettings; const filePath = path.join(staticCacheDir, `types/${name}.json`); diff --git a/packages/cli/src/workflows/workflows.controller.ts b/packages/cli/src/workflows/workflows.controller.ts index 57f46002c2..30ca5c9773 100644 --- a/packages/cli/src/workflows/workflows.controller.ts +++ b/packages/cli/src/workflows/workflows.controller.ts @@ -404,7 +404,7 @@ export class WorkflowsController { return await this.workflowExecutionService.executeManually( req.body, req.user, - req.headers['push-ref'] as string, + req.headers['push-ref'], req.query.partialExecutionVersion === '-1' ? config.getEnv('featureFlags.partialExecutionVersionDefault') : req.query.partialExecutionVersion, diff --git a/packages/editor-ui/index.html b/packages/editor-ui/index.html index 12dbfaeb9d..8176735fdd 100644 --- a/packages/editor-ui/index.html +++ b/packages/editor-ui/index.html @@ -9,6 +9,7 @@ window.BASE_PATH = '/{{BASE_PATH}}/'; window.REST_ENDPOINT = '{{REST_ENDPOINT}}'; + n8n.io - Workflow Automation diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 5e67b123d3..500b96affd 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -38,6 +38,7 @@ "@n8n/codemirror-lang": "workspace:*", "@n8n/codemirror-lang-sql": "^1.0.2", "@n8n/permissions": "workspace:*", + "@sentry/vue": "^8.31.0", "@vue-flow/background": "^1.3.0", "@vue-flow/controls": "^1.1.1", "@vue-flow/core": "^1.33.5", @@ -83,7 +84,7 @@ "@faker-js/faker": "^8.0.2", "@iconify/json": "^2.2.228", "@pinia/testing": "^0.1.3", - "@sentry/vite-plugin": "^2.5.0", + "@sentry/vite-plugin": "^2.22.4", "@types/dateformat": "^3.0.0", "@types/file-saver": "^2.0.1", "@types/humanize-duration": "^3.27.1", diff --git a/packages/editor-ui/src/api/events.ts b/packages/editor-ui/src/api/events.ts new file mode 100644 index 0000000000..00182bcaa1 --- /dev/null +++ b/packages/editor-ui/src/api/events.ts @@ -0,0 +1,6 @@ +import type { IRestApiContext } from '@/Interface'; +import { makeRestApiRequest } from '@/utils/apiUtils'; + +export async function sessionStarted(context: IRestApiContext): Promise { + return await makeRestApiRequest(context, 'GET', '/events/session-started'); +} diff --git a/packages/editor-ui/src/main.ts b/packages/editor-ui/src/main.ts index 66b7d6e279..30721aa209 100644 --- a/packages/editor-ui/src/main.ts +++ b/packages/editor-ui/src/main.ts @@ -1,4 +1,5 @@ import { createApp } from 'vue'; +import * as Sentry from '@sentry/vue'; import '@vue-flow/core/dist/style.css'; import '@vue-flow/core/dist/theme-default.css'; @@ -34,6 +35,11 @@ const pinia = createPinia(); const app = createApp(App); +if (window.sentry?.dsn) { + const { dsn, release, environment } = window.sentry; + Sentry.init({ app, dsn, release, environment }); +} + app.use(TelemetryPlugin); app.use(PiniaVuePlugin); app.use(I18nPlugin); diff --git a/packages/editor-ui/src/shims.d.ts b/packages/editor-ui/src/shims.d.ts index e0a9a886af..83cd8850cd 100644 --- a/packages/editor-ui/src/shims.d.ts +++ b/packages/editor-ui/src/shims.d.ts @@ -1,6 +1,7 @@ import type { VNode, ComponentPublicInstance } from 'vue'; import type { PartialDeep } from 'type-fest'; import type { ExternalHooks } from '@/types/externalHooks'; +import type { FrontendSettings } from '@n8n/api-types'; export {}; @@ -17,6 +18,7 @@ declare global { interface Window { BASE_PATH: string; REST_ENDPOINT: string; + sentry?: { dsn?: string; environment: string; release: string }; n8nExternalHooks?: PartialDeep; preventNodeViewBeforeUnload?: boolean; maxPinnedDataSize?: number; diff --git a/packages/editor-ui/vite.config.mts b/packages/editor-ui/vite.config.mts index f6824d31a5..80972dcd33 100644 --- a/packages/editor-ui/vite.config.mts +++ b/packages/editor-ui/vite.config.mts @@ -93,13 +93,13 @@ if (release && authToken) { sentryVitePlugin({ org: 'n8nio', project: 'instance-frontend', - // Specify the directory containing build artifacts - include: './dist', // Auth tokens can be obtained from https://sentry.io/settings/account/api/auth-tokens/ // and needs the `project:releases` and `org:read` scopes authToken, telemetry: false, - release, + release: { + name: release, + }, }), ); } diff --git a/patches/@sentry__cli@2.17.0.patch b/patches/@sentry__cli@2.36.2.patch similarity index 77% rename from patches/@sentry__cli@2.17.0.patch rename to patches/@sentry__cli@2.36.2.patch index f4325eaab4..04882a4fa0 100644 --- a/patches/@sentry__cli@2.17.0.patch +++ b/patches/@sentry__cli@2.36.2.patch @@ -1,5 +1,5 @@ diff --git a/js/helper.js b/js/helper.js -index a4a7a61f0e226d7cb45f8d5db34c35cc9e62cf96..38fd3ec2214970b1c5dd22fdff902ff3b5eeddde 100644 +index 37798b9444d39a8713327ed12adf3e76f03188a4..08d49b7a5c058c4d29c9929c0c524c85b14b330e 100644 --- a/js/helper.js +++ b/js/helper.js @@ -15,6 +15,7 @@ function getBinaryPath() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c1a5be995..6ee921cd29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,9 +102,9 @@ overrides: ws: '>=8.17.1' patchedDependencies: - '@sentry/cli@2.17.0': - hash: nchnoezkq6p37qaiku3vrpwraq - path: patches/@sentry__cli@2.17.0.patch + '@sentry/cli@2.36.2': + hash: saib6xuadkfhahfipsdedqib2i + path: patches/@sentry__cli@2.36.2.patch '@types/express-serve-static-core@4.17.43': hash: 5orrj4qleu2iko5t27vl44u4we path: patches/@types__express-serve-static-core@4.17.43.patch @@ -1325,6 +1325,9 @@ importers: '@n8n/permissions': specifier: workspace:* version: link:../@n8n/permissions + '@sentry/vue': + specifier: ^8.31.0 + version: 8.31.0(vue@3.4.21(typescript@5.6.2)) '@vue-flow/background': specifier: ^1.3.0 version: 1.3.0(@vue-flow/core@1.33.5(vue@3.4.21(typescript@5.6.2)))(vue@3.4.21(typescript@5.6.2)) @@ -1456,8 +1459,8 @@ importers: specifier: ^0.1.3 version: 0.1.3(pinia@2.1.6(typescript@5.6.2)(vue@3.4.21(typescript@5.6.2)))(vue@3.4.21(typescript@5.6.2)) '@sentry/vite-plugin': - specifier: ^2.5.0 - version: 2.5.0(encoding@0.1.13) + specifier: ^2.22.4 + version: 2.22.4(encoding@0.1.13) '@types/dateformat': specifier: ^3.0.0 version: 3.0.1 @@ -1908,10 +1911,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -4050,16 +4049,81 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sentry-internal/browser-utils@8.31.0': + resolution: {integrity: sha512-Bq7TFMhPr1PixRGYkB/6ar9ws7sj224XzQ+hgpz6OxGEc9fQakvD8t/Nn7dp14k3FI/hcBRA6BBvpOKUUuPgGA==} + engines: {node: '>=14.18'} + + '@sentry-internal/feedback@8.31.0': + resolution: {integrity: sha512-R3LcC2IaTe8lgi5AU9h0rMgyVPpaTiMSLRhRlVeQPVmAKCz8pSG/um13q37t0BsXpTaImW9yYQ71Aj6h6IrShQ==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay-canvas@8.31.0': + resolution: {integrity: sha512-ConyrhWozx4HluRj0+9teN4XTC1ndXjxMdJQvDnbLFsQhCCEdwUfaZVshV1CFe9T08Bfyjruaw33yR7pDXYktw==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay@8.31.0': + resolution: {integrity: sha512-r8hmFDwWxeAxpdzBCRWTKQ/QHl8QanFw8XfM0fvFes/H1d/b43Vwc/IiUnsYoMOdooIP8hJFGDKlfq+Y5uVVGA==} + engines: {node: '>=14.18'} + '@sentry-internal/tracing@7.87.0': resolution: {integrity: sha512-HYa0+rfFmYQ/DadXoiuarTSxrcnYDCd/fm0pFuOHjICtfja8IcLegVYP2/r3CgwB+IjquCtJ5kDcqS/NTgUcpA==} engines: {node: '>=8'} - '@sentry/bundler-plugin-core@2.5.0': - resolution: {integrity: sha512-UNjeTSf0Irt/RsC1Xsfxa+RC92mBvjzuWQnvHJ5c+mXwUt+jLcFgGMCSVK/FCDZO+gAeKzmU1+G2UexbsNAP8w==} + '@sentry/babel-plugin-component-annotate@2.22.4': + resolution: {integrity: sha512-hbSq067KwmeKIEkmyzkTNJbmbtx2KRqvpiy9Q/DynI5Z46Nko/ppvgIfyFXK9DelwvEPOqZic4WXTIhO4iv3DA==} engines: {node: '>= 14'} - '@sentry/cli@2.17.0': - resolution: {integrity: sha512-CHIMEg8+YNCpEBDgUctu+DvG3S8+g8Zn9jTE5MMGINNmGkQTMG179LuDE04B/inaCYixLVNpFPTe6Iow3tXjnQ==} + '@sentry/browser@8.31.0': + resolution: {integrity: sha512-LZK0uLPGB4Al+qWc1eaad+H/1SR6CY9a0V2XWpUbNAT3+VkEo0Z/78bW1kb43N0cok87hNPOe+c66SfwdxphVQ==} + engines: {node: '>=14.18'} + + '@sentry/bundler-plugin-core@2.22.4': + resolution: {integrity: sha512-25NiyV3v6mdqOXlpzbbJnq0FHdAu1uTEDr+DU8CzNLjIXlq2Sr2CFZ/mhRcR6daM8OAretJdQ34lu0yHUVeE4Q==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.36.2': + resolution: {integrity: sha512-To64Pq+pcmecEr+gFXiqaZy8oKhyLQLXO/SVDdf16CUL2qpuahE3bO5h9kFacMxPPxOWcgc2btF+4gYa1+bQTA==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.36.2': + resolution: {integrity: sha512-g+FFmj1oJ2iRMsfs1ORz6THOO6MiAR55K9YxdZUBvqfoHLjSMt7Jst43sbZ3O0u55hnfixSKLNzDaTGaM/jxIQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + + '@sentry/cli-linux-arm@2.36.2': + resolution: {integrity: sha512-cRSvOQK97WM0m03k/c+LVAWT042Qz887WP/2Gy64eUi/PfArwb+QZZnsu4FCygxK9jnzgLTo4+ewoJVi17xaLQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + + '@sentry/cli-linux-i686@2.36.2': + resolution: {integrity: sha512-rjxTw/CMd0Q7qlOb7gWFiwn3hJIxNkhbn1bOU54xj9CZvQSCvh10l7l4Y9o8znJLl41c5kMXVq8yuYws9A7AGQ==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + + '@sentry/cli-linux-x64@2.36.2': + resolution: {integrity: sha512-cF8IPFTlwiC7JgVvSW4rS99sxb1W1N//iANxuzqaDswUnmJLi0AJy/jES87qE5GRB6ljaPVMvH7Kq0OCp3bvPA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + + '@sentry/cli-win32-i686@2.36.2': + resolution: {integrity: sha512-YDH/Kcd8JAo1Bg4jtSwF8dr7FZZ8QbYLMx8q/5eenHpq6VdOgPENsTvayLW3cAjWLcm44u8Ed/gcEK0z1IxQmQ==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.36.2': + resolution: {integrity: sha512-Kac8WPbkFSVAJqPAVRBiW0uij9PVoXo0owf+EDeIIDLs9yxZat0d1xgyQPlUWrCGdxowMSbDvaSUz1YnE7MUmg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.36.2': + resolution: {integrity: sha512-QoijP9TnO1UVNnRKtH718jlu/F9bBki6ffrOfmcjxkvLT6Q3nBMmqhYNH/AJV/RcgqLd6noWss4fbDMXZLzgIQ==} engines: {node: '>= 10'} hasBin: true @@ -4067,6 +4131,10 @@ packages: resolution: {integrity: sha512-jkoXqK/nuYh8DYS+n7uaSuSIdw4HJemyRkXsWjAEPtEgD7taGMafZGbP5pl+XE38SE59jTBxmKnkUEZOFMgZGA==} engines: {node: '>=8'} + '@sentry/core@8.31.0': + resolution: {integrity: sha512-5zsMBOML18e5a/ZoR5XpcYF59e2kSxb6lTg13u52f/+NA27EPgxKgXim5dz6L/6+0cizgwwmFaZFGJiFc2qoAA==} + engines: {node: '>=14.18'} + '@sentry/integrations@7.87.0': resolution: {integrity: sha512-xbyOQeyfG1sF2PBMIOz3c3i0Y3+8q4UlxoeOhpFe6Vpjek+I/g7onZT6YevT6cWG083cg+rS0VCgPQSUV2lxIw==} engines: {node: '>=8'} @@ -4075,26 +4143,32 @@ packages: resolution: {integrity: sha512-mGcZMCL3/IMTLIRcWLF+H9z2Bb2d34gKmg2rhXqI8BqhhUA551jMRlZv/y4za2Osjy550KwVoNsA1qtEe5mYyQ==} engines: {node: '>=8'} - '@sentry/types@7.60.1': - resolution: {integrity: sha512-8lKKSCOhZ953cWxwnfZwoR3ZFFlZG4P3PQFTaFt/u4LxLh/0zYbdtgvtUqXRURjMCi5P6ddeE9Uw9FGnTJCsTw==} - engines: {node: '>=8'} - '@sentry/types@7.87.0': resolution: {integrity: sha512-w8jKFHq/Llupmr2FezmFgQsnm3y/CnqLjb7s6PstI78E409wrhH7p7oqX/OEuzccH1qNCNwes/3QKvPTRQDB4Q==} engines: {node: '>=8'} - '@sentry/utils@7.60.1': - resolution: {integrity: sha512-ik+5sKGBx4DWuvf6UUKPSafaDiASxP+Xvjg3C9ppop2I/JWxP1FfZ5g22n5ZmPmNahD6clTSoTWly8qyDUlUOw==} - engines: {node: '>=8'} + '@sentry/types@8.31.0': + resolution: {integrity: sha512-prRM/n5nlP+xQZSpdEkSR8BwwZtgsLk0NbI8eCjTMu2isVlrlggop8pVaJb7y9HmElVtDA1Q6y4u8TD2htQKFQ==} + engines: {node: '>=14.18'} '@sentry/utils@7.87.0': resolution: {integrity: sha512-7xgtPTnTNP/4IznFMFXxltuaXfLvzznrYCDMv9ny8EeUjJqlLX3CVA8Qq3YALsLCQCKcrGRARbAcd/EGG//w2w==} engines: {node: '>=8'} - '@sentry/vite-plugin@2.5.0': - resolution: {integrity: sha512-u5lfIysy6UVzUGn/adyDcRXfzFyip4mLGThTnKeOeA9rCgmJUVnErH8TD8xhTKdpq/MBiQ+KqrC6xG9pKCa96g==} + '@sentry/utils@8.31.0': + resolution: {integrity: sha512-9W2LZ9QIHKc0HSyH/7UmTolc01Q4vX/qMSZk7i1noinlkQtnRUmTP39r1DSITjKCrDHj6zvB/J1RPDUoRcTXxQ==} + engines: {node: '>=14.18'} + + '@sentry/vite-plugin@2.22.4': + resolution: {integrity: sha512-C51PUlTv0BXN3+e9SjPHptNX3b9E0clrsaR5c//l/sFkQjuteDHKChA1gNzZSvfoa3gm9NzZAgpk3hVF2O3nBA==} engines: {node: '>= 14'} + '@sentry/vue@8.31.0': + resolution: {integrity: sha512-w512J2XLs43OZ7KBcdy4ho+IWMf37TQDJ5+JBONC+OLmGo7rixAZZxwIA7nI1/kZsBYEZ6JZL1uPCMrwwe/BsQ==} + engines: {node: '>=14.18'} + peerDependencies: + vue: 2.x || 3.x + '@sevinf/maybe@0.5.0': resolution: {integrity: sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg==} @@ -9205,10 +9279,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} @@ -12660,11 +12730,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -13908,18 +13973,18 @@ snapshots: '@babel/core@7.24.0': dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.6 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@babel/template': 7.24.0 '@babel/traverse': 7.24.0 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 7.6.0 @@ -13928,14 +13993,14 @@ snapshots: '@babel/generator@7.22.9': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/generator@7.23.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -13953,15 +14018,15 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': dependencies: @@ -13970,17 +14035,17 @@ snapshots: '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-validator-identifier': 7.24.7 '@babel/helper-plugin-utils@7.22.5': {} '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-string-parser@7.24.6': {} @@ -13998,7 +14063,7 @@ snapshots: dependencies: '@babel/template': 7.24.0 '@babel/traverse': 7.24.0 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -14094,8 +14159,8 @@ snapshots: '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@babel/traverse@7.24.0': dependencies: @@ -14105,9 +14170,9 @@ snapshots: '@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.6 - '@babel/types': 7.24.6 - debug: 4.3.6(supports-color@8.1.1) + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15835,33 +15900,100 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@sentry-internal/browser-utils@8.31.0': + dependencies: + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + + '@sentry-internal/feedback@8.31.0': + dependencies: + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + + '@sentry-internal/replay-canvas@8.31.0': + dependencies: + '@sentry-internal/replay': 8.31.0 + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + + '@sentry-internal/replay@8.31.0': + dependencies: + '@sentry-internal/browser-utils': 8.31.0 + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + '@sentry-internal/tracing@7.87.0': dependencies: '@sentry/core': 7.87.0 '@sentry/types': 7.87.0 '@sentry/utils': 7.87.0 - '@sentry/bundler-plugin-core@2.5.0(encoding@0.1.13)': + '@sentry/babel-plugin-component-annotate@2.22.4': {} + + '@sentry/browser@8.31.0': dependencies: - '@sentry/cli': 2.17.0(patch_hash=nchnoezkq6p37qaiku3vrpwraq)(encoding@0.1.13) - '@sentry/node': 7.87.0 - '@sentry/utils': 7.60.1 + '@sentry-internal/browser-utils': 8.31.0 + '@sentry-internal/feedback': 8.31.0 + '@sentry-internal/replay': 8.31.0 + '@sentry-internal/replay-canvas': 8.31.0 + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + + '@sentry/bundler-plugin-core@2.22.4(encoding@0.1.13)': + dependencies: + '@babel/core': 7.24.0 + '@sentry/babel-plugin-component-annotate': 2.22.4 + '@sentry/cli': 2.36.2(patch_hash=saib6xuadkfhahfipsdedqib2i)(encoding@0.1.13) dotenv: 16.3.1 find-up: 5.0.0 glob: 9.3.2 - magic-string: 0.27.0 + magic-string: 0.30.8 unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color - '@sentry/cli@2.17.0(patch_hash=nchnoezkq6p37qaiku3vrpwraq)(encoding@0.1.13)': + '@sentry/cli-darwin@2.36.2': + optional: true + + '@sentry/cli-linux-arm64@2.36.2': + optional: true + + '@sentry/cli-linux-arm@2.36.2': + optional: true + + '@sentry/cli-linux-i686@2.36.2': + optional: true + + '@sentry/cli-linux-x64@2.36.2': + optional: true + + '@sentry/cli-win32-i686@2.36.2': + optional: true + + '@sentry/cli-win32-x64@2.36.2': + optional: true + + '@sentry/cli@2.36.2(patch_hash=saib6xuadkfhahfipsdedqib2i)(encoding@0.1.13)': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.36.2 + '@sentry/cli-linux-arm': 2.36.2 + '@sentry/cli-linux-arm64': 2.36.2 + '@sentry/cli-linux-i686': 2.36.2 + '@sentry/cli-linux-x64': 2.36.2 + '@sentry/cli-win32-i686': 2.36.2 + '@sentry/cli-win32-x64': 2.36.2 transitivePeerDependencies: - encoding - supports-color @@ -15871,6 +16003,11 @@ snapshots: '@sentry/types': 7.87.0 '@sentry/utils': 7.87.0 + '@sentry/core@8.31.0': + dependencies: + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + '@sentry/integrations@7.87.0': dependencies: '@sentry/core': 7.87.0 @@ -15888,27 +16025,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/types@7.60.1': {} - '@sentry/types@7.87.0': {} - '@sentry/utils@7.60.1': - dependencies: - '@sentry/types': 7.60.1 - tslib: 2.6.2 + '@sentry/types@8.31.0': {} '@sentry/utils@7.87.0': dependencies: '@sentry/types': 7.87.0 - '@sentry/vite-plugin@2.5.0(encoding@0.1.13)': + '@sentry/utils@8.31.0': dependencies: - '@sentry/bundler-plugin-core': 2.5.0(encoding@0.1.13) + '@sentry/types': 8.31.0 + + '@sentry/vite-plugin@2.22.4(encoding@0.1.13)': + dependencies: + '@sentry/bundler-plugin-core': 2.22.4(encoding@0.1.13) unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color + '@sentry/vue@8.31.0(vue@3.4.21(typescript@5.6.2))': + dependencies: + '@sentry/browser': 8.31.0 + '@sentry/core': 8.31.0 + '@sentry/types': 8.31.0 + '@sentry/utils': 8.31.0 + vue: 3.4.21(typescript@5.6.2) + '@sevinf/maybe@0.5.0': {} '@sideway/address@4.1.5': @@ -17015,24 +17159,24 @@ snapshots: '@types/babel__core@7.20.0': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.2 '@types/babel__generator@7.6.4': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@types/babel__template@7.4.1': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.18.2': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@types/basic-auth@1.1.3': dependencies: @@ -18285,7 +18429,7 @@ snapshots: babel-plugin-jest-hoist@29.5.0: dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.2 @@ -18313,7 +18457,7 @@ snapshots: babel-walk@3.0.0-canary-5: dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 balanced-match@1.0.2: {} @@ -18903,8 +19047,8 @@ snapshots: constantinople@4.0.1: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 content-disposition@0.5.4: dependencies: @@ -20599,7 +20743,7 @@ snapshots: fs.realpath: 1.0.0 minimatch: 7.4.2 minipass: 4.2.5 - path-scurry: 1.10.1 + path-scurry: 1.11.1 global-dirs@3.0.0: dependencies: @@ -21240,7 +21384,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.24.0 - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -21255,7 +21399,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -22339,10 +22483,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -26212,8 +26352,8 @@ snapshots: with@7.0.2: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5