{"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":[],"mappings":";;;;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,qBAAqB,GAAkB,iBAAiB;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,UAAU,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,4BAA4B,CAAC;AAC3D,QAAQ;;AAER;AACA,QAAQ,IAAI,OAAO,KAAK,CAAC,eAAA,KAAoB,UAAU,EAAE;AACzD,UAAU,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,CAAC;AACtE,QAAQ;AACR,MAAM,CAAC;;AAEP,MAAM,YAAY,CAAC,KAAK,EAAS,KAAK,EAAa,OAAO,EAAiB;AAC3E,QAAQ,OAAO,mCAAmC,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,MAAM,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;AACnD,MAAM,oCAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC5D,IAAI;;AAEJ,IAAI,OAAO,MAAM;AACjB,EAAE,CAAC;AACH;;;;"}