{"version":3,"file":"growthbook.js","sources":["../../../../src/integrations/featureFlags/growthbook.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { defineIntegration } from '../../integration';\nimport type { Event, EventHint } from '../../types-hoist/event';\nimport type { IntegrationFn } from '../../types-hoist/integration';\nimport {\n  _INTERNAL_addFeatureFlagToActiveSpan,\n  _INTERNAL_copyFlagsFromScopeToEvent,\n  _INTERNAL_insertFlagToScope,\n} from '../../utils/featureFlags';\nimport { fill } from '../../utils/object';\n\ninterface GrowthBookLike {\n  isOn(this: GrowthBookLike, featureKey: string, ...rest: unknown[]): boolean;\n  getFeatureValue(this: GrowthBookLike, featureKey: string, defaultValue: unknown, ...rest: unknown[]): unknown;\n}\n\nexport type GrowthBookClassLike = new (...args: unknown[]) => GrowthBookLike;\n\n/**\n * Sentry integration for capturing feature flag evaluations from GrowthBook.\n *\n * Only boolean results are captured at this time.\n *\n * @example\n * ```typescript\n * import { GrowthBook } from '@growthbook/growthbook';\n * import * as Sentry from '@sentry/browser'; // or '@sentry/node'\n *\n * Sentry.init({\n *   dsn: 'your-dsn',\n *   integrations: [\n *     Sentry.growthbookIntegration({ growthbookClass: GrowthBook })\n *   ]\n * });\n * ```\n */\nexport const growthbookIntegration: IntegrationFn = defineIntegration(\n  ({ growthbookClass }: { growthbookClass: GrowthBookClassLike }) => {\n    return {\n      name: 'GrowthBook',\n\n      setupOnce() {\n        const proto = growthbookClass.prototype as GrowthBookLike;\n\n        // Type guard and wrap isOn\n        if (typeof proto.isOn === 'function') {\n          fill(proto, 'isOn', _wrapAndCaptureBooleanResult);\n        }\n\n        // Type guard and wrap getFeatureValue\n        if (typeof proto.getFeatureValue === 'function') {\n          fill(proto, 'getFeatureValue', _wrapAndCaptureBooleanResult);\n        }\n      },\n\n      processEvent(event: Event, _hint: EventHint, _client: Client): Event {\n        return _INTERNAL_copyFlagsFromScopeToEvent(event);\n      },\n    };\n  },\n);\n\nfunction _wrapAndCaptureBooleanResult(\n  original: (this: GrowthBookLike, ...args: unknown[]) => unknown,\n): (this: GrowthBookLike, ...args: unknown[]) => unknown {\n  return function (this: GrowthBookLike, ...args: unknown[]): unknown {\n    const flagName = args[0];\n    const result = original.apply(this, args);\n\n    if (typeof flagName === 'string' && typeof result === 'boolean') {\n      _INTERNAL_insertFlagToScope(flagName, result);\n      _INTERNAL_addFeatureFlagToActiveSpan(flagName, result);\n    }\n\n    return result;\n  };\n}\n"],"names":["defineIntegration","fill","_INTERNAL_copyFlagsFromScopeToEvent","_INTERNAL_insertFlagToScope","_INTERNAL_addFeatureFlagToActiveSpan"],"mappings":";;;;;;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,qBAAqB,GAAkBA,6BAAiB;AACrE,EAAE,CAAC,EAAE,eAAA,EAAiB,KAA+C;AACrE,IAAI,OAAO;AACX,MAAM,IAAI,EAAE,YAAY;;AAExB,MAAM,SAAS,GAAG;AAClB,QAAQ,MAAM,KAAA,GAAQ,eAAe,CAAC,SAAA;;AAEtC;AACA,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAA,KAAS,UAAU,EAAE;AAC9C,UAAUC,WAAI,CAAC,KAAK,EAAE,MAAM,EAAE,4BAA4B,CAAC;AAC3D,QAAQ;;AAER;AACA,QAAQ,IAAI,OAAO,KAAK,CAAC,eAAA,KAAoB,UAAU,EAAE;AACzD,UAAUA,WAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,CAAC;AACtE,QAAQ;AACR,MAAM,CAAC;;AAEP,MAAM,YAAY,CAAC,KAAK,EAAS,KAAK,EAAa,OAAO,EAAiB;AAC3E,QAAQ,OAAOC,gDAAmC,CAAC,KAAK,CAAC;AACzD,MAAM,CAAC;AACP,KAAK;AACL,EAAE,CAAC;AACH;;AAEA,SAAS,4BAA4B;AACrC,EAAE,QAAQ;AACV,EAAyD;AACzD,EAAE,OAAO,WAAgC,GAAG,IAAI,EAAsB;AACtE,IAAI,MAAM,QAAA,GAAW,IAAI,CAAC,CAAC,CAAC;AAC5B,IAAI,MAAM,MAAA,GAAS,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;;AAE7C,IAAI,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,MAAA,KAAW,SAAS,EAAE;AACrE,MAAMC,wCAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;AACnD,MAAMC,iDAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC5D,IAAI;;AAEJ,IAAI,OAAO,MAAM;AACjB,EAAE,CAAC;AACH;;;;"}