@interfere/react 12.3.1 → 12.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +6 -0
  2. package/dist/{activity-D13ZVan9.mjs → activity-oYlZ5aa1.mjs} +1 -1
  3. package/dist/{api-DSUjs8zG.d.mts → api-BXjfYV5Z.d.mts} +1 -0
  4. package/dist/api-C8aG7li1.mjs +1 -0
  5. package/dist/click-span-gate-6dNMhjc7.mjs +1 -0
  6. package/dist/{delivery-DDe-2SLc.mjs → delivery-D7hULClu.mjs} +1 -1
  7. package/dist/error-boundary.d.mts +1 -1
  8. package/dist/{errors-BfUmjgWO.mjs → errors-B8XYW4Q7.mjs} +1 -1
  9. package/dist/{exception-span-BfP73aqG.mjs → exception-span-B74fhBQb.mjs} +1 -1
  10. package/dist/export-filter-CnyAaPct.mjs +1 -0
  11. package/dist/exporter-CCgTznZ0.mjs +1 -0
  12. package/dist/exporter-logs-BbzSiQJi.mjs +1 -0
  13. package/dist/index-CPrYhbZR.d.mts +4 -0
  14. package/dist/ingest-backoff-BdBT-jss.mjs +1 -0
  15. package/dist/instrumentations-NN81kslu.mjs +1 -0
  16. package/dist/{instrumentations-D656I08h.d.mts → instrumentations-S-BCpguB.d.mts} +8 -9
  17. package/dist/internal/activity/activity.mjs +1 -1
  18. package/dist/internal/capture/capture-boundary.d.mts +1 -1
  19. package/dist/internal/capture/capture.d.mts +1 -1
  20. package/dist/internal/capture/exception-span.mjs +1 -1
  21. package/dist/internal/clock/sent-at.d.mts +5 -0
  22. package/dist/internal/clock/sent-at.mjs +1 -0
  23. package/dist/internal/ingest-backoff/ingest-backoff.d.mts +13 -0
  24. package/dist/internal/ingest-backoff/ingest-backoff.mjs +1 -0
  25. package/dist/internal/kernel-registry.d.mts +1 -1
  26. package/dist/internal/kernel.d.mts +2 -2
  27. package/dist/internal/kernel.mjs +1 -1
  28. package/dist/internal/otel/export-filter.d.mts +12 -0
  29. package/dist/internal/otel/export-filter.mjs +1 -0
  30. package/dist/internal/otel/exporter-logs.mjs +1 -1
  31. package/dist/internal/otel/exporter.mjs +1 -1
  32. package/dist/internal/otel/index.d.mts +3 -3
  33. package/dist/internal/otel/index.mjs +1 -1
  34. package/dist/internal/otel/instrumentations/click-span-gate.d.mts +8 -0
  35. package/dist/internal/otel/instrumentations/click-span-gate.mjs +1 -0
  36. package/dist/internal/otel/instrumentations/instrumentations.d.mts +2 -2
  37. package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -1
  38. package/dist/internal/otel/instrumentations/network-failure.d.mts +2 -0
  39. package/dist/internal/otel/instrumentations/network-failure.mjs +1 -0
  40. package/dist/internal/otel/keepalive-chunks.d.mts +6 -0
  41. package/dist/internal/otel/keepalive-chunks.mjs +1 -0
  42. package/dist/internal/otel/page-scope-context-manager.d.mts +1 -1
  43. package/dist/internal/otel/page-scope-context-manager.mjs +1 -1
  44. package/dist/internal/otel/provider.d.mts +1 -1
  45. package/dist/internal/otel/provider.mjs +1 -1
  46. package/dist/internal/page-lifecycle/keepalive-budget.d.mts +2 -2
  47. package/dist/internal/page-lifecycle/keepalive-budget.mjs +1 -1
  48. package/dist/internal/page-lifecycle/page-lifecycle.d.mts +2 -0
  49. package/dist/internal/page-lifecycle/page-lifecycle.mjs +1 -1
  50. package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
  51. package/dist/internal/plugins/plugin-runtime.mjs +1 -1
  52. package/dist/internal/react-context.d.mts +1 -1
  53. package/dist/internal/react-dom-keys.d.mts +3 -0
  54. package/dist/internal/react-dom-keys.mjs +1 -0
  55. package/dist/internal/sw-queue-protocol.d.mts +2 -0
  56. package/dist/internal/sw-queue-protocol.mjs +1 -0
  57. package/dist/internal/sw-queue.mjs +1 -1
  58. package/dist/internal/third-party-hosts.d.mts +5 -5
  59. package/dist/internal/third-party-hosts.mjs +1 -1
  60. package/dist/internal/version.mjs +1 -1
  61. package/dist/internal/wrapper-singleton.d.mts +1 -1
  62. package/dist/internal/wrapper-singleton.mjs +1 -1
  63. package/dist/keepalive-budget-BfoHXD04.mjs +1 -0
  64. package/dist/keepalive-chunks-BZv3PhHT.mjs +1 -0
  65. package/dist/kernel-zu11DwyQ.mjs +1 -0
  66. package/dist/{loader-DIaWtHND.mjs → loader-CZ-5Z5A5.mjs} +1 -1
  67. package/dist/msw-C0yLYJU2.mjs +255 -0
  68. package/dist/network-failure-DFMPEnXx.d.mts +19 -0
  69. package/dist/network-failure-GVLV_sUF.mjs +1 -0
  70. package/dist/{page-lifecycle-DTWqGlz2.mjs → page-lifecycle-rJEJNdKj.mjs} +1 -1
  71. package/dist/page-scope-context-manager-Bs-m4fv7.mjs +1 -0
  72. package/dist/{page-scope-context-manager-r92ZMJok.d.mts → page-scope-context-manager-DUhBvuAz.d.mts} +2 -2
  73. package/dist/{plugin-runtime-B1oFO16q.mjs → plugin-runtime-DgB1_Xc5.mjs} +1 -1
  74. package/dist/plugins/device.d.mts +1 -1
  75. package/dist/plugins/errors.d.mts +1 -1
  76. package/dist/plugins/errors.mjs +1 -1
  77. package/dist/plugins/lib/loader.d.mts +1 -1
  78. package/dist/plugins/lib/loader.mjs +1 -1
  79. package/dist/plugins/lib/types.d.mts +1 -1
  80. package/dist/plugins/logs.d.mts +1 -1
  81. package/dist/plugins/logs.mjs +1 -1
  82. package/dist/plugins/page-events.d.mts +1 -1
  83. package/dist/plugins/rage-clicks.d.mts +1 -1
  84. package/dist/plugins/replay/index.d.mts +1 -1
  85. package/dist/plugins/replay/index.mjs +1 -1
  86. package/dist/plugins/replay/upload/delivery.d.mts +1 -1
  87. package/dist/plugins/replay/upload/delivery.mjs +1 -1
  88. package/dist/plugins/replay/upload/upload.mjs +1 -1
  89. package/dist/{provider-CrzoxIxC.d.mts → provider-BMMGZWyS.d.mts} +6 -5
  90. package/dist/provider-DwCQ_vj0.mjs +1 -0
  91. package/dist/{provider-cUByhzgv.d.mts → provider-Dy0mVCx5.d.mts} +4 -2
  92. package/dist/provider.d.mts +1 -1
  93. package/dist/react-dom-keys-BIJuLkQR.mjs +1 -0
  94. package/dist/react-error-handler.d.mts +1 -1
  95. package/dist/sent-at-CEM8UV3W.mjs +1 -0
  96. package/dist/session-retry-Dgkk0yui.mjs +1 -0
  97. package/dist/sw-queue-protocol-DnTSOWxy.mjs +1 -0
  98. package/dist/sw-queue-protocol-DqP1EQtQ.d.mts +22 -0
  99. package/dist/third-party-hosts-CYOuLL_s.mjs +1 -0
  100. package/dist/tracking/api.d.mts +1 -1
  101. package/dist/tracking/api.mjs +1 -1
  102. package/dist/tracking/lifecycle.fixture.d.mts +73 -0
  103. package/dist/tracking/lifecycle.fixture.mjs +1 -0
  104. package/dist/tracking/registration.fixture.d.mts +1 -1
  105. package/dist/tracking/registration.fixture.mjs +1 -255
  106. package/dist/tracking/session-retry.mjs +1 -1
  107. package/dist/upload-D55WVf_o.mjs +1 -0
  108. package/dist/{version-D1R2jz3K.mjs → version-CtEAnX65.mjs} +1 -1
  109. package/package.json +4 -4
  110. package/dist/api-D922KFvx.mjs +0 -1
  111. package/dist/exporter-CJo_iRgv.mjs +0 -1
  112. package/dist/exporter-logs-DS2AXWnV.mjs +0 -1
  113. package/dist/index-BZ_yQUGY.d.mts +0 -4
  114. package/dist/instrumentations-CdmvdXrJ.mjs +0 -1
  115. package/dist/keepalive-budget-DeafGnVZ.mjs +0 -1
  116. package/dist/kernel-OzI-YQDt.mjs +0 -1
  117. package/dist/page-scope-context-manager-DhArvVJ_.mjs +0 -1
  118. package/dist/provider-CDJwsZLm.mjs +0 -1
  119. package/dist/session-retry-C2Uh7eZ6.mjs +0 -1
  120. package/dist/third-party-hosts-BoJNL3xG.mjs +0 -1
  121. package/dist/upload-BIh8Q5UQ.mjs +0 -1
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{i as onPageUnloading,n as onPageHidden}from"./page-lifecycle-rJEJNdKj.mjs";import{t as SessionTracker}from"./api-C8aG7li1.mjs";import{n as getStringGlobal,t as getGlobal}from"./global-DYq1Z4_H.mjs";import{i as setIngestHost,r as resolveTargets}from"./config-VOyDjqS7.mjs";import{a as resolvePrivacyPolicy}from"./privacy-CRuL0X8r.mjs";import{t as PRODUCER_VERSION}from"./version-CtEAnX65.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-CCgTznZ0.mjs";import{t as recordInitialNavigation}from"./initial-navigation-YeK6UUHX.mjs";import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"./exception-span-B74fhBQb.mjs";import{t as PluginRuntime}from"./plugin-runtime-DgB1_Xc5.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{InterfereClient}from"@interfere/javascript";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{readBakedPlugins,remoteConfigInputSchema}from"@interfere/types/sdk/remote-config";import{SERVICE_NAME_GLOBAL}from"@interfere/types/sdk/service-name";import{redactUrl,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";const log=createLogger(`kernel`),REPLAY_UPLOAD_RE=/\/v3\/replay\/upload\//u;function buildSdkStack(wrapperVersions){return[...wrapperVersions??[],PRODUCER_VERSION]}var Kernel=class{consent;identity;device;session;privacyPolicy;urlRedaction;redactUrl=url=>redactUrl(url,this.urlRedaction);seen=new WeakSet;initialNavigationSeen=new Set;runtime=null;otel=null;otelDispose=null;otelControls=null;deviceInfoCaptureEnabled=!1;unsubscribePageHidden=null;unsubscribePageUnloading=null;tracker;constructor(tracker,privacy={}){this.tracker=tracker,this.privacyPolicy=resolvePrivacyPolicy(privacy),this.urlRedaction=resolveUrlRedaction(privacy.urls),this.consent={get:()=>this.requireRuntime().getConsent(),set:value=>{let runtime=this.requireRuntime();value===void 0?runtime.resetConsent():runtime.setConsent(value)}},this.identity={clear:()=>{this.tracker.reset()},get:()=>this.tracker.getIdentity(),set:async params=>this.tracker.identify(params)},this.device={getDeviceId:()=>this.tracker.getDeviceId(),getFpHash:()=>this.tracker.getFpHash()},this.session={getId:()=>this.tracker.sessionId(),getWindowId:()=>this.tracker.windowId()},this.unsubscribePageHidden=onPageHidden(()=>{this.flush().catch(()=>{})}),this.unsubscribePageUnloading=onPageUnloading(()=>{this.flush().catch(()=>{})})}attachRuntime(runtime){this.runtime=runtime}requireRuntime(){if(!this.runtime)throw Error(`Kernel runtime not attached. createKernel must call attachRuntime before any consent/dispose path runs.`);return this.runtime}getSessionId(){return this.tracker.sessionId()??``}getWindowId(){return this.tracker.windowId()??``}onSessionPause(handler){return this.tracker.onSessionPause(handler)}onSessionExceptionWhilePaused(handler){return this.tracker.onSessionExceptionWhilePaused(handler)}noteException(){this.tracker.noteException()}onSessionResume(handler){return this.tracker.onSessionResume(handler)}getPluginConfigState(key){return this.requireRuntime().getPluginConfigState(key)}getReplayConfig(){return this.requireRuntime().getReplayConfig()}isInteractionCaptureEnabled(){return this.requireRuntime().isInteractionCaptureEnabled()}subscribePluginConfigState(key,listener){return this.requireRuntime().subscribePluginConfigState(key,listener)}getTracer(name){return this.otel?.tracerProvider.getTracer(name)??trace.getTracer(name)}startPageEventsCapture(){let{otelControls:controls,otel}=this;return!controls||!otel?null:(controls.setPageEventsEnabled(!0),this.recordInitialNavigation(otel.loggerProvider),(()=>{controls.setPageEventsEnabled(!1)}))}startDeviceInfoCapture(){return this.tracker.startDeviceIdentity(),this.deviceInfoCaptureEnabled=!0,(reason=>{this.deviceInfoCaptureEnabled=!1,reason===`consent-revoked`&&this.tracker.discardDeviceIdentity()})}isDeviceInfoCaptureEnabled(){return this.deviceInfoCaptureEnabled}recordException(value,opts){if(!isNonErrorException(value)){if(this.seen.has(value))return;this.seen.add(value)}if(!isNonErrorException(value)){let stacks=[],current=value;for(let depth=0;current&&depth<5;depth+=1)current.stack&&stacks.push(current.stack),current=current.cause instanceof Error?current.cause:void 0;if(shouldDropBrowserExtensionNoise(stacks)||shouldDropUnresolvableStack(stacks))return}this.tracker.noteException();let attrs=buildExceptionEventAttrs(value,opts),active=trace.getActiveSpan();if(active?.isRecording()){recordExceptionOnSpan(active,value,attrs,opts.mechanism.handled);return}let tracer=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`);if(!tracer)return;let span=startExceptionSpan(tracer,value);recordExceptionOnSpan(span,value,attrs,opts.mechanism.handled),span.end()}recordLog(input){this.otel&&this.otel.loggerProvider.getLogger(`@interfere/react`).emit(omitUndefined({body:input.body,severityNumber:input.severityNumber,severityText:input.severityText,attributes:input.attributes}))}recordInitialNavigation(loggerProvider){recordInitialNavigation({getSessionId:()=>this.session.getId(),getWindowId:()=>this.session.getWindowId(),loggerProvider,redactUrl:this.redactUrl,seen:this.initialNavigationSeen})}async flush(){this.otel&&await this.otel.flush()}attachOtel(handle,dispose,controls){this.otel=handle,this.otelDispose=dispose,this.otelControls=controls??null}syncProviderConfig(config){this.requireRuntime().applyProviderConfig(config.plugins,config.consent)}async dispose(){this.unsubscribePageHidden?.(),this.unsubscribePageHidden=null,this.unsubscribePageUnloading?.(),this.unsubscribePageUnloading=null,this.runtime&&await this.runtime.dispose(),this.tracker.dispose(),this.otelDispose?.(),this.otelDispose=null,this.otel&&=(await this.otel.shutdown(),null)}};async function createKernel(input={}){let{opts={}}=input,fetcher=opts.fetch??globalThis.fetch.bind(globalThis),remotePlugins=await resolveRemotePlugins(opts,fetcher),targets=resolveTargets(opts.apiHost);log.info(`ingest: %s`,targets.ingest.baseUrl),getGlobal(FORCE_ENABLE_GLOBAL)&&log.warn(`FORCE_ENABLE is active. Events will be dropped by production ingest. This should only be set during local development.`);let tracker=new SessionTracker({fetcher,target:targets.ingest});opts._wrapperVersions?.length&&Object.assign(globalThis,{[SDK_STACK_GLOBAL]:opts._wrapperVersions});let kernel=new Kernel(tracker,opts.privacy),runtime=new PluginRuntime(kernel,opts.consent,remotePlugins??{});if(kernel.attachRuntime(runtime),tracker.start(),runtime.start(),opts.tracing!==!1){let resolvedTracing={...typeof opts.tracing==`object`?opts.tracing:void 0},serviceName=opts.serviceName||getStringGlobal(SERVICE_NAME_GLOBAL);serviceName&&(resolvedTracing.serviceName=serviceName),opts.serviceNamespace!==void 0&&(resolvedTracing.serviceNamespace=opts.serviceNamespace),opts._internalAdditionalSpanProcessors&&(resolvedTracing.additionalSpanProcessors=opts._internalAdditionalSpanProcessors),opts._internalAdditionalLogRecordProcessors&&(resolvedTracing.additionalLogRecordProcessors=opts._internalAdditionalLogRecordProcessors),opts._internalAdditionalMetricReaders&&(resolvedTracing.additionalMetricReaders=opts._internalAdditionalMetricReaders),await wireOtel(kernel,targets,opts._wrapperVersions,resolvedTracing)}return remotePlugins?runtime.applyRemoteConfig(remotePlugins):runtime.applyRemoteConfigDefaults(),kernel}async function resolveRemotePlugins(opts,fetcher){let baked=readBakedPlugins();if(baked)return baked;let remoteConfig=await fetchRemoteConfig(resolveTargets(opts.apiHost).config,fetcher);return remoteConfig?.ingestUrl&&setIngestHost(remoteConfig.ingestUrl),remoteConfig?.plugins??null}async function wireOtel(kernel,targets,wrapperVersions,tracing){let{buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,PAGE_SCOPE_MAX_AGE_MS,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope}=await import(`./internal/otel/index.mjs`),releaseSlug=readReleaseSlugFromGlobals(),handle=buildOtelProvider(omitUndefined({clientOptions:targets.ingest,getDeviceId:()=>kernel.device.getDeviceId(),getSessionId:()=>kernel.session.getId(),getPropagationSessionId:()=>kernel.consent.get()?.analytics===!1?null:kernel.session.getId(),isDeviceInfoEnabled:()=>kernel.isDeviceInfoCaptureEnabled(),onExceptionSpan:()=>{kernel.noteException()},releaseSlug,sdkStack:buildSdkStack(wrapperVersions),serviceName:tracing.serviceName||void 0,serviceNamespace:tracing.serviceNamespace,additionalSpanProcessors:[...tracing.spanProcessors??[],...tracing.additionalSpanProcessors??[]],additionalLogRecordProcessors:tracing.additionalLogRecordProcessors,additionalMetricReaders:tracing.additionalMetricReaders,urlRedaction:kernel.urlRedaction})),scopeSpanInput=omitUndefined({tracer:handle.tracerProvider.getTracer(`@interfere/react/navigation`),resolveRoute:tracing.resolveRoute}),extracted=readPropagationFromDocument();handle.contextManager.setPageScope(extracted??seedPageScope(scopeSpanInput)),handle.contextManager.setRotation(createPageScopeRotator(scopeSpanInput),PAGE_SCOPE_MAX_AGE_MS);let disposeNavigationScope=installNavigationScope({...scopeSpanInput,setPageScope:ctx=>{handle.contextManager.setPageScope(ctx)}}),instrumentations=registerBundledInstrumentations(omitUndefined({tracerProvider:handle.tracerProvider,loggerProvider:handle.loggerProvider,ignoreUrls:[INGEST_IGNORE_RE,`${targets.config.baseUrl}/v3/config`,`${targets.ingest.baseUrl}/v3/session`,REPLAY_UPLOAD_RE,...tracing.ignoreUrls??[]],apiHosts:tracing.apiHosts,propagateContextUrls:tracing.propagateContextUrls,resolveRoute:tracing.resolveRoute,captureFailedRequests:tracing.captureFailedRequests,redactUrl:kernel.redactUrl,privacyPolicy:kernel.privacyPolicy,isInteractionCaptureEnabled:()=>kernel.isInteractionCaptureEnabled()}));tracing.webVitals!==!1&&captureWebVitals(omitUndefined({flush:async()=>handle.flush(),meter:handle.meterProvider.getMeter(`@interfere/react/web-vitals`),resolveRoute:tracing.resolveRoute})),kernel.attachOtel(handle,()=>{disposeNavigationScope(),instrumentations.dispose()},{setPageEventsEnabled:instrumentations.setPageEventsEnabled})}async function fetchRemoteConfig(configTarget,fetcher){try{let client=new InterfereClient({...configTarget,fetch:Object.assign(async(url,init)=>fetcher(url,{...init,credentials:`omit`}),fetcher)});return remoteConfigInputSchema.parse(await client.config.getSdkConfig())}catch{return log.warn(`remote config fetch failed, using local defaults`),null}}function readReleaseSlugFromGlobals(){let value=getGlobal(RELEASE_SLUG_GLOBAL);return typeof value==`string`?releaseSlugSchema.parse(value):null}export{readReleaseSlugFromGlobals as i,buildSdkStack as n,createKernel as r,Kernel as t};
@@ -1 +1 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as errorsPlugin}from"./errors-BfUmjgWO.mjs";import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const log=createLogger(`plugins`),LOADERS={device:async()=>import(`./plugins/device.mjs`),errors:()=>errorsPlugin,logs:async()=>import(`./plugins/logs.mjs`),pageEvents:async()=>import(`./plugins/page-events.mjs`),rageClick:async()=>import(`./plugins/rage-clicks.mjs`),replay:async()=>import(`./plugins/replay/index.mjs`)},DEFAULTS=Object.fromEntries(PLUGIN_MANIFEST.map(p=>[p.name,p.defaultEnabled]));function resolveFeatures(overrides){if(!overrides)return{...DEFAULTS};let{pageEvents,replay,...rest}=overrides;return{...DEFAULTS,...rest,pageEvents:pageEvents===void 0?DEFAULTS.pageEvents:pageEvents!==!1,replay:replay===void 0?DEFAULTS.replay:replay!==!1}}function resolvePlugin(mod){return`default`in mod?mod.default:mod}async function loadPlugin(key,context){let loader=LOADERS[key];if(loader===void 0)return null;try{let cleanup=resolvePlugin(await loader()).setup(context);return log.debug(`loaded %s`,key),cleanup??null}catch{return log.error(`failed to load plugin %s`,key),null}}export{loadPlugin as n,resolveFeatures as r,LOADERS as t};
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as errorsPlugin}from"./errors-B8XYW4Q7.mjs";import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const log=createLogger(`plugins`),LOADERS={device:async()=>import(`./plugins/device.mjs`),errors:()=>errorsPlugin,logs:async()=>import(`./plugins/logs.mjs`),pageEvents:async()=>import(`./plugins/page-events.mjs`),rageClick:async()=>import(`./plugins/rage-clicks.mjs`),replay:async()=>import(`./plugins/replay/index.mjs`)},DEFAULTS=Object.fromEntries(PLUGIN_MANIFEST.map(p=>[p.name,p.defaultEnabled]));function resolveFeatures(overrides){if(!overrides)return{...DEFAULTS};let{pageEvents,replay,...rest}=overrides;return{...DEFAULTS,...rest,pageEvents:pageEvents===void 0?DEFAULTS.pageEvents:pageEvents!==!1,replay:replay===void 0?DEFAULTS.replay:replay!==!1}}function resolvePlugin(mod){return`default`in mod?mod.default:mod}async function loadPlugin(key,context){let loader=LOADERS[key];if(loader===void 0)return null;try{let cleanup=resolvePlugin(await loader()).setup(context);return log.debug(`loaded %s`,key),cleanup??null}catch{return log.error(`failed to load plugin %s`,key),null}}export{loadPlugin as n,resolveFeatures as r,LOADERS as t};