getsentry / sentry-javascript

Official Sentry SDKs for JavaScript
https://sentry.io
MIT License
7.78k stars 1.53k forks source link

Building nuxt3 project moves Sentry functions (captureMessage,captureException ..) under .default #10804

Closed KarelVendla closed 4 months ago

KarelVendla commented 4 months ago

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/vue

SDK Version

7.102.1

Framework Version

Nuxt 3.8.2

Link to Sentry event

No response

SDK Setup

import * as Sentry from "@sentry/vue";
import type { CaptureContext, SeverityLevel } from "@sentry/types";
import type { ExclusiveEventHintOrCaptureContext } from "@sentry/core/types/utils/prepareEvent";

export default defineNuxtPlugin((nuxtApp) => {
  const {
    public: { sentryDsn, sentryEnabled, appEnv },
  } = useRuntimeConfig();

  if (!sentryDsn || sentryEnabled === "false") {
    return {
      provide: {
        sentry: {
          captureException: (_exception: any, _hint?: ExclusiveEventHintOrCaptureContext) => {},
          captureMessage: (_message: string, _captureContext?: CaptureContext | SeverityLevel) => {},
        },
      },
    };
  }

  Sentry.init({
    app: nuxtApp.vueApp,
    dsn: sentryDsn as string,
    environment: appEnv as string,
    integrations: [],
  });

  return {
    provide: {
      sentry: getSentryInstance(Sentry),
    },
  };
});
// Workaround
function getSentryInstance(sentry: typeof Sentry) {
  if (sentry?.default?.captureMessage) {
    return sentry.default;
  }
  return sentry;
}

Steps to Reproduce

Import and use sentry (For example within a middleware as that is where our problems started). in my SDK setup example we have setup a sentry.ts plugin for our nuxt project.

Create a sentry plugin

import * as Sentry from "@sentry/vue";

export default defineNuxtPlugin((nuxtApp) => {
  Sentry.init({
    app: nuxtApp.vueApp,
    dsn: 'SENTRY DSN goes here',
    environment: 'dev',
    integrations: [],
  });

  return {
    provide: {
      sentry: Sentry
    }
  }
});

exampleMiddleware.global.ts

export default defineNuxtRouteMiddleware(async (to) => {
useNuxtApp().$sentry.captureMessage('test', 'fatal');
});

Build nuxt project (npm run build) Run nuxt project (npm run start)

Expected Result

Expect Sentry to send a captured message on every page load to sentry.

console.logged sentry before building

{
  init: [Function: init],
  vueRouterInstrumentation: [Function: vueRouterInstrumentation],
  browserTracingIntegration: [Function: browserTracingIntegration],
  attachErrorHandler: [Function: attachErrorHandler],
  createTracingMixins: [Function: createTracingMixins],
  VueIntegration: [Function: ConvertedIntegration] { id: 'Vue' },
  vueIntegration: [Function: _vueIntegration],
  FunctionToString: [Function: ConvertedIntegration] { id: 'FunctionToString' },
  Hub: [class Hub],
  InboundFilters: [Function: ConvertedIntegration] { id: 'InboundFilters' },
  ModuleMetadata: [Function: ConvertedIntegration] { id: 'ModuleMetadata' },
  SDK_VERSION: '7.102.1',
  SEMANTIC_ATTRIBUTE_SENTRY_OP: 'sentry.op',
  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN: 'sentry.origin',
  SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE: 'sentry.sample_rate',
  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE: 'sentry.source',
  Scope: [class Scope],
  addBreadcrumb: [Function: addBreadcrumb],
  addEventProcessor: [Function: addEventProcessor],
  addGlobalEventProcessor: [Function: addGlobalEventProcessor],
  addIntegration: [Function: addIntegration],
  addTracingExtensions: [Function: addTracingExtensions],
  captureEvent: [Function: captureEvent],
  captureException: [Function: captureException],
  captureMessage: [Function: captureMessage],
  captureSession: [Function: captureSession],
  close: [AsyncFunction: close],
  configureScope: [Function: configureScope],
  continueTrace: [Function: continueTrace],
  createTransport: [Function: createTransport],
  endSession: [Function: endSession],
  extractTraceparentData: [Function: extractTraceparentData],
  flush: [AsyncFunction: flush],
  functionToStringIntegration: [Function: _functionToStringIntegration],
  getActiveSpan: [Function: getActiveSpan],
  getActiveTransaction: [Function: getActiveTransaction],
  getClient: [Function: getClient],
  getCurrentHub: [Function: getCurrentHub],
  getCurrentScope: [Function: getCurrentScope],
  getHubFromCarrier: [Function: getHubFromCarrier],
  getSpanStatusFromHttpCode: [Function: getSpanStatusFromHttpCode],
  inboundFiltersIntegration: [Function: _inboundFiltersIntegration],
  isInitialized: [Function: isInitialized],
  lastEventId: [Function: lastEventId],
  makeMain: [Function: makeMain],
  makeMultiplexedTransport: [Function: makeMultiplexedTransport],
  metrics: {
    increment: [Function: increment],
    distribution: [Function: distribution],
    set: [Function: set],
    gauge: [Function: gauge],
    MetricsAggregator: [Function: ConvertedIntegration] { id: 'MetricsAggregator' },
    metricsAggregatorIntegration: [Function: _metricsAggregatorIntegration]
  },
  moduleMetadataIntegration: [Function: _moduleMetadataIntegration],
  parameterize: [Function: parameterize],
  setContext: [Function: setContext],
  setCurrentClient: [Function: setCurrentClient],
  setExtra: [Function: setExtra],
  setExtras: [Function: setExtras],
  setHttpStatus: [Function: setHttpStatus],
  setMeasurement: [Function: setMeasurement],
  setTag: [Function: setTag],
  setTags: [Function: setTags],
  setUser: [Function: setUser],
  spanStatusfromHttpCode: [Function: getSpanStatusFromHttpCode],
  startInactiveSpan: [Function: startInactiveSpan],
  startSession: [Function: startSession],
  startSpan: [Function: startSpan],
  startSpanManual: [Function: startSpanManual],
  startTransaction: [Function: startTransaction],
  trace: [Function: trace],
  withIsolationScope: [Function: withIsolationScope],
  withScope: [Function: withScope],
  WINDOW: <ref *1> Object [global] {
    global: [Circular *1],
    clearImmediate: [Function: clearImmediate],
    setImmediate: [Function: setImmediate] {
      [Symbol(nodejs.util.promisify.custom)]: [Getter]
    },
    clearInterval: [Function: clearInterval],
    clearTimeout: [Function: clearTimeout],
    setInterval: [Function (anonymous)],
    setTimeout: [Function (anonymous)],
    queueMicrotask: [Function: queueMicrotask],
    structuredClone: [Function: structuredClone],
    atob: [Getter/Setter],
    btoa: [Getter/Setter],
    performance: [Getter/Setter],
    fetch: [Function: fetch],
    crypto: [Getter],
    __VUE_HMR_RUNTIME__: {
      createRecord: [Function (anonymous)],
      rerender: [Function (anonymous)],
      reload: [Function (anonymous)]
    },
    __VUE_INSTANCE_SETTERS__: [ [Function (anonymous)], [Function (anonymous)] ],
    __VUE_SSR_SETTERS__: [ [Function (anonymous)], [Function (anonymous)] ],
    _importMeta_: {
      url: 'file:///C:/Users/karel/Desktop/I/dev/yazio/web-funnels/.nuxt/dev/index.mjs',
      env: [Object]
    },
    '$fetch': [AsyncFunction: $fetch2] {
      raw: [AsyncFunction: $fetchRaw2],
      native: [Function (anonymous)],
      create: [Function (anonymous)]
    },
    __SENTRY__: {
      extensions: [Object],
      hub: [Hub],
      acs: [Object],
      globalEventProcessors: []
    },
    onerror: [Function (anonymous)] { __SENTRY_INSTRUMENTED__: true },
    onunhandledrejection: [Function (anonymous)] { __SENTRY_INSTRUMENTED__: true },
    __buildAssetsURL: [Function: buildAssetsURL],
    __publicAssetsURL: [Function: publicAssetsURL],
    __unctx__: { get: [Function: get] },
    __unctx_async_handlers__: Set(2) { [Function: onLeave], [Function: onLeave] },
    __VUE_PROD_DEVTOOLS__: false,
    __INTLIFY_PROD_DEVTOOLS__: false,
    __INTLIFY__: true,
    __VUE__: true,
    __unhead_injection_handler__: [Function (anonymous)],
    __vueuse_ssr_handlers__: {},
    __VUE_DEVTOOLS_PLUGINS__: [ [Object], [Object] ]
  },
  BrowserClient: [class BrowserClient extends BaseClient],
  makeFetchTransport: [Function: makeFetchTransport],
  makeXHRTransport: [Function: makeXHRTransport],
  chromeStackLineParser: [ 30, [Function: chrome] ],
  defaultStackLineParsers: [
    [ 30, [Function: chrome] ],
    [ 50, [Function: gecko] ],
    [ 40, [Function: winjs] ]
  ],
  defaultStackParser: [Function (anonymous)],
  geckoStackLineParser: [ 50, [Function: gecko] ],
  opera10StackLineParser: [ 10, [Function: opera10] ],
  opera11StackLineParser: [ 20, [Function: opera11] ],
  winjsStackLineParser: [ 40, [Function: winjs] ],
  eventFromException: [Function: eventFromException],
  eventFromMessage: [Function: eventFromMessage],
  exceptionFromError: [Function: exceptionFromError],
  createUserFeedbackEnvelope: [Function: createUserFeedbackEnvelope],
  captureUserFeedback: [Function: captureUserFeedback],
  defaultIntegrations: [
    {
      name: 'InboundFilters',
      setupOnce: [Function: setupOnce],
      processEvent: [Function: processEvent],
      isDefaultInstance: true
    },
    {
      name: 'FunctionToString',
      setupOnce: [Function: setupOnce],
      setup: [Function: setup],
      isDefaultInstance: true
    },
    {
      name: 'TryCatch',
      setupOnce: [Function: setupOnce],
      isDefaultInstance: true
    },
    {
      name: 'Breadcrumbs',
      setupOnce: [Function: setupOnce],
      setup: [Function: setup],
      isDefaultInstance: true
    },
    {
      name: 'GlobalHandlers',
      setupOnce: [Function: setupOnce],
      setup: [Function: setup],
      isDefaultInstance: true
    },
    {
      name: 'LinkedErrors',
      setupOnce: [Function: setupOnce],
      preprocessEvent: [Function: preprocessEvent],
      isDefaultInstance: true
    },
    {
      name: 'Dedupe',
      setupOnce: [Function: setupOnce],
      processEvent: [Function: processEvent],
      isDefaultInstance: true
    },
    {
      name: 'HttpContext',
      setupOnce: [Function: setupOnce],
      preprocessEvent: [Function: preprocessEvent],
      isDefaultInstance: true
    }
  ],
  forceLoad: [Function: forceLoad],
  getDefaultIntegrations: [Function: getDefaultIntegrations],
  onLoad: [Function: onLoad],
  showReportDialog: [Function: showReportDialog],
  wrap: [Function: wrap],
  Breadcrumbs: [Function: ConvertedIntegration] { id: 'Breadcrumbs' },
  breadcrumbsIntegration: [Function: _breadcrumbsIntegration],
  Dedupe: [Function: ConvertedIntegration] { id: 'Dedupe' },
  dedupeIntegration: [Function: _dedupeIntegration],
  GlobalHandlers: [Function: ConvertedIntegration] { id: 'GlobalHandlers' },
  globalHandlersIntegration: [Function: _globalHandlersIntegration],
  HttpContext: [Function: ConvertedIntegration] { id: 'HttpContext' },
  httpContextIntegration: [Function: _httpContextIntegration],
  LinkedErrors: [Function: ConvertedIntegration] { id: 'LinkedErrors' },
  linkedErrorsIntegration: [Function: _linkedErrorsIntegration],
  TryCatch: [Function: ConvertedIntegration] { id: 'TryCatch' },
  browserApiErrorsIntegration: [Function: _browserApiErrorsIntegration],
  Replay: [class Replay] { id: 'Replay' },
  getReplay: [Function: getReplay],
  replayIntegration: [Function: replayIntegration],
  ReplayCanvas: [Function: ConvertedIntegration] { id: 'ReplayCanvas' },
  replayCanvasIntegration: [Function: _replayCanvasIntegration],
  Feedback: [class Feedback] { id: 'Feedback' },
  feedbackIntegration: [Function: feedbackIntegration],
  sendFeedback: [Function: sendFeedback],
  BrowserTracing: [class BrowserTracing],
  defaultRequestInstrumentationOptions: {
    traceFetch: true,
    traceXHR: true,
    enableHTTPTimings: true,
    tracingOrigins: [ 'localhost', /^\/(?!\/)/ ],
    tracePropagationTargets: [ 'localhost', /^\/(?!\/)/ ]
  },
  instrumentOutgoingRequests: [Function: instrumentOutgoingRequests],
  startBrowserTracingNavigationSpan: [Function: startBrowserTracingNavigationSpan],
  startBrowserTracingPageLoadSpan: [Function: startBrowserTracingPageLoadSpan],
  makeBrowserOfflineTransport: [Function: makeBrowserOfflineTransport],
  onProfilingStartRouteTransaction: [Function: onProfilingStartRouteTransaction],
  BrowserProfilingIntegration: [Function: ConvertedIntegration] { id: 'BrowserProfiling' },
  browserProfilingIntegration: [Function: _browserProfilingIntegration],
  Integrations: {
    FunctionToString: [Function: ConvertedIntegration] { id: 'FunctionToString' },
    InboundFilters: [Function: ConvertedIntegration] { id: 'InboundFilters' },
    LinkedErrors: [Function: ConvertedIntegration] { id: 'LinkedErrors' },
    GlobalHandlers: [Function: ConvertedIntegration] { id: 'GlobalHandlers' },
    TryCatch: [Function: ConvertedIntegration] { id: 'TryCatch' },
    Breadcrumbs: [Function: ConvertedIntegration] { id: 'Breadcrumbs' },
    HttpContext: [Function: ConvertedIntegration] { id: 'HttpContext' },
    Dedupe: [Function: ConvertedIntegration] { id: 'Dedupe' }
  }
}

Actual Result

I get an error

Sentry.captureMessage is not a function

Console.logged Sentry after building

 [Module: null prototype] {
  VueIntegration: [Function: ConvertedIntegration] { id: 'Vue' },
  __esModule: true,
  attachErrorHandler: [Function: attachErrorHandler],
  browserTracingIntegration: [Function: browserTracingIntegration],
  createTracingMixins: [Function: createTracingMixins],
  default: {
    init: [Function: init],
    vueRouterInstrumentation: [Function: vueRouterInstrumentation],
    browserTracingIntegration: [Function: browserTracingIntegration],
    attachErrorHandler: [Function: attachErrorHandler],
    createTracingMixins: [Function: createTracingMixins],
    VueIntegration: [Function: ConvertedIntegration] { id: 'Vue' },
    vueIntegration: [Function: _vueIntegration],
    FunctionToString: [Function: ConvertedIntegration] { id: 'FunctionToString' },
    Hub: [class Hub],
    InboundFilters: [Function: ConvertedIntegration] { id: 'InboundFilters' },
    ModuleMetadata: [Function: ConvertedIntegration] { id: 'ModuleMetadata' },
    SDK_VERSION: '7.102.1',
    SEMANTIC_ATTRIBUTE_SENTRY_OP: 'sentry.op',
    SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN: 'sentry.origin',
    SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE: 'sentry.sample_rate',
    SEMANTIC_ATTRIBUTE_SENTRY_SOURCE: 'sentry.source',
    Scope: [class Scope],
    addBreadcrumb: [Function: addBreadcrumb],
    addEventProcessor: [Function: addEventProcessor],
    addGlobalEventProcessor: [Function: addGlobalEventProcessor],
    addIntegration: [Function: addIntegration],
    addTracingExtensions: [Function: addTracingExtensions],
    captureEvent: [Function: captureEvent],
    captureException: [Function: captureException],
    captureMessage: [Function: captureMessage],
    captureSession: [Function: captureSession],
    close: [AsyncFunction: close],
    configureScope: [Function: configureScope],
    continueTrace: [Function: continueTrace],
    createTransport: [Function: createTransport],
    endSession: [Function: endSession],
    extractTraceparentData: [Function: extractTraceparentData],
    flush: [AsyncFunction: flush],
    functionToStringIntegration: [Function: _functionToStringIntegration],
    getActiveSpan: [Function: getActiveSpan],
    getActiveTransaction: [Function: getActiveTransaction],
    getClient: [Function: getClient],
    getCurrentHub: [Function: getCurrentHub],
    getCurrentScope: [Function: getCurrentScope],
    getHubFromCarrier: [Function: getHubFromCarrier],
    getSpanStatusFromHttpCode: [Function: getSpanStatusFromHttpCode],
    inboundFiltersIntegration: [Function: _inboundFiltersIntegration],
    isInitialized: [Function: isInitialized],
    lastEventId: [Function: lastEventId],
    makeMain: [Function: makeMain],
    makeMultiplexedTransport: [Function: makeMultiplexedTransport],
    metrics: {
      increment: [Function: increment],
      distribution: [Function: distribution],
      set: [Function: set],
      gauge: [Function: gauge],
      MetricsAggregator: [Function],
      metricsAggregatorIntegration: [Function: _metricsAggregatorIntegration]
    },
    moduleMetadataIntegration: [Function: _moduleMetadataIntegration],
    parameterize: [Function: parameterize],
    setContext: [Function: setContext],
    setCurrentClient: [Function: setCurrentClient],
    setExtra: [Function: setExtra],
    setExtras: [Function: setExtras],
    setHttpStatus: [Function: setHttpStatus],
    setMeasurement: [Function: setMeasurement],
    setTag: [Function: setTag],
    setTags: [Function: setTags],
    setUser: [Function: setUser],
    spanStatusfromHttpCode: [Function: getSpanStatusFromHttpCode],
    startInactiveSpan: [Function: startInactiveSpan],
    startSession: [Function: startSession],
    startSpan: [Function: startSpan],
    startSpanManual: [Function: startSpanManual],
    startTransaction: [Function: startTransaction],
    trace: [Function: trace],
    withIsolationScope: [Function: withIsolationScope],
    withScope: [Function: withScope],
    WINDOW: <ref *1> Object [global] {
      global: [Circular *1],
      clearImmediate: [Function: clearImmediate],
      setImmediate: [Function],
      clearInterval: [Function: clearInterval],
      clearTimeout: [Function: clearTimeout],
      setInterval: [Function (anonymous)],
      setTimeout: [Function (anonymous)],
      queueMicrotask: [Function: queueMicrotask],
      structuredClone: [Function: structuredClone],
      atob: [Getter/Setter],
      btoa: [Getter/Setter],
      performance: [Getter/Setter],
      fetch: [Function: fetch],
      crypto: [Getter],
      _importMeta_: [Object],
      '$fetch': [AsyncFunction],
      __SENTRY__: [Object],
      onerror: [Function],
      onunhandledrejection: [Function],
      __VUE_INSTANCE_SETTERS__: [Array],
      __VUE_SSR_SETTERS__: [Array],
      __buildAssetsURL: [Function: buildAssetsURL],
      __publicAssetsURL: [Function: publicAssetsURL],
      __VUE_PROD_DEVTOOLS__: false,
      __unctx__: [Object],
      __unctx_async_handlers__: [Set],
      __VUE__: true,
      __unhead_injection_handler__: [Function (anonymous)],
      __vueuse_ssr_handlers__: {}
    },
    BrowserClient: [class BrowserClient extends BaseClient],
    makeFetchTransport: [Function: makeFetchTransport],
    makeXHRTransport: [Function: makeXHRTransport],
    chromeStackLineParser: [ 30, [Function: chrome] ],
    defaultStackLineParsers: [ [Array], [Array], [Array] ],
    defaultStackParser: [Function (anonymous)],
    geckoStackLineParser: [ 50, [Function: gecko] ],
    opera10StackLineParser: [ 10, [Function: opera10] ],
    opera11StackLineParser: [ 20, [Function: opera11] ],
    winjsStackLineParser: [ 40, [Function: winjs] ],
    eventFromException: [Function: eventFromException],
    eventFromMessage: [Function: eventFromMessage],
    exceptionFromError: [Function: exceptionFromError],
    createUserFeedbackEnvelope: [Function: createUserFeedbackEnvelope],
    captureUserFeedback: [Function: captureUserFeedback],
    defaultIntegrations: [
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object]
    ],
    forceLoad: [Function: forceLoad],
    getDefaultIntegrations: [Function: getDefaultIntegrations],
    onLoad: [Function: onLoad],
    showReportDialog: [Function: showReportDialog],
    wrap: [Function: wrap],
    Breadcrumbs: [Function: ConvertedIntegration] { id: 'Breadcrumbs' },
    breadcrumbsIntegration: [Function: _breadcrumbsIntegration],
    Dedupe: [Function: ConvertedIntegration] { id: 'Dedupe' },
    dedupeIntegration: [Function: _dedupeIntegration],
    GlobalHandlers: [Function: ConvertedIntegration] { id: 'GlobalHandlers' },
    globalHandlersIntegration: [Function: _globalHandlersIntegration],
    HttpContext: [Function: ConvertedIntegration] { id: 'HttpContext' },
    httpContextIntegration: [Function: _httpContextIntegration],
    LinkedErrors: [Function: ConvertedIntegration] { id: 'LinkedErrors' },
    linkedErrorsIntegration: [Function: _linkedErrorsIntegration],
    TryCatch: [Function: ConvertedIntegration] { id: 'TryCatch' },
    browserApiErrorsIntegration: [Function: _browserApiErrorsIntegration],
    Replay: [class Replay] { id: 'Replay' },
    getReplay: [Function: getReplay],
    replayIntegration: [Function: replayIntegration],
    ReplayCanvas: [Function: ConvertedIntegration] { id: 'ReplayCanvas' },
    replayCanvasIntegration: [Function: _replayCanvasIntegration],
    Feedback: [class Feedback] { id: 'Feedback' },
    feedbackIntegration: [Function: feedbackIntegration],
    sendFeedback: [Function: sendFeedback],
    BrowserTracing: [class BrowserTracing],
    defaultRequestInstrumentationOptions: {
      traceFetch: true,
      traceXHR: true,
      enableHTTPTimings: true,
      tracingOrigins: [Array],
      tracePropagationTargets: [Array]
    },
    instrumentOutgoingRequests: [Function: instrumentOutgoingRequests],
    startBrowserTracingNavigationSpan: [Function: startBrowserTracingNavigationSpan],
    startBrowserTracingPageLoadSpan: [Function: startBrowserTracingPageLoadSpan],
    makeBrowserOfflineTransport: [Function: makeBrowserOfflineTransport],
    onProfilingStartRouteTransaction: [Function: onProfilingStartRouteTransaction],
    BrowserProfilingIntegration: [Function: ConvertedIntegration] { id: 'BrowserProfiling' },
    browserProfilingIntegration: [Function: _browserProfilingIntegration],
    Integrations: {
      FunctionToString: [Function],
      InboundFilters: [Function],
      LinkedErrors: [Function],
      GlobalHandlers: [Function],
      TryCatch: [Function],
      Breadcrumbs: [Function],
      HttpContext: [Function],
      Dedupe: [Function]
    }
  },
  init: [Function: init],
  vueIntegration: [Function: _vueIntegration],
  vueRouterInstrumentation: [Function: vueRouterInstrumentation]
}
Lms24 commented 4 months ago

Hi @KarelVendla thanks for writing in!

First off, technically, Nuxt isn't officially supported by Sentry. We're tracking support requests in https://github.com/getsentry/sentry-javascript/discussions/6929. Feel free to add a reply or 👍 to the discussion - this helps us prioritize things.

With that out of the way; this sounds very familiar to me and I think it is a weird interaction between Vite and the way how we re-export most functions (like captureMessage) from sub dependencies (e.g. @sentry/core). However, so far, I only observed this behavior on the server side. I know way too little about Nuxt plugins but it given they run on the server and you also showed a middleware snippet, I'd assume this is the case.

Please also note, using @sentry/vue on the server side is not supported or recommended by us, as it builds on top of the @sentry/browser package which contains a lot of browser-specific functionality.

I can't tell you how to fix this exactly but you probably need to create an index file that re-exports the necessary exports. Then you import * as Sentry from './mySentryIndexNamingIsHard' in your plugin. This is more or less how we solved this in e.g. our SvelteKit or Astro SDKs: https://github.com/getsentry/sentry-javascript/blob/develop/packages/sveltekit/src/server/index.ts

Lms24 commented 4 months ago

I'm going to close this issue as for now there's nothing concrete from our end to do (other than nuxt support in the first place, tracked in #6929). Feel free to tag me if you think this needs to be reopened. Thanks!