diff --git a/package.json b/package.json index 0e0e50a..5223f4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jill64/sentry-sveltekit-cloudflare", - "version": "0.4.32", + "version": "0.5.0", "description": "Unofficial Sentry Integration for SvelteKit Cloudflare Adapter", "type": "module", "main": "dist/index.js", @@ -46,19 +46,20 @@ }, "devDependencies": { "@playwright/test": "1.39.0", + "@sentry/types": "^7.74.1", "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-svelte": "2.34.0", "prettier-plugin-svelte": "3.0.3", - "typescript": "5.2.2" - }, - "dependencies": { + "typescript": "5.2.2", "@sentry/core": "7.74.1", "@sentry/svelte": "7.74.1", "@sentry/utils": "7.74.1", "@sveltejs/kit": "1.26.0", - "esm-env": "1.0.0", "toucan-js": "3.3.0" + }, + "dependencies": { + "esm-env": "1.0.0" } } diff --git a/packages/lib/scripts/build.ts b/packages/lib/scripts/build.ts index 9ef644d..01df737 100644 --- a/packages/lib/scripts/build.ts +++ b/packages/lib/scripts/build.ts @@ -6,5 +6,5 @@ build({ outfile: '../../dist/index.js', minify: true, format: 'esm', - external: ['esm-env'] + external: ['esm-env', '$app/stores'] }) diff --git a/packages/lib/src/client/addClientIntegrations.ts b/packages/lib/src/client/addClientIntegrations.ts new file mode 100644 index 0000000..b70e469 --- /dev/null +++ b/packages/lib/src/client/addClientIntegrations.ts @@ -0,0 +1,24 @@ +import { hasTracingEnabled } from '@sentry/core' +import { BrowserOptions, BrowserTracing } from '@sentry/svelte' +import { addOrUpdateIntegration } from '@sentry/utils' +import { svelteKitRoutingInstrumentation } from './router.js' + +export const addClientIntegrations = (options: BrowserOptions) => { + let integrations = options.integrations || [] + + if (hasTracingEnabled(options)) { + const defaultBrowserTracingIntegration = new BrowserTracing({ + routingInstrumentation: svelteKitRoutingInstrumentation + }) + + integrations = addOrUpdateIntegration( + defaultBrowserTracingIntegration, + integrations, + { + 'options.routingInstrumentation': svelteKitRoutingInstrumentation + } + ) + } + + options.integrations = integrations +} diff --git a/packages/lib/src/client/applySdkMetadata.ts b/packages/lib/src/client/applySdkMetadata.ts new file mode 100644 index 0000000..fc69562 --- /dev/null +++ b/packages/lib/src/client/applySdkMetadata.ts @@ -0,0 +1,16 @@ +import { SDK_VERSION } from '@sentry/core' +import { BrowserOptions } from '@sentry/svelte' + +const PACKAGE_NAME_PREFIX = 'npm:@sentry/' + +export const applySdkMetadata = (options: BrowserOptions, names: string[]) => { + options._metadata = options._metadata || {} + options._metadata.sdk = options._metadata.sdk || { + name: 'sentry.javascript.sveltekit', + packages: names.map((name) => ({ + name: `${PACKAGE_NAME_PREFIX}${name}`, + version: SDK_VERSION + })), + version: SDK_VERSION + } +} diff --git a/packages/lib/src/client/init.ts b/packages/lib/src/client/init.ts index 2e8d1b5..d100aa8 100644 --- a/packages/lib/src/client/init.ts +++ b/packages/lib/src/client/init.ts @@ -4,6 +4,7 @@ import { addExceptionMechanism } from '@sentry/utils' import type { HandleClientError } from '@sveltejs/kit' import { DEV } from 'esm-env' import { defaultErrorHandler } from './defaultErrorHandler' +import { sentryInit } from './sentryInit' export const init = ( dsn: string, @@ -18,12 +19,12 @@ export const init = ( return (handleError = defaultErrorHandler) => handleError } - Sentry.init({ + sentryInit({ dsn, tracesSampleRate: 1.0, replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - integrations: [new Sentry.BrowserTracing(), new Sentry.Replay()], + integrations: [new Sentry.Replay()], ...sentryOptions }) diff --git a/packages/lib/src/client/restoreFetch.ts b/packages/lib/src/client/restoreFetch.ts new file mode 100644 index 0000000..7e4ea0b --- /dev/null +++ b/packages/lib/src/client/restoreFetch.ts @@ -0,0 +1,11 @@ +import { WINDOW } from '@sentry/svelte' + +export const restoreFetch = (actualFetch: typeof fetch) => { + const globalWithSentryFetchProxy = WINDOW + + // @ts-expect-error TODO: fix this + globalWithSentryFetchProxy._sentryFetchProxy = + globalWithSentryFetchProxy.fetch + + globalWithSentryFetchProxy.fetch = actualFetch +} diff --git a/packages/lib/src/client/router.ts b/packages/lib/src/client/router.ts new file mode 100644 index 0000000..824a5d1 --- /dev/null +++ b/packages/lib/src/client/router.ts @@ -0,0 +1,123 @@ +import { navigating, page } from '$app/stores' +import { getActiveTransaction } from '@sentry/core' +import { WINDOW } from '@sentry/svelte' +import type { Transaction, TransactionContext } from '@sentry/types' +import type { Span } from '@sentry/types' + +const DEFAULT_TAGS = { + 'routing.instrumentation': '@sentry/sveltekit' +} + +export const svelteKitRoutingInstrumentation = ( + startTransactionFn: (context: TransactionContext) => T | undefined, + startTransactionOnPageLoad?: boolean, + startTransactionOnLocationChange?: boolean +) => { + if (startTransactionOnPageLoad) { + instrumentPageload(startTransactionFn) + } + + if (startTransactionOnLocationChange) { + instrumentNavigations(startTransactionFn) + } +} + +const instrumentPageload = ( + startTransactionFn: (context: TransactionContext) => T | undefined +) => { + const initialPath = WINDOW && WINDOW.location && WINDOW.location.pathname + + const pageloadTransaction = startTransactionFn({ + name: initialPath, + op: 'pageload', + origin: 'auto.pageload.sveltekit', + description: initialPath, + tags: { + ...DEFAULT_TAGS + }, + metadata: { + source: 'url' + } + }) + + page.subscribe((page) => { + if (!page) { + return + } + + const routeId = page.route && page.route.id + + if (pageloadTransaction && routeId) { + pageloadTransaction.setName(routeId, 'route') + } + }) +} + +/** + * Use the `navigating` store to start a transaction on navigations. + */ +const instrumentNavigations = ( + startTransactionFn: (context: TransactionContext) => T | undefined +) => { + let routingSpan: Span | undefined = undefined + let activeTransaction + + navigating.subscribe((navigation) => { + if (!navigation) { + // `navigating` emits a 'null' value when the navigation is completed. + // So in this case, we can finish the routing span. If the transaction was an IdleTransaction, + // it will finish automatically and if it was user-created users also need to finish it. + if (routingSpan) { + routingSpan.finish() + routingSpan = undefined + } + return + } + + const from = navigation.from + const to = navigation.to + + // for the origin we can fall back to window.location.pathname because in this emission, it still is set to the origin path + const rawRouteOrigin = + (from && from.url.pathname) || + (WINDOW && WINDOW.location && WINDOW.location.pathname) + + const rawRouteDestination = to && to.url.pathname + + // We don't want to create transactions for navigations of same origin and destination. + // We need to look at the raw URL here because parameterized routes can still differ in their raw parameters. + if (rawRouteOrigin === rawRouteDestination) { + return + } + + const parameterizedRouteOrigin = from && from.route.id + const parameterizedRouteDestination = to && to.route.id + + activeTransaction = getActiveTransaction() + + if (!activeTransaction) { + activeTransaction = startTransactionFn({ + name: parameterizedRouteDestination || rawRouteDestination || 'unknown', + op: 'navigation', + origin: 'auto.navigation.sveltekit', + metadata: { source: parameterizedRouteDestination ? 'route' : 'url' }, + tags: { + ...DEFAULT_TAGS + } + }) + } + + if (activeTransaction) { + if (routingSpan) { + // If a routing span is still open from a previous navigation, we finish it. + routingSpan.finish() + } + routingSpan = activeTransaction.startChild({ + op: 'ui.sveltekit.routing', + description: 'SvelteKit Route Change', + origin: 'auto.ui.sveltekit' + }) + activeTransaction.setTag('from', parameterizedRouteOrigin) + } + }) +} diff --git a/packages/lib/src/client/sentryInit.ts b/packages/lib/src/client/sentryInit.ts new file mode 100644 index 0000000..73e1afb --- /dev/null +++ b/packages/lib/src/client/sentryInit.ts @@ -0,0 +1,26 @@ +import { BrowserOptions, configureScope, init } from '@sentry/svelte' +import { addClientIntegrations } from './addClientIntegrations.js' +import { applySdkMetadata } from './applySdkMetadata.js' +import { restoreFetch } from './restoreFetch.js' +import { switchToFetchProxy } from './switchToFetchProxy.js' + +export const sentryInit = (options: BrowserOptions) => { + applySdkMetadata(options, ['sveltekit', 'svelte']) + + addClientIntegrations(options) + + // 1. Switch window.fetch to our fetch proxy we injected earlier + const actualFetch = switchToFetchProxy() + + // 2. Initialize the SDK which will instrument our proxy + init(options) + + // 3. Restore the original fetch now that our proxy is instrumented + if (actualFetch) { + restoreFetch(actualFetch) + } + + configureScope((scope) => { + scope.setTag('runtime', 'browser') + }) +} diff --git a/packages/lib/src/client/switchToFetchProxy.ts b/packages/lib/src/client/switchToFetchProxy.ts new file mode 100644 index 0000000..3c74691 --- /dev/null +++ b/packages/lib/src/client/switchToFetchProxy.ts @@ -0,0 +1,17 @@ +import { WINDOW } from '@sentry/svelte' + +export function switchToFetchProxy() { + const globalWithSentryFetchProxy = WINDOW + + const actualFetch = globalWithSentryFetchProxy.fetch + + // @ts-expect-error TODO: fix this + if (globalWithSentryFetchProxy._sentryFetchProxy && actualFetch) { + globalWithSentryFetchProxy.fetch = + // @ts-expect-error TODO: fix this + globalWithSentryFetchProxy._sentryFetchProxy + return actualFetch + } + + return undefined +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b8ef3d..d786c19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,28 +8,28 @@ importers: .: dependencies: + esm-env: + specifier: 1.0.0 + version: 1.0.0 + devDependencies: + '@playwright/test': + specifier: 1.39.0 + version: 1.39.0 '@sentry/core': specifier: 7.74.1 version: 7.74.1 '@sentry/svelte': specifier: 7.74.1 version: 7.74.1(svelte@4.2.2) + '@sentry/types': + specifier: ^7.74.1 + version: 7.74.1 '@sentry/utils': specifier: 7.74.1 version: 7.74.1 '@sveltejs/kit': specifier: 1.26.0 version: 1.26.0(svelte@4.2.2)(vite@4.5.0) - esm-env: - specifier: 1.0.0 - version: 1.0.0 - toucan-js: - specifier: 3.3.0 - version: 3.3.0 - devDependencies: - '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 '@typescript-eslint/eslint-plugin': specifier: 6.8.0 version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) @@ -45,6 +45,9 @@ importers: prettier-plugin-svelte: specifier: 3.0.3 version: 3.0.3(prettier@3.0.3)(svelte@4.2.2) + toucan-js: + specifier: 3.3.0 + version: 3.3.0 typescript: specifier: 5.2.2 version: 5.2.2 @@ -92,6 +95,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@cloudflare/workers-types@4.20231002.0: resolution: {integrity: sha512-gQMKf3THqAFWH426OXXfVx0gFLXiSiL2fo6mKjQYx4PU74MgmVDFh25NvpAIBK+XN+xXlrImClfYeqErXIT7jA==} @@ -103,6 +107,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm64@0.19.5: @@ -120,6 +125,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.19.5: @@ -137,6 +143,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.19.5: @@ -154,6 +161,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.19.5: @@ -171,6 +179,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.19.5: @@ -188,6 +197,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.19.5: @@ -205,6 +215,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.19.5: @@ -222,6 +233,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.19.5: @@ -239,6 +251,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.19.5: @@ -256,6 +269,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.19.5: @@ -273,6 +287,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.19.5: @@ -290,6 +305,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.19.5: @@ -307,6 +323,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.19.5: @@ -324,6 +341,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.19.5: @@ -341,6 +359,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.19.5: @@ -358,6 +377,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.19.5: @@ -375,6 +395,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.19.5: @@ -392,6 +413,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.19.5: @@ -409,6 +431,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.19.5: @@ -426,6 +449,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.19.5: @@ -443,6 +467,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.19.5: @@ -460,6 +485,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.19.5: @@ -511,6 +537,7 @@ packages: /@fastify/busboy@2.0.0: resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} engines: {node: '>=14'} + dev: true /@humanwhocodes/config-array@0.11.11: resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} @@ -557,23 +584,28 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -606,6 +638,7 @@ packages: /@polka/url@1.0.0-next.23: resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + dev: true /@sentry-internal/tracing@7.73.0: resolution: {integrity: sha512-ig3WL/Nqp8nRQ52P205NaypGKNfIl/G+cIqge9xPW6zfRb5kJdM1YParw9GSJ1SPjEZBkBORGAML0on5H2FILw==} @@ -625,7 +658,7 @@ packages: '@sentry/types': 7.74.1 '@sentry/utils': 7.74.1 tslib: 2.6.2 - dev: false + dev: true /@sentry/browser@7.74.1: resolution: {integrity: sha512-OYWNne/KO60lOvkIpIlJUyiJt/9j8DGI57thSDFEYSmmbNqMitczUTBOaEStouvHKyfchqLZm1CZfWKt+z0VOA==} @@ -637,7 +670,7 @@ packages: '@sentry/types': 7.74.1 '@sentry/utils': 7.74.1 tslib: 2.6.2 - dev: false + dev: true /@sentry/bundler-plugin-core@2.8.0: resolution: {integrity: sha512-DsTUgeKPqck3DkGzKjRduhPpEn0pez+/THF3gpwQBEfbPnKGr0EYugDvfungZwBFenckIvQBDTOZw0STvbgChA==} @@ -679,7 +712,7 @@ packages: '@sentry/types': 7.70.0 '@sentry/utils': 7.70.0 tslib: 2.6.2 - dev: false + dev: true /@sentry/core@7.73.0: resolution: {integrity: sha512-9FEz4Gq848LOgVN2OxJGYuQqxv7cIVw69VlAzWHEm3njt8mjvlTq+7UiFsGRo84+59V2FQuHxzA7vVjl90WfSg==} @@ -697,7 +730,7 @@ packages: '@sentry/types': 7.74.1 '@sentry/utils': 7.74.1 tslib: 2.6.2 - dev: false + dev: true /@sentry/integrations@7.70.0: resolution: {integrity: sha512-ffIEuiElROzl4IpYX0O7vtPaadXVycPtyjq86YTHjd2TUFcYuQTPBm5UjEVE0/sSNNCdfWYxNThU/fVyq93l1g==} @@ -707,7 +740,7 @@ packages: '@sentry/utils': 7.70.0 localforage: 1.10.0 tslib: 2.6.2 - dev: false + dev: true /@sentry/node@7.73.0: resolution: {integrity: sha512-i50bRfmgkRRx0XXUbg9jGD/RuznDJxJXc4rBILhoJuhl+BjRIaoXA3ayplfJn8JLZxsNh75uJaCq4IUK70SORw==} @@ -732,7 +765,7 @@ packages: '@sentry/core': 7.74.1 '@sentry/types': 7.74.1 '@sentry/utils': 7.74.1 - dev: false + dev: true /@sentry/svelte@7.74.1(svelte@4.2.2): resolution: {integrity: sha512-VwTt8jpRktLiQO8JBW6RDxXOdr9ePoEkpXvG+GZJ0lRS31m3w8PI4wNswsNRjP68nBT1sWFRPha0mbAaYiAfPg==} @@ -746,12 +779,12 @@ packages: magic-string: 0.30.4 svelte: 4.2.2 tslib: 2.6.2 - dev: false + dev: true /@sentry/types@7.70.0: resolution: {integrity: sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==} engines: {node: '>=8'} - dev: false + dev: true /@sentry/types@7.73.0: resolution: {integrity: sha512-/v8++bly8jW7r4cP2wswYiiVpn7eLLcqwnfPUMeCQze4zj3F3nTRIKc9BGHzU0V+fhHa3RwRC2ksqTGq1oJMDg==} @@ -761,6 +794,7 @@ packages: /@sentry/types@7.74.1: resolution: {integrity: sha512-2jIuPc+YKvXqZETwr2E8VYnsH1zsSUR/wkIvg1uTVeVNyoowJv+YsOtCdeGyL2AwiotUBSPKu7O1Lz0kq5rMOQ==} engines: {node: '>=8'} + dev: true /@sentry/utils@7.70.0: resolution: {integrity: sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==} @@ -768,7 +802,7 @@ packages: dependencies: '@sentry/types': 7.70.0 tslib: 2.6.2 - dev: false + dev: true /@sentry/utils@7.73.0: resolution: {integrity: sha512-h3ZK/qpf4k76FhJV9uiSbvMz3V/0Ovy94C+5/9UgPMVCJXFmVsdw8n/dwANJ7LupVPfYP23xFGgebDMFlK1/2w==} @@ -784,6 +818,7 @@ packages: dependencies: '@sentry/types': 7.74.1 tslib: 2.6.2 + dev: true /@sentry/vite-plugin@2.8.0: resolution: {integrity: sha512-17++vXjfn0xEfE7W4FWdwoXdNNqGjXnuTvIgSLlhJvDCTcqWONDpA/TGXGLjbhQEmQ58wL4wQqmlyxoqMPlokQ==} @@ -833,6 +868,7 @@ packages: vite: 4.5.0 transitivePeerDependencies: - supports-color + dev: true /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.2)(vite@4.5.0): resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} @@ -848,6 +884,7 @@ packages: vite: 4.5.0 transitivePeerDependencies: - supports-color + dev: true /@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.2)(vite@4.5.0): resolution: {integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==} @@ -867,12 +904,15 @@ packages: vitefu: 0.2.4(vite@4.5.0) transitivePeerDependencies: - supports-color + dev: true /@types/cookie@0.5.2: resolution: {integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==} + dev: true /@types/estree@1.0.2: resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + dev: true /@types/json-schema@7.0.13: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} @@ -1025,6 +1065,7 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1072,6 +1113,7 @@ packages: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -1082,6 +1124,7 @@ packages: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 + dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1148,6 +1191,7 @@ packages: acorn: 8.10.0 estree-walker: 3.0.3 periscopic: 3.1.0 + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -1167,6 +1211,7 @@ packages: /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + dev: true /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -1183,6 +1228,7 @@ packages: dependencies: mdn-data: 2.0.30 source-map-js: 1.0.2 + dev: true /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -1200,6 +1246,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1208,13 +1255,16 @@ packages: /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + dev: true /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + dev: true /devalue@4.3.2: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -1263,6 +1313,7 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + dev: true /esbuild@0.19.5: resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} @@ -1430,6 +1481,7 @@ packages: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.2 + dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -1517,6 +1569,7 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /glob-parent@5.1.2: @@ -1563,6 +1616,7 @@ packages: /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -1578,6 +1632,7 @@ packages: /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1605,7 +1660,7 @@ packages: /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1664,6 +1719,7 @@ packages: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: '@types/estree': 1.0.2 + dev: true /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1697,6 +1753,7 @@ packages: /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + dev: true /known-css-properties@0.28.0: resolution: {integrity: sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==} @@ -1714,7 +1771,7 @@ packages: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} dependencies: immediate: 3.0.6 - dev: false + dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -1725,10 +1782,11 @@ packages: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} dependencies: lie: 3.1.1 - dev: false + dev: true /locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -1769,9 +1827,11 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1812,18 +1872,22 @@ packages: /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + dev: true /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} + dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1919,9 +1983,11 @@ packages: '@types/estree': 1.0.2 estree-walker: 3.0.3 is-reference: 3.0.2 + dev: true /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1994,6 +2060,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -2069,6 +2136,7 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 + dev: true /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2081,6 +2149,7 @@ packages: engines: {node: '>=6'} dependencies: mri: 1.2.0 + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -2092,6 +2161,7 @@ packages: /set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: true /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -2112,6 +2182,7 @@ packages: '@polka/url': 1.0.0-next.23 mrmime: 1.0.1 totalist: 3.0.1 + dev: true /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -2121,6 +2192,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -2174,6 +2246,7 @@ packages: svelte: ^3.19.0 || ^4.0.0 dependencies: svelte: 4.2.2 + dev: true /svelte-writable-derived@3.1.0(svelte@4.2.2): resolution: {integrity: sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==} @@ -2200,6 +2273,7 @@ packages: locate-character: 3.0.0 magic-string: 0.30.4 periscopic: 3.1.0 + dev: true /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2210,6 +2284,7 @@ packages: dependencies: globalyzer: 0.1.0 globrex: 0.1.2 + dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -2221,6 +2296,7 @@ packages: /totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + dev: true /toucan-js@3.3.0: resolution: {integrity: sha512-G3RZpX0SiLXq62UkQQyKuZKkB6yKrnp73Y97lh+cBt/fQLoj9YXJJ5IZ8YZ1Dq5nxGpSale+xpuGfUd4QLKcXA==} @@ -2229,7 +2305,7 @@ packages: '@sentry/integrations': 7.70.0 '@sentry/types': 7.70.0 '@sentry/utils': 7.70.0 - dev: false + dev: true /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -2246,6 +2322,7 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -2270,6 +2347,7 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.0.0 + dev: true /unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} @@ -2323,6 +2401,7 @@ packages: rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 + dev: true /vitefu@0.2.4(vite@4.5.0): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} @@ -2333,6 +2412,7 @@ packages: optional: true dependencies: vite: 4.5.0 + dev: true /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}