@grafana/faro-react 2.3.1 → 2.5.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 (40) hide show
  1. package/dist/bundle/faro-react.iife.js +1 -1
  2. package/dist/bundle/types/profiler/FaroProfiler.d.ts +1 -1
  3. package/dist/bundle/types/profiler/FaroProfiler.test.d.ts +1 -0
  4. package/dist/cjs/errorBoundary/FaroErrorBoundary.js +31 -49
  5. package/dist/cjs/errorBoundary/FaroErrorBoundary.js.map +1 -1
  6. package/dist/cjs/errorBoundary/withFaroErrorBoundary.js +8 -19
  7. package/dist/cjs/errorBoundary/withFaroErrorBoundary.js.map +1 -1
  8. package/dist/cjs/instrumentation.js +12 -31
  9. package/dist/cjs/instrumentation.js.map +1 -1
  10. package/dist/cjs/profiler/FaroProfiler.js +63 -97
  11. package/dist/cjs/profiler/FaroProfiler.js.map +1 -1
  12. package/dist/cjs/profiler/FaroProfiler.test.js +75 -0
  13. package/dist/cjs/profiler/FaroProfiler.test.js.map +1 -0
  14. package/dist/cjs/profiler/withFaroProfiler.js +8 -19
  15. package/dist/cjs/profiler/withFaroProfiler.js.map +1 -1
  16. package/dist/cjs/router/initialize.js +8 -8
  17. package/dist/cjs/router/initialize.js.map +1 -1
  18. package/dist/cjs/router/v4v5/FaroRoute.js +4 -15
  19. package/dist/cjs/router/v4v5/FaroRoute.js.map +1 -1
  20. package/dist/cjs/router/v4v5/activeEvent.js +3 -3
  21. package/dist/cjs/router/v4v5/activeEvent.js.map +1 -1
  22. package/dist/cjs/router/v4v5/initialize.js +12 -12
  23. package/dist/cjs/router/v4v5/initialize.js.map +1 -1
  24. package/dist/cjs/router/v6v7/FaroRoutes.js +16 -27
  25. package/dist/cjs/router/v6v7/FaroRoutes.js.map +1 -1
  26. package/dist/cjs/router/v6v7/initialize.js +8 -8
  27. package/dist/cjs/router/v6v7/initialize.js.map +1 -1
  28. package/dist/cjs/router/v6v7/utils.js +9 -9
  29. package/dist/cjs/router/v6v7/utils.js.map +1 -1
  30. package/dist/cjs/router/v6v7/withFaroRouterInstrumentation.js +13 -24
  31. package/dist/cjs/router/v6v7/withFaroRouterInstrumentation.js.map +1 -1
  32. package/dist/cjs/utils/reactVersion.js +2 -2
  33. package/dist/cjs/utils/reactVersion.js.map +1 -1
  34. package/dist/esm/profiler/FaroProfiler.js +18 -8
  35. package/dist/esm/profiler/FaroProfiler.js.map +1 -1
  36. package/dist/esm/profiler/FaroProfiler.test.js +73 -0
  37. package/dist/esm/profiler/FaroProfiler.test.js.map +1 -0
  38. package/dist/types/profiler/FaroProfiler.d.ts +1 -1
  39. package/dist/types/profiler/FaroProfiler.test.d.ts +1 -0
  40. package/package.json +7 -7
@@ -6,4 +6,4 @@ var GrafanaFaroReact=function(e,t,r){"use strict";const n={hasError:!1,error:nul
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
9
- */function E(){return O||(O=1,"production"===process.env.NODE_ENV?g.exports=function(){if(y)return v;y=1;var e="function"==typeof Symbol&&Symbol.for,t=e?Symbol.for("react.element"):60103,r=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,i=e?Symbol.for("react.profiler"):60114,a=e?Symbol.for("react.provider"):60109,u=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,s=e?Symbol.for("react.concurrent_mode"):60111,l=e?Symbol.for("react.forward_ref"):60112,f=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,d=e?Symbol.for("react.memo"):60115,m=e?Symbol.for("react.lazy"):60116,b=e?Symbol.for("react.block"):60121,g=e?Symbol.for("react.fundamental"):60117,h=e?Symbol.for("react.responder"):60118,O=e?Symbol.for("react.scope"):60119;function P(e){if("object"==typeof e&&null!==e){var p=e.$$typeof;switch(p){case t:switch(e=e.type){case c:case s:case n:case i:case o:case f:return e;default:switch(e=e&&e.$$typeof){case u:case l:case m:case d:case a:return e;default:return p}}case r:return p}}}function S(e){return P(e)===s}return v.AsyncMode=c,v.ConcurrentMode=s,v.ContextConsumer=u,v.ContextProvider=a,v.Element=t,v.ForwardRef=l,v.Fragment=n,v.Lazy=m,v.Memo=d,v.Portal=r,v.Profiler=i,v.StrictMode=o,v.Suspense=f,v.isAsyncMode=function(e){return S(e)||P(e)===c},v.isConcurrentMode=S,v.isContextConsumer=function(e){return P(e)===u},v.isContextProvider=function(e){return P(e)===a},v.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===t},v.isForwardRef=function(e){return P(e)===l},v.isFragment=function(e){return P(e)===n},v.isLazy=function(e){return P(e)===m},v.isMemo=function(e){return P(e)===d},v.isPortal=function(e){return P(e)===r},v.isProfiler=function(e){return P(e)===i},v.isStrictMode=function(e){return P(e)===o},v.isSuspense=function(e){return P(e)===f},v.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===n||e===s||e===i||e===o||e===f||e===p||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===d||e.$$typeof===a||e.$$typeof===u||e.$$typeof===l||e.$$typeof===g||e.$$typeof===h||e.$$typeof===O||e.$$typeof===b)},v.typeOf=P,v}():g.exports=(h||(h=1,"production"!==process.env.NODE_ENV&&function(){var e="function"==typeof Symbol&&Symbol.for,t=e?Symbol.for("react.element"):60103,r=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,i=e?Symbol.for("react.profiler"):60114,a=e?Symbol.for("react.provider"):60109,u=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,s=e?Symbol.for("react.concurrent_mode"):60111,l=e?Symbol.for("react.forward_ref"):60112,f=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,d=e?Symbol.for("react.memo"):60115,m=e?Symbol.for("react.lazy"):60116,b=e?Symbol.for("react.block"):60121,y=e?Symbol.for("react.fundamental"):60117,g=e?Symbol.for("react.responder"):60118,v=e?Symbol.for("react.scope"):60119;function h(e){if("object"==typeof e&&null!==e){var p=e.$$typeof;switch(p){case t:var b=e.type;switch(b){case c:case s:case n:case i:case o:case f:return b;default:var y=b&&b.$$typeof;switch(y){case u:case l:case m:case d:case a:return y;default:return p}}case r:return p}}}var O=c,P=s,S=u,E=a,R=t,V=l,T=n,$=m,I=d,F=r,C=i,D=o,N=f,x=!1;function _(e){return h(e)===s}j.AsyncMode=O,j.ConcurrentMode=P,j.ContextConsumer=S,j.ContextProvider=E,j.Element=R,j.ForwardRef=V,j.Fragment=T,j.Lazy=$,j.Memo=I,j.Portal=F,j.Profiler=C,j.StrictMode=D,j.Suspense=N,j.isAsyncMode=function(e){return x||(x=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.")),_(e)||h(e)===c},j.isConcurrentMode=_,j.isContextConsumer=function(e){return h(e)===u},j.isContextProvider=function(e){return h(e)===a},j.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===t},j.isForwardRef=function(e){return h(e)===l},j.isFragment=function(e){return h(e)===n},j.isLazy=function(e){return h(e)===m},j.isMemo=function(e){return h(e)===d},j.isPortal=function(e){return h(e)===r},j.isProfiler=function(e){return h(e)===i},j.isStrictMode=function(e){return h(e)===o},j.isSuspense=function(e){return h(e)===f},j.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===n||e===s||e===i||e===o||e===f||e===p||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===d||e.$$typeof===a||e.$$typeof===u||e.$$typeof===l||e.$$typeof===y||e.$$typeof===g||e.$$typeof===v||e.$$typeof===b)},j.typeOf=h}()),j)),g.exports}var R=function(){if(S)return P;S=1;var e=E(),t={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},r={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},o={};function i(r){return e.isMemo(r)?n:o[r.$$typeof]||t}o[e.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},o[e.Memo]=n;var a=Object.defineProperty,u=Object.getOwnPropertyNames,c=Object.getOwnPropertySymbols,s=Object.getOwnPropertyDescriptor,l=Object.getPrototypeOf,f=Object.prototype;return P=function e(t,n,o){if("string"!=typeof n){if(f){var p=l(n);p&&p!==f&&e(t,p,o)}var d=u(n);c&&(d=d.concat(c(n)));for(var m=i(t),b=i(n),y=0;y<d.length;++y){var g=d[y];if(!(r[g]||o&&o[g]||b&&b[g]||m&&m[g])){var v=s(n,g);try{a(t,g,v)}catch(e){}}}}return t},P}(),V=b(R);const T="unknown";var $,I;let F,C;function D(e){return F={route:"",url:e},F}function N(e){e.history,C=e.Route}function x(e){var r,n;return(null===(r=null==e?void 0:e.computedMatch)||void 0===r?void 0:r.isExact)&&(n=e.computedMatch.path,F&&(F.route=n)),t.createElement(C,Object.assign({},e))}function _(t){var n,o,a,u;const c=t.Route,s=null!==(n=c.displayName)&&void 0!==n?n:c.name;x.displayName=`faroRoute(${s})`,V(x,c),N(t),D(null===(o=r.globalObject.location)||void 0===o?void 0:o.href),null===(u=(a=t.history).listen)||void 0===u||u.call(a,(t,n)=>{var o;n!==e.NavigationType.Push&&n!==e.NavigationType.Pop||(i.pushEvent(r.EVENT_ROUTE_CHANGE,F,void 0,{skipDedupe:!0}),F=void 0,D(null===(o=r.globalObject.location)||void 0===o?void 0:o.href))})}e.ReactRouterVersion=void 0,($=e.ReactRouterVersion||(e.ReactRouterVersion={})).V4="v4",$.V5="v5",$.V6="v6",$.V6_data_router="v6_data_router",$.V7="v7",$.V7_data_router="v7_data_router",e.NavigationType=void 0,(I=e.NavigationType||(e.NavigationType={})).Pop="POP",I.Push="PUSH",I.Replace="REPLACE";let L,M,w,k,B,A=!1;function z(e){return e.split(/\\?\//).filter(e=>e.length>0&&","!==e).length}function U(e,t){if(!e||0===e.length)return t.pathname;const r=M(e,t);let n="";if(r)for(let e=0;e<r.length;e++){const o=r[e],i=o.route;if(i){if(i.index)return o.pathname;let e=i.path;if(e&&(e=e.startsWith("/")?e:`/${e}`,n+=e,o.pathname===t.pathname))return z(n)!==z(o.pathname)?e:n}}return t.pathname}function G(n){var o;const a=null==k?void 0:k(),u=null==B?void 0:B(),c=t.useMemo(()=>{var e;return null!==(e=null==L?void 0:L(n.children))&&void 0!==e?e:[]},[n.children]),s=t.useRef({});t.useEffect(()=>{var t,n;if(A&&(u===e.NavigationType.Push||u===e.NavigationType.Pop)){const e=U(c,a),o=null===(t=r.globalObject.location)||void 0===t?void 0:t.href;i.pushEvent(r.EVENT_ROUTE_CHANGE,Object.assign({toRoute:e,toUrl:null===(n=r.globalObject.location)||void 0===n?void 0:n.href},s.current)),s.current={fromRoute:e,fromUrl:o}}},[a,u,c]);const l=null!==(o=n.routesComponent)&&void 0!==o?o:w;return t.createElement(l,Object.assign({},n))}function W(e){var t;V(G,e.Routes),A=!0,L=(t=e).createRoutesFromChildren,M=t.matchRoutes,w=t.Routes,k=t.useLocation,B=t.useNavigationType}function K(e){A=!0,M=e.matchRoutes}class H extends r.BaseInstrumentation{constructor(e={}){super(),this.options=e,this.name="@grafana/faro-react",this.version=r.VERSION}initialize(){var t,r;t=this.internalLogger,r=this.api,o=t,i=r,function(t){var r;const n="Initializing React Router";switch(null===(r=t.router)||void 0===r?void 0:r.version){case e.ReactRouterVersion.V7:case e.ReactRouterVersion.V6:o.debug(`${n} ${t.router.version} instrumentation`),W(t.router.dependencies);break;case e.ReactRouterVersion.V7_data_router:case e.ReactRouterVersion.V6_data_router:o.debug(`${n} ${t.router.version} data router instrumentation`),K(t.router.dependencies);break;case e.ReactRouterVersion.V5:case e.ReactRouterVersion.V4:o.debug(`${n} ${t.router.version} instrumentation`),_(t.router.dependencies);break;default:o.debug("Skipping initialization of React Router instrumentation")}}(this.options)}}class q extends t.Component{get isOtelInitialized(){return!!(null==i?void 0:i.isOTELInitialized())}get otel(){return null==i?void 0:i.getOTEL()}get tracer(){var e;return null===(e=this.otel)||void 0===e?void 0:e.trace.getTracer("@grafana/faro-react",r.VERSION)}createSpan(e,t){var r,n;const o=this.tracer.startSpan(e,{startTime:null==t?void 0:t.startTime,attributes:Object.assign({"react.component.name":this.props.name},null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:{})});return null===(n=this.otel)||void 0===n||n.trace.setSpan(this.otel.context.active(),o),(null==t?void 0:t.endTime)&&o.end(t.endTime),o}createChildSpan(e,t,r){var n;let o;return null===(n=this.otel)||void 0===n||n.context.with(this.otel.trace.setSpan(this.otel.context.active(),t),()=>{o=this.createSpan(e,r)}),o}constructor(e){super(e),this.mountSpan=void 0,this.mountSpanEndTime=void 0,this.updateSpan=void 0,this.isOtelInitialized?this.mountSpan=this.createSpan("componentMount"):null==o||o.error('The Faro React Profiler requires tracing instrumentation. Please enable it in the "instrumentations" section of your config.')}componentDidMount(){this.isOtelInitialized&&this.mountSpan&&(this.mountSpanEndTime=Date.now(),this.mountSpan.end(this.mountSpanEndTime))}shouldComponentUpdate({updateProps:e}){if(this.isOtelInitialized&&this.mountSpan&&e!==this.props.updateProps){const t=Object.keys(e).filter(t=>e[t]!==this.props.updateProps[t]);t.length>0&&(this.updateSpan=this.createChildSpan("componentUpdate",this.mountSpan,{attributes:{"react.component.changed_props":t}}))}return!0}componentDidUpdate(){this.isOtelInitialized&&this.updateSpan&&(this.updateSpan.end(),this.updateSpan=void 0)}componentWillUnmount(){this.isOtelInitialized&&this.mountSpan&&this.createChildSpan("componentRender",this.mountSpan,{startTime:this.mountSpanEndTime,endTime:Date.now()})}render(){return this.props.children}}return Object.defineProperty(e,"BaseExtension",{enumerable:!0,get:function(){return r.BaseExtension}}),Object.defineProperty(e,"BaseInstrumentation",{enumerable:!0,get:function(){return r.BaseInstrumentation}}),Object.defineProperty(e,"BaseTransport",{enumerable:!0,get:function(){return r.BaseTransport}}),Object.defineProperty(e,"ConsoleInstrumentation",{enumerable:!0,get:function(){return r.ConsoleInstrumentation}}),Object.defineProperty(e,"ConsoleTransport",{enumerable:!0,get:function(){return r.ConsoleTransport}}),Object.defineProperty(e,"ErrorsInstrumentation",{enumerable:!0,get:function(){return r.ErrorsInstrumentation}}),Object.defineProperty(e,"FetchTransport",{enumerable:!0,get:function(){return r.FetchTransport}}),Object.defineProperty(e,"InternalLoggerLevel",{enumerable:!0,get:function(){return r.InternalLoggerLevel}}),Object.defineProperty(e,"LogLevel",{enumerable:!0,get:function(){return r.LogLevel}}),Object.defineProperty(e,"TransportItemType",{enumerable:!0,get:function(){return r.TransportItemType}}),Object.defineProperty(e,"VERSION",{enumerable:!0,get:function(){return r.VERSION}}),Object.defineProperty(e,"ViewInstrumentation",{enumerable:!0,get:function(){return r.ViewInstrumentation}}),Object.defineProperty(e,"WebVitalsInstrumentation",{enumerable:!0,get:function(){return r.WebVitalsInstrumentation}}),Object.defineProperty(e,"allLogLevels",{enumerable:!0,get:function(){return r.allLogLevels}}),Object.defineProperty(e,"browserMeta",{enumerable:!0,get:function(){return r.browserMeta}}),Object.defineProperty(e,"buildStackFrame",{enumerable:!0,get:function(){return r.buildStackFrame}}),Object.defineProperty(e,"createInternalLogger",{enumerable:!0,get:function(){return r.createInternalLogger}}),Object.defineProperty(e,"createPromiseBuffer",{enumerable:!0,get:function(){return r.createPromiseBuffer}}),Object.defineProperty(e,"createSession",{enumerable:!0,get:function(){return r.createSession}}),Object.defineProperty(e,"deepEqual",{enumerable:!0,get:function(){return r.deepEqual}}),Object.defineProperty(e,"defaultEventDomain",{enumerable:!0,get:function(){return r.defaultEventDomain}}),Object.defineProperty(e,"defaultExceptionType",{enumerable:!0,get:function(){return r.defaultExceptionType}}),Object.defineProperty(e,"defaultGlobalObjectKey",{enumerable:!0,get:function(){return r.defaultGlobalObjectKey}}),Object.defineProperty(e,"defaultInternalLoggerLevel",{enumerable:!0,get:function(){return r.defaultInternalLoggerLevel}}),Object.defineProperty(e,"defaultLogLevel",{enumerable:!0,get:function(){return r.defaultLogLevel}}),Object.defineProperty(e,"faro",{enumerable:!0,get:function(){return r.faro}}),Object.defineProperty(e,"genShortID",{enumerable:!0,get:function(){return r.genShortID}}),Object.defineProperty(e,"getCurrentTimestamp",{enumerable:!0,get:function(){return r.getCurrentTimestamp}}),Object.defineProperty(e,"getDataFromSafariExtensions",{enumerable:!0,get:function(){return r.getDataFromSafariExtensions}}),Object.defineProperty(e,"getInternalFaroFromGlobalObject",{enumerable:!0,get:function(){return r.getInternalFaroFromGlobalObject}}),Object.defineProperty(e,"getStackFramesFromError",{enumerable:!0,get:function(){return r.getStackFramesFromError}}),Object.defineProperty(e,"getTransportBody",{enumerable:!0,get:function(){return r.getTransportBody}}),Object.defineProperty(e,"getWebInstrumentations",{enumerable:!0,get:function(){return r.getWebInstrumentations}}),Object.defineProperty(e,"globalObject",{enumerable:!0,get:function(){return r.globalObject}}),Object.defineProperty(e,"initializeFaro",{enumerable:!0,get:function(){return r.initializeFaro}}),Object.defineProperty(e,"internalGlobalObjectKey",{enumerable:!0,get:function(){return r.internalGlobalObjectKey}}),Object.defineProperty(e,"isArray",{enumerable:!0,get:function(){return r.isArray}}),Object.defineProperty(e,"isBoolean",{enumerable:!0,get:function(){return r.isBoolean}}),Object.defineProperty(e,"isDomError",{enumerable:!0,get:function(){return r.isDomError}}),Object.defineProperty(e,"isDomException",{enumerable:!0,get:function(){return r.isDomException}}),Object.defineProperty(e,"isElement",{enumerable:!0,get:function(){return r.isElement}}),Object.defineProperty(e,"isElementDefined",{enumerable:!0,get:function(){return r.isElementDefined}}),Object.defineProperty(e,"isError",{enumerable:!0,get:function(){return r.isError}}),Object.defineProperty(e,"isErrorDefined",{enumerable:!0,get:function(){return r.isErrorDefined}}),Object.defineProperty(e,"isErrorEvent",{enumerable:!0,get:function(){return r.isErrorEvent}}),Object.defineProperty(e,"isEvent",{enumerable:!0,get:function(){return r.isEvent}}),Object.defineProperty(e,"isEventDefined",{enumerable:!0,get:function(){return r.isEventDefined}}),Object.defineProperty(e,"isFunction",{enumerable:!0,get:function(){return r.isFunction}}),Object.defineProperty(e,"isInstanceOf",{enumerable:!0,get:function(){return r.isInstanceOf}}),Object.defineProperty(e,"isInt",{enumerable:!0,get:function(){return r.isInt}}),Object.defineProperty(e,"isInternalFaroOnGlobalObject",{enumerable:!0,get:function(){return r.isInternalFaroOnGlobalObject}}),Object.defineProperty(e,"isMap",{enumerable:!0,get:function(){return r.isMap}}),Object.defineProperty(e,"isMapDefined",{enumerable:!0,get:function(){return r.isMapDefined}}),Object.defineProperty(e,"isNull",{enumerable:!0,get:function(){return r.isNull}}),Object.defineProperty(e,"isNumber",{enumerable:!0,get:function(){return r.isNumber}}),Object.defineProperty(e,"isObject",{enumerable:!0,get:function(){return r.isObject}}),Object.defineProperty(e,"isPrimitive",{enumerable:!0,get:function(){return r.isPrimitive}}),Object.defineProperty(e,"isRegExp",{enumerable:!0,get:function(){return r.isRegExp}}),Object.defineProperty(e,"isString",{enumerable:!0,get:function(){return r.isString}}),Object.defineProperty(e,"isSymbol",{enumerable:!0,get:function(){return r.isSymbol}}),Object.defineProperty(e,"isSyntheticEvent",{enumerable:!0,get:function(){return r.isSyntheticEvent}}),Object.defineProperty(e,"isThenable",{enumerable:!0,get:function(){return r.isThenable}}),Object.defineProperty(e,"isToString",{enumerable:!0,get:function(){return r.isToString}}),Object.defineProperty(e,"isTypeof",{enumerable:!0,get:function(){return r.isTypeof}}),Object.defineProperty(e,"isUndefined",{enumerable:!0,get:function(){return r.isUndefined}}),Object.defineProperty(e,"makeCoreConfig",{enumerable:!0,get:function(){return r.makeCoreConfig}}),Object.defineProperty(e,"noop",{enumerable:!0,get:function(){return r.noop}}),Object.defineProperty(e,"parseStacktrace",{enumerable:!0,get:function(){return r.parseStacktrace}}),Object.defineProperty(e,"setInternalFaroOnGlobalObject",{enumerable:!0,get:function(){return r.setInternalFaroOnGlobalObject}}),Object.defineProperty(e,"transportItemTypeToBodyKey",{enumerable:!0,get:function(){return r.transportItemTypeToBodyKey}}),Object.defineProperty(e,"userActionDataAttribute",{enumerable:!0,get:function(){return r.userActionDataAttribute}}),e.FaroErrorBoundary=m,e.FaroProfiler=q,e.FaroRoute=x,e.FaroRoutes=G,e.ReactIntegration=H,e.createReactRouterV4Options=function(t){return{version:e.ReactRouterVersion.V4,dependencies:t}},e.createReactRouterV5Options=function(t){return{version:e.ReactRouterVersion.V5,dependencies:t}},e.createReactRouterV6DataOptions=function(t){return{version:e.ReactRouterVersion.V6_data_router,dependencies:t}},e.createReactRouterV6Options=function(t){return{version:e.ReactRouterVersion.V6,dependencies:t}},e.createReactRouterV7DataOptions=function(t){return{version:e.ReactRouterVersion.V7_data_router,dependencies:t}},e.createReactRouterV7Options=function(t){return{version:e.ReactRouterVersion.V7,dependencies:t}},e.faroErrorBoundaryInitialState=n,e.getMajorReactVersion=p,e.isReactVersionAtLeast=d,e.isReactVersionAtLeast16=f,e.isReactVersionAtLeast17=l,e.isReactVersionAtLeast18=s,e.isReactVersionAtLeast19=c,e.reactVersion=a,e.reactVersionMajor=u,e.setReactRouterV4V5SSRDependencies=function(e){C=e.Route},e.setReactRouterV6SSRDependencies=function(e){w=e.Routes},e.setReactRouterV7SSRDependencies=function(e){w=e.Routes},e.withFaroErrorBoundary=function(e,r){var n,o;const i=null!==(o=null!==(n=e.displayName)&&void 0!==n?n:e.name)&&void 0!==o?o:T,a=n=>t.createElement(m,Object.assign({},r),t.createElement(e,Object.assign({},n)));return a.displayName=`faroErrorBoundary(${i})`,V(a,e),a},e.withFaroProfiler=function(e,r){var n,o,i;const a=null!==(i=null!==(o=null!==(n=null==r?void 0:r.name)&&void 0!==n?n:e.displayName)&&void 0!==o?o:e.name)&&void 0!==i?i:T,u=r=>t.createElement(q,{name:a,updateProps:r},t.createElement(e,Object.assign({},r)));return u.displayName=`faroProfiler(${a})`,V(u,e),u},e.withFaroRouterInstrumentation=function(t){let n={};return t.subscribe(o=>{var a,u;const c=o.historyAction,s=o.location,l=t.routes;if(A&&(c===e.NavigationType.Push||c===e.NavigationType.Pop)){const e=U(l,s),t=null===(a=r.globalObject.location)||void 0===a?void 0:a.href;i.pushEvent(r.EVENT_ROUTE_CHANGE,Object.assign({toRoute:e,toUrl:null===(u=r.globalObject.location)||void 0===u?void 0:u.href},n)),n={fromRoute:e,fromUrl:t}}}),t},e}({},React,GrafanaFaroWebSdk);
9
+ */function R(){return O||(O=1,"production"===process.env.NODE_ENV?g.exports=function(){if(y)return v;y=1;var e="function"==typeof Symbol&&Symbol.for,t=e?Symbol.for("react.element"):60103,r=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,i=e?Symbol.for("react.profiler"):60114,a=e?Symbol.for("react.provider"):60109,u=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,s=e?Symbol.for("react.concurrent_mode"):60111,l=e?Symbol.for("react.forward_ref"):60112,f=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,d=e?Symbol.for("react.memo"):60115,m=e?Symbol.for("react.lazy"):60116,b=e?Symbol.for("react.block"):60121,g=e?Symbol.for("react.fundamental"):60117,h=e?Symbol.for("react.responder"):60118,O=e?Symbol.for("react.scope"):60119;function P(e){if("object"==typeof e&&null!==e){var p=e.$$typeof;switch(p){case t:switch(e=e.type){case c:case s:case n:case i:case o:case f:return e;default:switch(e=e&&e.$$typeof){case u:case l:case m:case d:case a:return e;default:return p}}case r:return p}}}function S(e){return P(e)===s}return v.AsyncMode=c,v.ConcurrentMode=s,v.ContextConsumer=u,v.ContextProvider=a,v.Element=t,v.ForwardRef=l,v.Fragment=n,v.Lazy=m,v.Memo=d,v.Portal=r,v.Profiler=i,v.StrictMode=o,v.Suspense=f,v.isAsyncMode=function(e){return S(e)||P(e)===c},v.isConcurrentMode=S,v.isContextConsumer=function(e){return P(e)===u},v.isContextProvider=function(e){return P(e)===a},v.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===t},v.isForwardRef=function(e){return P(e)===l},v.isFragment=function(e){return P(e)===n},v.isLazy=function(e){return P(e)===m},v.isMemo=function(e){return P(e)===d},v.isPortal=function(e){return P(e)===r},v.isProfiler=function(e){return P(e)===i},v.isStrictMode=function(e){return P(e)===o},v.isSuspense=function(e){return P(e)===f},v.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===n||e===s||e===i||e===o||e===f||e===p||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===d||e.$$typeof===a||e.$$typeof===u||e.$$typeof===l||e.$$typeof===g||e.$$typeof===h||e.$$typeof===O||e.$$typeof===b)},v.typeOf=P,v}():g.exports=(h||(h=1,"production"!==process.env.NODE_ENV&&function(){var e="function"==typeof Symbol&&Symbol.for,t=e?Symbol.for("react.element"):60103,r=e?Symbol.for("react.portal"):60106,n=e?Symbol.for("react.fragment"):60107,o=e?Symbol.for("react.strict_mode"):60108,i=e?Symbol.for("react.profiler"):60114,a=e?Symbol.for("react.provider"):60109,u=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,s=e?Symbol.for("react.concurrent_mode"):60111,l=e?Symbol.for("react.forward_ref"):60112,f=e?Symbol.for("react.suspense"):60113,p=e?Symbol.for("react.suspense_list"):60120,d=e?Symbol.for("react.memo"):60115,m=e?Symbol.for("react.lazy"):60116,b=e?Symbol.for("react.block"):60121,y=e?Symbol.for("react.fundamental"):60117,g=e?Symbol.for("react.responder"):60118,v=e?Symbol.for("react.scope"):60119;function h(e){if("object"==typeof e&&null!==e){var p=e.$$typeof;switch(p){case t:var b=e.type;switch(b){case c:case s:case n:case i:case o:case f:return b;default:var y=b&&b.$$typeof;switch(y){case u:case l:case m:case d:case a:return y;default:return p}}case r:return p}}}var O=c,P=s,S=u,R=a,E=t,V=l,$=n,T=m,I=d,F=r,C=i,N=o,x=f,D=!1;function _(e){return h(e)===s}j.AsyncMode=O,j.ConcurrentMode=P,j.ContextConsumer=S,j.ContextProvider=R,j.Element=E,j.ForwardRef=V,j.Fragment=$,j.Lazy=T,j.Memo=I,j.Portal=F,j.Profiler=C,j.StrictMode=N,j.Suspense=x,j.isAsyncMode=function(e){return D||(D=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.")),_(e)||h(e)===c},j.isConcurrentMode=_,j.isContextConsumer=function(e){return h(e)===u},j.isContextProvider=function(e){return h(e)===a},j.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===t},j.isForwardRef=function(e){return h(e)===l},j.isFragment=function(e){return h(e)===n},j.isLazy=function(e){return h(e)===m},j.isMemo=function(e){return h(e)===d},j.isPortal=function(e){return h(e)===r},j.isProfiler=function(e){return h(e)===i},j.isStrictMode=function(e){return h(e)===o},j.isSuspense=function(e){return h(e)===f},j.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===n||e===s||e===i||e===o||e===f||e===p||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===d||e.$$typeof===a||e.$$typeof===u||e.$$typeof===l||e.$$typeof===y||e.$$typeof===g||e.$$typeof===v||e.$$typeof===b)},j.typeOf=h}()),j)),g.exports}var E=function(){if(S)return P;S=1;var e=R(),t={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},r={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},o={};function i(r){return e.isMemo(r)?n:o[r.$$typeof]||t}o[e.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},o[e.Memo]=n;var a=Object.defineProperty,u=Object.getOwnPropertyNames,c=Object.getOwnPropertySymbols,s=Object.getOwnPropertyDescriptor,l=Object.getPrototypeOf,f=Object.prototype;return P=function e(t,n,o){if("string"!=typeof n){if(f){var p=l(n);p&&p!==f&&e(t,p,o)}var d=u(n);c&&(d=d.concat(c(n)));for(var m=i(t),b=i(n),y=0;y<d.length;++y){var g=d[y];if(!(r[g]||o&&o[g]||b&&b[g]||m&&m[g])){var v=s(n,g);try{a(t,g,v)}catch(e){}}}}return t},P}(),V=b(E);const $="unknown";var T,I;let F,C;function N(e){return F={route:"",url:e},F}function x(e){e.history,C=e.Route}function D(e){var r,n;return(null===(r=null==e?void 0:e.computedMatch)||void 0===r?void 0:r.isExact)&&(n=e.computedMatch.path,F&&(F.route=n)),t.createElement(C,Object.assign({},e))}function _(t){var n,o,a,u;const c=t.Route,s=null!==(n=c.displayName)&&void 0!==n?n:c.name;D.displayName=`faroRoute(${s})`,V(D,c),x(t),N(null===(o=r.globalObject.location)||void 0===o?void 0:o.href),null===(u=(a=t.history).listen)||void 0===u||u.call(a,(t,n)=>{var o;n!==e.NavigationType.Push&&n!==e.NavigationType.Pop||(i.pushEvent(r.EVENT_ROUTE_CHANGE,F,void 0,{skipDedupe:!0}),F=void 0,N(null===(o=r.globalObject.location)||void 0===o?void 0:o.href))})}e.ReactRouterVersion=void 0,(T=e.ReactRouterVersion||(e.ReactRouterVersion={})).V4="v4",T.V5="v5",T.V6="v6",T.V6_data_router="v6_data_router",T.V7="v7",T.V7_data_router="v7_data_router",e.NavigationType=void 0,(I=e.NavigationType||(e.NavigationType={})).Pop="POP",I.Push="PUSH",I.Replace="REPLACE";let L,M,w,k,B,A=!1;function z(e){return e.split(/\\?\//).filter(e=>e.length>0&&","!==e).length}function U(e,t){if(!e||0===e.length)return t.pathname;const r=M(e,t);let n="";if(r)for(let e=0;e<r.length;e++){const o=r[e],i=o.route;if(i){if(i.index)return o.pathname;let e=i.path;if(e&&(e=e.startsWith("/")?e:`/${e}`,n+=e,o.pathname===t.pathname))return z(n)!==z(o.pathname)?e:n}}return t.pathname}function G(n){var o;const a=null==k?void 0:k(),u=null==B?void 0:B(),c=t.useMemo(()=>{var e;return null!==(e=null==L?void 0:L(n.children))&&void 0!==e?e:[]},[n.children]),s=t.useRef({});t.useEffect(()=>{var t,n;if(A&&(u===e.NavigationType.Push||u===e.NavigationType.Pop)){const e=U(c,a),o=null===(t=r.globalObject.location)||void 0===t?void 0:t.href;i.pushEvent(r.EVENT_ROUTE_CHANGE,Object.assign({toRoute:e,toUrl:null===(n=r.globalObject.location)||void 0===n?void 0:n.href},s.current)),s.current={fromRoute:e,fromUrl:o}}},[a,u,c]);const l=null!==(o=n.routesComponent)&&void 0!==o?o:w;return t.createElement(l,Object.assign({},n))}function W(e){var t;V(G,e.Routes),A=!0,L=(t=e).createRoutesFromChildren,M=t.matchRoutes,w=t.Routes,k=t.useLocation,B=t.useNavigationType}function K(e){A=!0,M=e.matchRoutes}class H extends r.BaseInstrumentation{constructor(e={}){super(),this.options=e,this.name="@grafana/faro-react",this.version=r.VERSION}initialize(){var t,r;t=this.internalLogger,r=this.api,o=t,i=r,function(t){var r;const n="Initializing React Router";switch(null===(r=t.router)||void 0===r?void 0:r.version){case e.ReactRouterVersion.V7:case e.ReactRouterVersion.V6:o.debug(`${n} ${t.router.version} instrumentation`),W(t.router.dependencies);break;case e.ReactRouterVersion.V7_data_router:case e.ReactRouterVersion.V6_data_router:o.debug(`${n} ${t.router.version} data router instrumentation`),K(t.router.dependencies);break;case e.ReactRouterVersion.V5:case e.ReactRouterVersion.V4:o.debug(`${n} ${t.router.version} instrumentation`),_(t.router.dependencies);break;default:o.debug("Skipping initialization of React Router instrumentation")}}(this.options)}}class q extends t.Component{get isOtelInitialized(){return!!(null==i?void 0:i.isOTELInitialized())}get otel(){return null==i?void 0:i.getOTEL()}get tracer(){var e;return null===(e=this.otel)||void 0===e?void 0:e.trace.getTracer("@grafana/faro-react",r.VERSION)}createSpan(e,t){var r,n;const o=this.tracer.startSpan(e,{startTime:null==t?void 0:t.startTime,attributes:Object.assign({"react.component.name":this.props.name},null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:{})});return null===(n=this.otel)||void 0===n||n.trace.setSpan(this.otel.context.active(),o),(null==t?void 0:t.endTime)&&o.end(t.endTime),o}createChildSpan(e,t,r){var n;let o;return null===(n=this.otel)||void 0===n||n.context.with(this.otel.trace.setSpan(this.otel.context.active(),t),()=>{o=this.createSpan(e,r)}),o}constructor(e){super(e),this.mountSpan=void 0,this.renderSpan=void 0,this.updateSpan=void 0,this.isOtelInitialized?this.mountSpan=this.createSpan("componentMount"):null==o||o.error('The Faro React Profiler requires tracing instrumentation. Please enable it in the "instrumentations" section of your config.')}componentDidMount(){this.isOtelInitialized&&this.mountSpan&&(this.mountSpan.end(),this.renderSpan=this.createChildSpan("componentRender",this.mountSpan))}shouldComponentUpdate({updateProps:e}){if(this.isOtelInitialized&&this.mountSpan&&e!==this.props.updateProps){const t=Object.keys(e).filter(t=>e[t]!==this.props.updateProps[t]);t.length>0&&(this.updateSpan=this.createChildSpan("componentUpdate",this.mountSpan,{attributes:{"react.component.changed_props":t}}))}return!0}componentDidUpdate(){this.isOtelInitialized&&this.updateSpan&&(this.updateSpan.end(),this.updateSpan=void 0)}componentWillUnmount(){this.isOtelInitialized&&this.renderSpan&&(this.renderSpan.end(),this.renderSpan=void 0)}render(){return this.props.children}}return Object.defineProperty(e,"BaseExtension",{enumerable:!0,get:function(){return r.BaseExtension}}),Object.defineProperty(e,"BaseInstrumentation",{enumerable:!0,get:function(){return r.BaseInstrumentation}}),Object.defineProperty(e,"BaseTransport",{enumerable:!0,get:function(){return r.BaseTransport}}),Object.defineProperty(e,"ConsoleInstrumentation",{enumerable:!0,get:function(){return r.ConsoleInstrumentation}}),Object.defineProperty(e,"ConsoleTransport",{enumerable:!0,get:function(){return r.ConsoleTransport}}),Object.defineProperty(e,"ErrorsInstrumentation",{enumerable:!0,get:function(){return r.ErrorsInstrumentation}}),Object.defineProperty(e,"FetchTransport",{enumerable:!0,get:function(){return r.FetchTransport}}),Object.defineProperty(e,"InternalLoggerLevel",{enumerable:!0,get:function(){return r.InternalLoggerLevel}}),Object.defineProperty(e,"LogLevel",{enumerable:!0,get:function(){return r.LogLevel}}),Object.defineProperty(e,"TransportItemType",{enumerable:!0,get:function(){return r.TransportItemType}}),Object.defineProperty(e,"VERSION",{enumerable:!0,get:function(){return r.VERSION}}),Object.defineProperty(e,"ViewInstrumentation",{enumerable:!0,get:function(){return r.ViewInstrumentation}}),Object.defineProperty(e,"WebVitalsInstrumentation",{enumerable:!0,get:function(){return r.WebVitalsInstrumentation}}),Object.defineProperty(e,"allLogLevels",{enumerable:!0,get:function(){return r.allLogLevels}}),Object.defineProperty(e,"browserMeta",{enumerable:!0,get:function(){return r.browserMeta}}),Object.defineProperty(e,"buildStackFrame",{enumerable:!0,get:function(){return r.buildStackFrame}}),Object.defineProperty(e,"createInternalLogger",{enumerable:!0,get:function(){return r.createInternalLogger}}),Object.defineProperty(e,"createPromiseBuffer",{enumerable:!0,get:function(){return r.createPromiseBuffer}}),Object.defineProperty(e,"createSession",{enumerable:!0,get:function(){return r.createSession}}),Object.defineProperty(e,"deepEqual",{enumerable:!0,get:function(){return r.deepEqual}}),Object.defineProperty(e,"defaultEventDomain",{enumerable:!0,get:function(){return r.defaultEventDomain}}),Object.defineProperty(e,"defaultExceptionType",{enumerable:!0,get:function(){return r.defaultExceptionType}}),Object.defineProperty(e,"defaultGlobalObjectKey",{enumerable:!0,get:function(){return r.defaultGlobalObjectKey}}),Object.defineProperty(e,"defaultInternalLoggerLevel",{enumerable:!0,get:function(){return r.defaultInternalLoggerLevel}}),Object.defineProperty(e,"defaultLogLevel",{enumerable:!0,get:function(){return r.defaultLogLevel}}),Object.defineProperty(e,"faro",{enumerable:!0,get:function(){return r.faro}}),Object.defineProperty(e,"genShortID",{enumerable:!0,get:function(){return r.genShortID}}),Object.defineProperty(e,"getCurrentTimestamp",{enumerable:!0,get:function(){return r.getCurrentTimestamp}}),Object.defineProperty(e,"getDataFromSafariExtensions",{enumerable:!0,get:function(){return r.getDataFromSafariExtensions}}),Object.defineProperty(e,"getInternalFaroFromGlobalObject",{enumerable:!0,get:function(){return r.getInternalFaroFromGlobalObject}}),Object.defineProperty(e,"getStackFramesFromError",{enumerable:!0,get:function(){return r.getStackFramesFromError}}),Object.defineProperty(e,"getTransportBody",{enumerable:!0,get:function(){return r.getTransportBody}}),Object.defineProperty(e,"getWebInstrumentations",{enumerable:!0,get:function(){return r.getWebInstrumentations}}),Object.defineProperty(e,"globalObject",{enumerable:!0,get:function(){return r.globalObject}}),Object.defineProperty(e,"initializeFaro",{enumerable:!0,get:function(){return r.initializeFaro}}),Object.defineProperty(e,"internalGlobalObjectKey",{enumerable:!0,get:function(){return r.internalGlobalObjectKey}}),Object.defineProperty(e,"isArray",{enumerable:!0,get:function(){return r.isArray}}),Object.defineProperty(e,"isBoolean",{enumerable:!0,get:function(){return r.isBoolean}}),Object.defineProperty(e,"isDomError",{enumerable:!0,get:function(){return r.isDomError}}),Object.defineProperty(e,"isDomException",{enumerable:!0,get:function(){return r.isDomException}}),Object.defineProperty(e,"isElement",{enumerable:!0,get:function(){return r.isElement}}),Object.defineProperty(e,"isElementDefined",{enumerable:!0,get:function(){return r.isElementDefined}}),Object.defineProperty(e,"isError",{enumerable:!0,get:function(){return r.isError}}),Object.defineProperty(e,"isErrorDefined",{enumerable:!0,get:function(){return r.isErrorDefined}}),Object.defineProperty(e,"isErrorEvent",{enumerable:!0,get:function(){return r.isErrorEvent}}),Object.defineProperty(e,"isEvent",{enumerable:!0,get:function(){return r.isEvent}}),Object.defineProperty(e,"isEventDefined",{enumerable:!0,get:function(){return r.isEventDefined}}),Object.defineProperty(e,"isFunction",{enumerable:!0,get:function(){return r.isFunction}}),Object.defineProperty(e,"isInstanceOf",{enumerable:!0,get:function(){return r.isInstanceOf}}),Object.defineProperty(e,"isInt",{enumerable:!0,get:function(){return r.isInt}}),Object.defineProperty(e,"isInternalFaroOnGlobalObject",{enumerable:!0,get:function(){return r.isInternalFaroOnGlobalObject}}),Object.defineProperty(e,"isMap",{enumerable:!0,get:function(){return r.isMap}}),Object.defineProperty(e,"isMapDefined",{enumerable:!0,get:function(){return r.isMapDefined}}),Object.defineProperty(e,"isNull",{enumerable:!0,get:function(){return r.isNull}}),Object.defineProperty(e,"isNumber",{enumerable:!0,get:function(){return r.isNumber}}),Object.defineProperty(e,"isObject",{enumerable:!0,get:function(){return r.isObject}}),Object.defineProperty(e,"isPrimitive",{enumerable:!0,get:function(){return r.isPrimitive}}),Object.defineProperty(e,"isRegExp",{enumerable:!0,get:function(){return r.isRegExp}}),Object.defineProperty(e,"isString",{enumerable:!0,get:function(){return r.isString}}),Object.defineProperty(e,"isSymbol",{enumerable:!0,get:function(){return r.isSymbol}}),Object.defineProperty(e,"isSyntheticEvent",{enumerable:!0,get:function(){return r.isSyntheticEvent}}),Object.defineProperty(e,"isThenable",{enumerable:!0,get:function(){return r.isThenable}}),Object.defineProperty(e,"isToString",{enumerable:!0,get:function(){return r.isToString}}),Object.defineProperty(e,"isTypeof",{enumerable:!0,get:function(){return r.isTypeof}}),Object.defineProperty(e,"isUndefined",{enumerable:!0,get:function(){return r.isUndefined}}),Object.defineProperty(e,"makeCoreConfig",{enumerable:!0,get:function(){return r.makeCoreConfig}}),Object.defineProperty(e,"noop",{enumerable:!0,get:function(){return r.noop}}),Object.defineProperty(e,"parseStacktrace",{enumerable:!0,get:function(){return r.parseStacktrace}}),Object.defineProperty(e,"setInternalFaroOnGlobalObject",{enumerable:!0,get:function(){return r.setInternalFaroOnGlobalObject}}),Object.defineProperty(e,"transportItemTypeToBodyKey",{enumerable:!0,get:function(){return r.transportItemTypeToBodyKey}}),Object.defineProperty(e,"userActionDataAttribute",{enumerable:!0,get:function(){return r.userActionDataAttribute}}),e.FaroErrorBoundary=m,e.FaroProfiler=q,e.FaroRoute=D,e.FaroRoutes=G,e.ReactIntegration=H,e.createReactRouterV4Options=function(t){return{version:e.ReactRouterVersion.V4,dependencies:t}},e.createReactRouterV5Options=function(t){return{version:e.ReactRouterVersion.V5,dependencies:t}},e.createReactRouterV6DataOptions=function(t){return{version:e.ReactRouterVersion.V6_data_router,dependencies:t}},e.createReactRouterV6Options=function(t){return{version:e.ReactRouterVersion.V6,dependencies:t}},e.createReactRouterV7DataOptions=function(t){return{version:e.ReactRouterVersion.V7_data_router,dependencies:t}},e.createReactRouterV7Options=function(t){return{version:e.ReactRouterVersion.V7,dependencies:t}},e.faroErrorBoundaryInitialState=n,e.getMajorReactVersion=p,e.isReactVersionAtLeast=d,e.isReactVersionAtLeast16=f,e.isReactVersionAtLeast17=l,e.isReactVersionAtLeast18=s,e.isReactVersionAtLeast19=c,e.reactVersion=a,e.reactVersionMajor=u,e.setReactRouterV4V5SSRDependencies=function(e){C=e.Route},e.setReactRouterV6SSRDependencies=function(e){w=e.Routes},e.setReactRouterV7SSRDependencies=function(e){w=e.Routes},e.withFaroErrorBoundary=function(e,r){var n,o;const i=null!==(o=null!==(n=e.displayName)&&void 0!==n?n:e.name)&&void 0!==o?o:$,a=n=>t.createElement(m,Object.assign({},r),t.createElement(e,Object.assign({},n)));return a.displayName=`faroErrorBoundary(${i})`,V(a,e),a},e.withFaroProfiler=function(e,r){var n,o,i;const a=null!==(i=null!==(o=null!==(n=null==r?void 0:r.name)&&void 0!==n?n:e.displayName)&&void 0!==o?o:e.name)&&void 0!==i?i:$,u=r=>t.createElement(q,{name:a,updateProps:r},t.createElement(e,Object.assign({},r)));return u.displayName=`faroProfiler(${a})`,V(u,e),u},e.withFaroRouterInstrumentation=function(t){let n={};return t.subscribe(o=>{var a,u;const c=o.historyAction,s=o.location,l=t.routes;if(A&&(c===e.NavigationType.Push||c===e.NavigationType.Pop)){const e=U(l,s),t=null===(a=r.globalObject.location)||void 0===a?void 0:a.href;i.pushEvent(r.EVENT_ROUTE_CHANGE,Object.assign({toRoute:e,toUrl:null===(u=r.globalObject.location)||void 0===u?void 0:u.href},n)),n={fromRoute:e,fromUrl:t}}}),t},e}({},React,GrafanaFaroWebSdk);
@@ -8,7 +8,7 @@ export interface FaroProfilerProps {
8
8
  }
9
9
  export declare class FaroProfiler extends Component<FaroProfilerProps> {
10
10
  protected mountSpan: Span | undefined;
11
- protected mountSpanEndTime: number | undefined;
11
+ protected renderSpan: Span | undefined;
12
12
  protected updateSpan: Span | undefined;
13
13
  private get isOtelInitialized();
14
14
  private get otel();
@@ -0,0 +1 @@
1
+ export {};
@@ -1,78 +1,61 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
2
  Object.defineProperty(exports, "__esModule", { value: true });
18
3
  exports.FaroErrorBoundary = void 0;
19
4
  // React is required in scope for JSX transformation with the classic transform
20
5
  // @ts-expect-error - TS6133: React appears unused but is required for JSX
21
6
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
22
- var react_1 = require("react");
23
- var faro_web_sdk_1 = require("@grafana/faro-web-sdk");
24
- var dependencies_1 = require("../dependencies");
25
- var utils_1 = require("../utils");
26
- var const_1 = require("./const");
27
- var FaroErrorBoundary = /** @class */ (function (_super) {
28
- __extends(FaroErrorBoundary, _super);
29
- function FaroErrorBoundary(props) {
30
- var _this = _super.call(this, props) || this;
31
- _this.state = const_1.faroErrorBoundaryInitialState;
32
- _this.resetErrorBoundary = _this.resetErrorBoundary.bind(_this);
33
- return _this;
7
+ const react_1 = require("react");
8
+ const faro_web_sdk_1 = require("@grafana/faro-web-sdk");
9
+ const dependencies_1 = require("../dependencies");
10
+ const utils_1 = require("../utils");
11
+ const const_1 = require("./const");
12
+ class FaroErrorBoundary extends react_1.Component {
13
+ constructor(props) {
14
+ super(props);
15
+ this.state = const_1.faroErrorBoundaryInitialState;
16
+ this.resetErrorBoundary = this.resetErrorBoundary.bind(this);
34
17
  }
35
- FaroErrorBoundary.prototype.getErrorWithComponentStack = function (error, errorInfo) {
18
+ getErrorWithComponentStack(error, errorInfo) {
36
19
  if (!utils_1.isReactVersionAtLeast17 || !errorInfo.componentStack) {
37
20
  return error;
38
21
  }
39
- var newError = new Error(error.message);
40
- newError.name = "React ErrorBoundary ".concat(error.name);
22
+ const newError = new Error(error.message);
23
+ newError.name = `React ErrorBoundary ${error.name}`;
41
24
  newError.stack = errorInfo.componentStack;
42
25
  return newError;
43
- };
44
- FaroErrorBoundary.getDerivedStateFromError = function (error) {
26
+ }
27
+ static getDerivedStateFromError(error) {
45
28
  return {
46
29
  hasError: true,
47
- error: error,
30
+ error,
48
31
  };
49
- };
50
- FaroErrorBoundary.prototype.componentDidCatch = function (error, errorInfo) {
32
+ }
33
+ componentDidCatch(error, errorInfo) {
51
34
  var _a, _b, _c, _d;
52
- var errorWithComponentStack = this.getErrorWithComponentStack(error, errorInfo);
35
+ const errorWithComponentStack = this.getErrorWithComponentStack(error, errorInfo);
53
36
  (_b = (_a = this.props).beforeCapture) === null || _b === void 0 ? void 0 : _b.call(_a, errorWithComponentStack);
54
37
  dependencies_1.api.pushError(errorWithComponentStack, this.props.pushErrorOptions);
55
38
  (_d = (_c = this.props).onError) === null || _d === void 0 ? void 0 : _d.call(_c, errorWithComponentStack);
56
- this.setState({ hasError: true, error: error });
57
- };
58
- FaroErrorBoundary.prototype.componentDidMount = function () {
39
+ this.setState({ hasError: true, error });
40
+ }
41
+ componentDidMount() {
59
42
  var _a, _b;
60
43
  (_b = (_a = this.props).onMount) === null || _b === void 0 ? void 0 : _b.call(_a);
61
- };
62
- FaroErrorBoundary.prototype.componentWillUnmount = function () {
44
+ }
45
+ componentWillUnmount() {
63
46
  var _a, _b;
64
47
  (_b = (_a = this.props).onUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.error);
65
- };
66
- FaroErrorBoundary.prototype.resetErrorBoundary = function () {
48
+ }
49
+ resetErrorBoundary() {
67
50
  var _a, _b;
68
51
  (_b = (_a = this.props).onReset) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.error);
69
52
  this.setState(const_1.faroErrorBoundaryInitialState);
70
- };
71
- FaroErrorBoundary.prototype.render = function () {
53
+ }
54
+ render() {
72
55
  if (!this.state.hasError) {
73
56
  return (0, faro_web_sdk_1.isFunction)(this.props.children) ? this.props.children() : this.props.children;
74
57
  }
75
- var element = !(0, faro_web_sdk_1.isFunction)(this.props.fallback)
58
+ const element = !(0, faro_web_sdk_1.isFunction)(this.props.fallback)
76
59
  ? this.props.fallback
77
60
  : this.props.fallback(this.state.error, this.resetErrorBoundary);
78
61
  if ((0, react_1.isValidElement)(element)) {
@@ -82,8 +65,7 @@ var FaroErrorBoundary = /** @class */ (function (_super) {
82
65
  dependencies_1.internalLogger === null || dependencies_1.internalLogger === void 0 ? void 0 : dependencies_1.internalLogger.warn('ErrorBoundary\n', 'Cannot get a valid ReactElement from "fallback"');
83
66
  }
84
67
  return null;
85
- };
86
- return FaroErrorBoundary;
87
- }(react_1.Component));
68
+ }
69
+ }
88
70
  exports.FaroErrorBoundary = FaroErrorBoundary;
89
71
  //# sourceMappingURL=FaroErrorBoundary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FaroErrorBoundary.js","sourceRoot":"","sources":["../../../src/errorBoundary/FaroErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["// React is required in scope for JSX transformation with the classic transform\n// @ts-expect-error - TS6133: React appears unused but is required for JSX\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, { Component, isValidElement } from 'react';\nimport type { ErrorInfo, ReactNode } from 'react';\n\nimport { isFunction } from '@grafana/faro-web-sdk';\n\nimport { api, internalLogger } from '../dependencies';\nimport { isReactVersionAtLeast17 } from '../utils';\n\nimport { faroErrorBoundaryInitialState } from './const';\nimport type { FaroErrorBoundaryProps, FaroErrorBoundaryState } from './types';\n\nexport class FaroErrorBoundary extends Component<FaroErrorBoundaryProps, FaroErrorBoundaryState> {\n override state: FaroErrorBoundaryState = faroErrorBoundaryInitialState;\n\n constructor(props: FaroErrorBoundaryProps) {\n super(props);\n\n this.resetErrorBoundary = this.resetErrorBoundary.bind(this);\n }\n\n getErrorWithComponentStack(error: Error, errorInfo: ErrorInfo): Error {\n if (!isReactVersionAtLeast17 || !errorInfo.componentStack) {\n return error;\n }\n\n const newError = new Error(error.message);\n\n newError.name = `React ErrorBoundary ${error.name}`;\n newError.stack = errorInfo.componentStack;\n\n return newError;\n }\n\n static getDerivedStateFromError(error: Error): FaroErrorBoundaryState {\n return {\n hasError: true,\n error,\n };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const errorWithComponentStack = this.getErrorWithComponentStack(error, errorInfo);\n\n this.props.beforeCapture?.(errorWithComponentStack);\n\n api.pushError(errorWithComponentStack, this.props.pushErrorOptions);\n\n this.props.onError?.(errorWithComponentStack);\n\n this.setState({ hasError: true, error });\n }\n\n override componentDidMount(): void {\n this.props.onMount?.();\n }\n\n override componentWillUnmount(): void {\n this.props.onUnmount?.(this.state.error);\n }\n\n resetErrorBoundary(): void {\n this.props.onReset?.(this.state.error);\n\n this.setState(faroErrorBoundaryInitialState);\n }\n\n override render(): ReactNode {\n if (!this.state.hasError) {\n return isFunction(this.props.children) ? this.props.children() : this.props.children;\n }\n\n const element = !isFunction(this.props.fallback)\n ? this.props.fallback\n : this.props.fallback(this.state.error!, this.resetErrorBoundary);\n\n if (isValidElement(element)) {\n return element;\n }\n\n if (this.props.fallback) {\n internalLogger?.warn('ErrorBoundary\\n', 'Cannot get a valid ReactElement from \"fallback\"');\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"FaroErrorBoundary.js","sourceRoot":"","sources":["../../../src/errorBoundary/FaroErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["// React is required in scope for JSX transformation with the classic transform\n// @ts-expect-error - TS6133: React appears unused but is required for JSX\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, { Component, isValidElement } from 'react';\nimport type { ErrorInfo, ReactNode } from 'react';\n\nimport { isFunction } from '@grafana/faro-web-sdk';\n\nimport { api, internalLogger } from '../dependencies';\nimport { isReactVersionAtLeast17 } from '../utils';\n\nimport { faroErrorBoundaryInitialState } from './const';\nimport type { FaroErrorBoundaryProps, FaroErrorBoundaryState } from './types';\n\nexport class FaroErrorBoundary extends Component<FaroErrorBoundaryProps, FaroErrorBoundaryState> {\n override state: FaroErrorBoundaryState = faroErrorBoundaryInitialState;\n\n constructor(props: FaroErrorBoundaryProps) {\n super(props);\n\n this.resetErrorBoundary = this.resetErrorBoundary.bind(this);\n }\n\n getErrorWithComponentStack(error: Error, errorInfo: ErrorInfo): Error {\n if (!isReactVersionAtLeast17 || !errorInfo.componentStack) {\n return error;\n }\n\n const newError = new Error(error.message);\n\n newError.name = `React ErrorBoundary ${error.name}`;\n newError.stack = errorInfo.componentStack;\n\n return newError;\n }\n\n static getDerivedStateFromError(error: Error): FaroErrorBoundaryState {\n return {\n hasError: true,\n error,\n };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const errorWithComponentStack = this.getErrorWithComponentStack(error, errorInfo);\n\n this.props.beforeCapture?.(errorWithComponentStack);\n\n api.pushError(errorWithComponentStack, this.props.pushErrorOptions);\n\n this.props.onError?.(errorWithComponentStack);\n\n this.setState({ hasError: true, error });\n }\n\n override componentDidMount(): void {\n this.props.onMount?.();\n }\n\n override componentWillUnmount(): void {\n this.props.onUnmount?.(this.state.error);\n }\n\n resetErrorBoundary(): void {\n this.props.onReset?.(this.state.error);\n\n this.setState(faroErrorBoundaryInitialState);\n }\n\n override render(): ReactNode {\n if (!this.state.hasError) {\n return isFunction(this.props.children) ? this.props.children() : this.props.children;\n }\n\n const element = !isFunction(this.props.fallback)\n ? this.props.fallback\n : this.props.fallback(this.state.error!, this.resetErrorBoundary);\n\n if (isValidElement(element)) {\n return element;\n }\n\n if (this.props.fallback) {\n internalLogger?.warn('ErrorBoundary\\n', 'Cannot get a valid ReactElement from \"fallback\"');\n }\n\n return null;\n }\n}\n"]}
@@ -1,30 +1,19 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
4
  };
16
5
  Object.defineProperty(exports, "__esModule", { value: true });
17
6
  exports.withFaroErrorBoundary = withFaroErrorBoundary;
18
- var hoist_non_react_statics_1 = __importDefault(require("hoist-non-react-statics"));
19
- var react_1 = __importDefault(require("react"));
20
- var faro_core_1 = require("@grafana/faro-core");
21
- var FaroErrorBoundary_1 = require("./FaroErrorBoundary");
7
+ const hoist_non_react_statics_1 = __importDefault(require("hoist-non-react-statics"));
8
+ const react_1 = __importDefault(require("react"));
9
+ const faro_core_1 = require("@grafana/faro-core");
10
+ const FaroErrorBoundary_1 = require("./FaroErrorBoundary");
22
11
  function withFaroErrorBoundary(WrappedComponent, errorBoundaryProps) {
23
12
  var _a, _b;
24
- var componentDisplayName = (_b = (_a = WrappedComponent.displayName) !== null && _a !== void 0 ? _a : WrappedComponent.name) !== null && _b !== void 0 ? _b : faro_core_1.unknownString;
25
- var Component = function (wrappedComponentProps) { return (react_1.default.createElement(FaroErrorBoundary_1.FaroErrorBoundary, __assign({}, errorBoundaryProps),
26
- react_1.default.createElement(WrappedComponent, __assign({}, wrappedComponentProps)))); };
27
- Component.displayName = "faroErrorBoundary(".concat(componentDisplayName, ")");
13
+ const componentDisplayName = (_b = (_a = WrappedComponent.displayName) !== null && _a !== void 0 ? _a : WrappedComponent.name) !== null && _b !== void 0 ? _b : faro_core_1.unknownString;
14
+ const Component = (wrappedComponentProps) => (react_1.default.createElement(FaroErrorBoundary_1.FaroErrorBoundary, Object.assign({}, errorBoundaryProps),
15
+ react_1.default.createElement(WrappedComponent, Object.assign({}, wrappedComponentProps))));
16
+ Component.displayName = `faroErrorBoundary(${componentDisplayName})`;
28
17
  (0, hoist_non_react_statics_1.default)(Component, WrappedComponent);
29
18
  return Component;
30
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"withFaroErrorBoundary.js","sourceRoot":"","sources":["../../../src/errorBoundary/withFaroErrorBoundary.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASA,sDAiBC;AA1BD,oFAA2D;AAC3D,gDAA0B;AAG1B,gDAAmD;AAEnD,yDAAwD;AAGxD,SAAgB,qBAAqB,CACnC,gBAAkC,EAClC,kBAA0C;;IAE1C,IAAM,oBAAoB,GAAG,MAAA,MAAA,gBAAgB,CAAC,WAAW,mCAAI,gBAAgB,CAAC,IAAI,mCAAI,yBAAa,CAAC;IAEpG,IAAM,SAAS,GAAU,UAAC,qBAAwB,IAAK,OAAA,CACrD,8BAAC,qCAAiB,eAAK,kBAAkB;QACvC,8BAAC,gBAAgB,eAAK,qBAAqB,EAAI,CAC7B,CACrB,EAJsD,CAItD,CAAC;IAEF,SAAS,CAAC,WAAW,GAAG,4BAAqB,oBAAoB,MAAG,CAAC;IAErE,IAAA,iCAAoB,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAElD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import hoistNonReactStatics from 'hoist-non-react-statics';\nimport React from 'react';\nimport type { ComponentType, FC } from 'react';\n\nimport { unknownString } from '@grafana/faro-core';\n\nimport { FaroErrorBoundary } from './FaroErrorBoundary';\nimport type { FaroErrorBoundaryProps, ReactProps } from './types';\n\nexport function withFaroErrorBoundary<P extends ReactProps = {}>(\n WrappedComponent: ComponentType<P>,\n errorBoundaryProps: FaroErrorBoundaryProps\n): FC<P> {\n const componentDisplayName = WrappedComponent.displayName ?? WrappedComponent.name ?? unknownString;\n\n const Component: FC<P> = (wrappedComponentProps: P) => (\n <FaroErrorBoundary {...errorBoundaryProps}>\n <WrappedComponent {...wrappedComponentProps} />\n </FaroErrorBoundary>\n );\n\n Component.displayName = `faroErrorBoundary(${componentDisplayName})`;\n\n hoistNonReactStatics(Component, WrappedComponent);\n\n return Component;\n}\n"]}
1
+ {"version":3,"file":"withFaroErrorBoundary.js","sourceRoot":"","sources":["../../../src/errorBoundary/withFaroErrorBoundary.tsx"],"names":[],"mappings":";;;;;AASA,sDAiBC;AA1BD,sFAA2D;AAC3D,kDAA0B;AAG1B,kDAAmD;AAEnD,2DAAwD;AAGxD,SAAgB,qBAAqB,CACnC,gBAAkC,EAClC,kBAA0C;;IAE1C,MAAM,oBAAoB,GAAG,MAAA,MAAA,gBAAgB,CAAC,WAAW,mCAAI,gBAAgB,CAAC,IAAI,mCAAI,yBAAa,CAAC;IAEpG,MAAM,SAAS,GAAU,CAAC,qBAAwB,EAAE,EAAE,CAAC,CACrD,8BAAC,qCAAiB,oBAAK,kBAAkB;QACvC,8BAAC,gBAAgB,oBAAK,qBAAqB,EAAI,CAC7B,CACrB,CAAC;IAEF,SAAS,CAAC,WAAW,GAAG,qBAAqB,oBAAoB,GAAG,CAAC;IAErE,IAAA,iCAAoB,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAElD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import hoistNonReactStatics from 'hoist-non-react-statics';\nimport React from 'react';\nimport type { ComponentType, FC } from 'react';\n\nimport { unknownString } from '@grafana/faro-core';\n\nimport { FaroErrorBoundary } from './FaroErrorBoundary';\nimport type { FaroErrorBoundaryProps, ReactProps } from './types';\n\nexport function withFaroErrorBoundary<P extends ReactProps = {}>(\n WrappedComponent: ComponentType<P>,\n errorBoundaryProps: FaroErrorBoundaryProps\n): FC<P> {\n const componentDisplayName = WrappedComponent.displayName ?? WrappedComponent.name ?? unknownString;\n\n const Component: FC<P> = (wrappedComponentProps: P) => (\n <FaroErrorBoundary {...errorBoundaryProps}>\n <WrappedComponent {...wrappedComponentProps} />\n </FaroErrorBoundary>\n );\n\n Component.displayName = `faroErrorBoundary(${componentDisplayName})`;\n\n hoistNonReactStatics(Component, WrappedComponent);\n\n return Component;\n}\n"]}
@@ -1,39 +1,20 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
2
  Object.defineProperty(exports, "__esModule", { value: true });
18
3
  exports.ReactIntegration = void 0;
19
- var faro_web_sdk_1 = require("@grafana/faro-web-sdk");
20
- var dependencies_1 = require("./dependencies");
21
- var router_1 = require("./router");
22
- var ReactIntegration = /** @class */ (function (_super) {
23
- __extends(ReactIntegration, _super);
24
- function ReactIntegration(options) {
25
- if (options === void 0) { options = {}; }
26
- var _this = _super.call(this) || this;
27
- _this.options = options;
28
- _this.name = '@grafana/faro-react';
29
- _this.version = faro_web_sdk_1.VERSION;
30
- return _this;
4
+ const faro_web_sdk_1 = require("@grafana/faro-web-sdk");
5
+ const dependencies_1 = require("./dependencies");
6
+ const router_1 = require("./router");
7
+ class ReactIntegration extends faro_web_sdk_1.BaseInstrumentation {
8
+ constructor(options = {}) {
9
+ super();
10
+ this.options = options;
11
+ this.name = '@grafana/faro-react';
12
+ this.version = faro_web_sdk_1.VERSION;
31
13
  }
32
- ReactIntegration.prototype.initialize = function () {
14
+ initialize() {
33
15
  (0, dependencies_1.setDependencies)(this.internalLogger, this.api);
34
16
  (0, router_1.initializeReactRouterInstrumentation)(this.options);
35
- };
36
- return ReactIntegration;
37
- }(faro_web_sdk_1.BaseInstrumentation));
17
+ }
18
+ }
38
19
  exports.ReactIntegration = ReactIntegration;
39
20
  //# sourceMappingURL=instrumentation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,sDAAqE;AAErE,+CAAiD;AACjD,mCAAgE;AAGhE;IAAsC,oCAAmB;IAIvD,0BAAoB,OAAoC;QAApC,wBAAA,EAAA,YAAoC;QACtD,YAAA,MAAK,WAAE,SAAC;QADU,aAAO,GAAP,OAAO,CAA6B;QAHxD,UAAI,GAAG,qBAAqB,CAAC;QAC7B,aAAO,GAAG,sBAAO,CAAC;;IAIlB,CAAC;IAED,qCAAU,GAAV;QACE,IAAA,8BAAe,EAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAA,6CAAoC,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IACH,uBAAC;AAAD,CAAC,AAZD,CAAsC,kCAAmB,GAYxD;AAZY,4CAAgB","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk';\n\nimport { setDependencies } from './dependencies';\nimport { initializeReactRouterInstrumentation } from './router';\nimport type { ReactIntegrationConfig } from './types';\n\nexport class ReactIntegration extends BaseInstrumentation {\n name = '@grafana/faro-react';\n version = VERSION;\n\n constructor(private options: ReactIntegrationConfig = {}) {\n super();\n }\n\n initialize(): void {\n setDependencies(this.internalLogger, this.api);\n initializeReactRouterInstrumentation(this.options);\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":";;;AAAA,wDAAqE;AAErE,iDAAiD;AACjD,qCAAgE;AAGhE,MAAa,gBAAiB,SAAQ,kCAAmB;IAIvD,YAAoB,UAAkC,EAAE;QACtD,KAAK,EAAE,CAAC;QADU,YAAO,GAAP,OAAO,CAA6B;QAHxD,SAAI,GAAG,qBAAqB,CAAC;QAC7B,YAAO,GAAG,sBAAO,CAAC;IAIlB,CAAC;IAED,UAAU;QACR,IAAA,8BAAe,EAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAA,6CAAoC,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;CACF;AAZD,4CAYC","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk';\n\nimport { setDependencies } from './dependencies';\nimport { initializeReactRouterInstrumentation } from './router';\nimport type { ReactIntegrationConfig } from './types';\n\nexport class ReactIntegration extends BaseInstrumentation {\n name = '@grafana/faro-react';\n version = VERSION;\n\n constructor(private options: ReactIntegrationConfig = {}) {\n super();\n }\n\n initialize(): void {\n setDependencies(this.internalLogger, this.api);\n initializeReactRouterInstrumentation(this.options);\n }\n}\n"]}
@@ -1,107 +1,75 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __assign = (this && this.__assign) || function () {
18
- __assign = Object.assign || function(t) {
19
- for (var s, i = 1, n = arguments.length; i < n; i++) {
20
- s = arguments[i];
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
- t[p] = s[p];
23
- }
24
- return t;
25
- };
26
- return __assign.apply(this, arguments);
27
- };
28
2
  Object.defineProperty(exports, "__esModule", { value: true });
29
3
  exports.FaroProfiler = void 0;
30
4
  // React is required in scope for JSX transformation with the classic transform
31
5
  // @ts-expect-error - TS6133: React appears unused but is required for JSX
32
6
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
33
- var react_1 = require("react");
34
- var faro_web_sdk_1 = require("@grafana/faro-web-sdk");
35
- var dependencies_1 = require("../dependencies");
36
- var FaroProfiler = /** @class */ (function (_super) {
37
- __extends(FaroProfiler, _super);
38
- function FaroProfiler(props) {
39
- var _this = _super.call(this, props) || this;
40
- _this.mountSpan = undefined;
41
- _this.mountSpanEndTime = undefined;
42
- _this.updateSpan = undefined;
43
- if (_this.isOtelInitialized) {
44
- _this.mountSpan = _this.createSpan('componentMount');
45
- }
46
- else {
47
- dependencies_1.internalLogger === null || dependencies_1.internalLogger === void 0 ? void 0 : dependencies_1.internalLogger.error('The Faro React Profiler requires tracing instrumentation. Please enable it in the "instrumentations" section of your config.');
48
- }
49
- return _this;
7
+ const react_1 = require("react");
8
+ const faro_web_sdk_1 = require("@grafana/faro-web-sdk");
9
+ const dependencies_1 = require("../dependencies");
10
+ class FaroProfiler extends react_1.Component {
11
+ get isOtelInitialized() {
12
+ return !!(dependencies_1.api === null || dependencies_1.api === void 0 ? void 0 : dependencies_1.api.isOTELInitialized());
13
+ }
14
+ get otel() {
15
+ return dependencies_1.api === null || dependencies_1.api === void 0 ? void 0 : dependencies_1.api.getOTEL();
50
16
  }
51
- Object.defineProperty(FaroProfiler.prototype, "isOtelInitialized", {
52
- get: function () {
53
- return !!(dependencies_1.api === null || dependencies_1.api === void 0 ? void 0 : dependencies_1.api.isOTELInitialized());
54
- },
55
- enumerable: false,
56
- configurable: true
57
- });
58
- Object.defineProperty(FaroProfiler.prototype, "otel", {
59
- get: function () {
60
- return dependencies_1.api === null || dependencies_1.api === void 0 ? void 0 : dependencies_1.api.getOTEL();
61
- },
62
- enumerable: false,
63
- configurable: true
64
- });
65
- Object.defineProperty(FaroProfiler.prototype, "tracer", {
66
- get: function () {
67
- var _a;
68
- return (_a = this.otel) === null || _a === void 0 ? void 0 : _a.trace.getTracer('@grafana/faro-react', faro_web_sdk_1.VERSION);
69
- },
70
- enumerable: false,
71
- configurable: true
72
- });
73
- FaroProfiler.prototype.createSpan = function (spanName, options) {
17
+ get tracer() {
18
+ var _a;
19
+ return (_a = this.otel) === null || _a === void 0 ? void 0 : _a.trace.getTracer('@grafana/faro-react', faro_web_sdk_1.VERSION);
20
+ }
21
+ createSpan(spanName, options) {
74
22
  var _a, _b;
75
- var span = this.tracer.startSpan(spanName, {
23
+ const span = this.tracer.startSpan(spanName, {
76
24
  startTime: options === null || options === void 0 ? void 0 : options.startTime,
77
- attributes: __assign({ 'react.component.name': this.props.name }, ((_a = options === null || options === void 0 ? void 0 : options.attributes) !== null && _a !== void 0 ? _a : {})),
25
+ attributes: Object.assign({ 'react.component.name': this.props.name }, ((_a = options === null || options === void 0 ? void 0 : options.attributes) !== null && _a !== void 0 ? _a : {})),
78
26
  });
79
27
  (_b = this.otel) === null || _b === void 0 ? void 0 : _b.trace.setSpan(this.otel.context.active(), span);
80
28
  if (options === null || options === void 0 ? void 0 : options.endTime) {
81
29
  span.end(options.endTime);
82
30
  }
83
31
  return span;
84
- };
85
- FaroProfiler.prototype.createChildSpan = function (spanName, parent, options) {
86
- var _this = this;
32
+ }
33
+ createChildSpan(spanName, parent, options) {
87
34
  var _a;
88
- var span;
89
- (_a = this.otel) === null || _a === void 0 ? void 0 : _a.context.with(this.otel.trace.setSpan(this.otel.context.active(), parent), function () {
90
- span = _this.createSpan(spanName, options);
35
+ let span;
36
+ (_a = this.otel) === null || _a === void 0 ? void 0 : _a.context.with(this.otel.trace.setSpan(this.otel.context.active(), parent), () => {
37
+ span = this.createSpan(spanName, options);
91
38
  });
92
39
  return span;
93
- };
94
- FaroProfiler.prototype.componentDidMount = function () {
40
+ }
41
+ constructor(props) {
42
+ super(props);
43
+ this.mountSpan = undefined;
44
+ this.renderSpan = undefined;
45
+ this.updateSpan = undefined;
46
+ if (this.isOtelInitialized) {
47
+ this.mountSpan = this.createSpan('componentMount');
48
+ }
49
+ else {
50
+ dependencies_1.internalLogger === null || dependencies_1.internalLogger === void 0 ? void 0 : dependencies_1.internalLogger.error('The Faro React Profiler requires tracing instrumentation. Please enable it in the "instrumentations" section of your config.');
51
+ }
52
+ }
53
+ componentDidMount() {
95
54
  if (this.isOtelInitialized && this.mountSpan) {
96
- this.mountSpanEndTime = Date.now();
97
- this.mountSpan.end(this.mountSpanEndTime);
55
+ // Let OTel stamp the end via its hrTime helper (`performance.timeOrigin +
56
+ // performance.now()`), which is monotonic. Passing `Date.now()` here would mix the
57
+ // wall clock with the mount span's start time (auto-stamped by OTel from hrTime),
58
+ // making `endTime - startTime` drift with NTP / DST / manual clock changes.
59
+ this.mountSpan.end();
60
+ // Start the `componentRender` span immediately. It covers the live, mounted lifetime
61
+ // of the component and is ended in `componentWillUnmount`. By starting and ending it
62
+ // without explicit timestamps, both boundaries are stamped from OTel hrTime
63
+ // (monotonic). This avoids the wall-clock issues of the previous implementation
64
+ // which captured `Date.now()` here and subtracted it from another `Date.now()` at
65
+ // unmount — a problem that compounded over a long-lived component (router/app
66
+ // shells can live for the entire session).
67
+ this.renderSpan = this.createChildSpan('componentRender', this.mountSpan);
98
68
  }
99
- };
100
- FaroProfiler.prototype.shouldComponentUpdate = function (_a) {
101
- var _this = this;
102
- var updateProps = _a.updateProps;
69
+ }
70
+ shouldComponentUpdate({ updateProps }) {
103
71
  if (this.isOtelInitialized && this.mountSpan && updateProps !== this.props.updateProps) {
104
- var changedProps = Object.keys(updateProps).filter(function (key) { return updateProps[key] !== _this.props.updateProps[key]; });
72
+ const changedProps = Object.keys(updateProps).filter((key) => updateProps[key] !== this.props.updateProps[key]);
105
73
  if (changedProps.length > 0) {
106
74
  this.updateSpan = this.createChildSpan('componentUpdate', this.mountSpan, {
107
75
  attributes: {
@@ -111,25 +79,23 @@ var FaroProfiler = /** @class */ (function (_super) {
111
79
  }
112
80
  }
113
81
  return true;
114
- };
115
- FaroProfiler.prototype.componentDidUpdate = function () {
82
+ }
83
+ componentDidUpdate() {
116
84
  if (this.isOtelInitialized && this.updateSpan) {
117
85
  this.updateSpan.end();
118
86
  this.updateSpan = undefined;
119
87
  }
120
- };
121
- FaroProfiler.prototype.componentWillUnmount = function () {
122
- if (this.isOtelInitialized && this.mountSpan) {
123
- this.createChildSpan('componentRender', this.mountSpan, {
124
- startTime: this.mountSpanEndTime,
125
- endTime: Date.now(),
126
- });
88
+ }
89
+ componentWillUnmount() {
90
+ if (this.isOtelInitialized && this.renderSpan) {
91
+ // End via OTel hrTime (monotonic). See `componentDidMount` for rationale.
92
+ this.renderSpan.end();
93
+ this.renderSpan = undefined;
127
94
  }
128
- };
129
- FaroProfiler.prototype.render = function () {
95
+ }
96
+ render() {
130
97
  return this.props.children;
131
- };
132
- return FaroProfiler;
133
- }(react_1.Component));
98
+ }
99
+ }
134
100
  exports.FaroProfiler = FaroProfiler;
135
101
  //# sourceMappingURL=FaroProfiler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FaroProfiler.js","sourceRoot":"","sources":["../../../src/profiler/FaroProfiler.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Attributes, Span, Tracer } from '@opentelemetry/api';\n// React is required in scope for JSX transformation with the classic transform\n// @ts-expect-error - TS6133: React appears unused but is required for JSX\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, { Component } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { VERSION } from '@grafana/faro-web-sdk';\nimport type { OTELApi } from '@grafana/faro-web-sdk';\n\nimport { api, internalLogger } from '../dependencies';\n\nexport interface FaroProfilerProps {\n children: ReactNode;\n name: string;\n updateProps: Record<string, unknown>;\n}\n\nexport class FaroProfiler extends Component<FaroProfilerProps> {\n protected mountSpan: Span | undefined = undefined;\n protected mountSpanEndTime: number | undefined = undefined;\n protected updateSpan: Span | undefined = undefined;\n\n private get isOtelInitialized(): boolean {\n return !!api?.isOTELInitialized();\n }\n\n private get otel(): OTELApi | undefined {\n return api?.getOTEL()!;\n }\n\n private get tracer(): Tracer {\n return this.otel?.trace.getTracer('@grafana/faro-react', VERSION)!;\n }\n\n private createSpan(\n spanName: string,\n options?: { startTime?: number; endTime?: number; attributes?: Attributes }\n ): Span {\n const span = this.tracer.startSpan(spanName, {\n startTime: options?.startTime,\n attributes: {\n 'react.component.name': this.props.name,\n ...(options?.attributes ?? {}),\n },\n });\n\n this.otel?.trace.setSpan(this.otel.context.active(), span);\n\n if (options?.endTime) {\n span.end(options.endTime);\n }\n\n return span;\n }\n\n private createChildSpan(\n spanName: string,\n parent: Span,\n options?: { startTime?: number; endTime?: number; attributes?: Attributes }\n ): Span {\n let span: Span;\n\n this.otel?.context.with(this.otel.trace.setSpan(this.otel.context.active(), parent), () => {\n span = this.createSpan(spanName, options);\n });\n\n return span!;\n }\n\n constructor(props: FaroProfilerProps) {\n super(props);\n\n if (this.isOtelInitialized) {\n this.mountSpan = this.createSpan('componentMount');\n } else {\n internalLogger?.error(\n 'The Faro React Profiler requires tracing instrumentation. Please enable it in the \"instrumentations\" section of your config.'\n );\n }\n }\n\n override componentDidMount(): void {\n if (this.isOtelInitialized && this.mountSpan) {\n this.mountSpanEndTime = Date.now();\n this.mountSpan.end(this.mountSpanEndTime);\n }\n }\n\n override shouldComponentUpdate({ updateProps }: FaroProfilerProps): boolean {\n if (this.isOtelInitialized && this.mountSpan && updateProps !== this.props.updateProps) {\n const changedProps = Object.keys(updateProps).filter((key) => updateProps[key] !== this.props.updateProps[key]);\n\n if (changedProps.length > 0) {\n this.updateSpan = this.createChildSpan('componentUpdate', this.mountSpan, {\n attributes: {\n 'react.component.changed_props': changedProps,\n },\n });\n }\n }\n\n return true;\n }\n\n override componentDidUpdate(): void {\n if (this.isOtelInitialized && this.updateSpan) {\n this.updateSpan.end();\n this.updateSpan = undefined;\n }\n }\n\n override componentWillUnmount(): void {\n if (this.isOtelInitialized && this.mountSpan) {\n this.createChildSpan('componentRender', this.mountSpan, {\n startTime: this.mountSpanEndTime,\n endTime: Date.now(),\n });\n }\n }\n\n override render(): ReactNode {\n return this.props.children;\n }\n}\n"]}
1
+ {"version":3,"file":"FaroProfiler.js","sourceRoot":"","sources":["../../../src/profiler/FaroProfiler.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Attributes, Span, Tracer } from '@opentelemetry/api';\n// React is required in scope for JSX transformation with the classic transform\n// @ts-expect-error - TS6133: React appears unused but is required for JSX\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, { Component } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { VERSION } from '@grafana/faro-web-sdk';\nimport type { OTELApi } from '@grafana/faro-web-sdk';\n\nimport { api, internalLogger } from '../dependencies';\n\nexport interface FaroProfilerProps {\n children: ReactNode;\n name: string;\n updateProps: Record<string, unknown>;\n}\n\nexport class FaroProfiler extends Component<FaroProfilerProps> {\n protected mountSpan: Span | undefined = undefined;\n protected renderSpan: Span | undefined = undefined;\n protected updateSpan: Span | undefined = undefined;\n\n private get isOtelInitialized(): boolean {\n return !!api?.isOTELInitialized();\n }\n\n private get otel(): OTELApi | undefined {\n return api?.getOTEL()!;\n }\n\n private get tracer(): Tracer {\n return this.otel?.trace.getTracer('@grafana/faro-react', VERSION)!;\n }\n\n private createSpan(\n spanName: string,\n options?: { startTime?: number; endTime?: number; attributes?: Attributes }\n ): Span {\n const span = this.tracer.startSpan(spanName, {\n startTime: options?.startTime,\n attributes: {\n 'react.component.name': this.props.name,\n ...(options?.attributes ?? {}),\n },\n });\n\n this.otel?.trace.setSpan(this.otel.context.active(), span);\n\n if (options?.endTime) {\n span.end(options.endTime);\n }\n\n return span;\n }\n\n private createChildSpan(\n spanName: string,\n parent: Span,\n options?: { startTime?: number; endTime?: number; attributes?: Attributes }\n ): Span {\n let span: Span;\n\n this.otel?.context.with(this.otel.trace.setSpan(this.otel.context.active(), parent), () => {\n span = this.createSpan(spanName, options);\n });\n\n return span!;\n }\n\n constructor(props: FaroProfilerProps) {\n super(props);\n\n if (this.isOtelInitialized) {\n this.mountSpan = this.createSpan('componentMount');\n } else {\n internalLogger?.error(\n 'The Faro React Profiler requires tracing instrumentation. Please enable it in the \"instrumentations\" section of your config.'\n );\n }\n }\n\n override componentDidMount(): void {\n if (this.isOtelInitialized && this.mountSpan) {\n // Let OTel stamp the end via its hrTime helper (`performance.timeOrigin +\n // performance.now()`), which is monotonic. Passing `Date.now()` here would mix the\n // wall clock with the mount span's start time (auto-stamped by OTel from hrTime),\n // making `endTime - startTime` drift with NTP / DST / manual clock changes.\n this.mountSpan.end();\n\n // Start the `componentRender` span immediately. It covers the live, mounted lifetime\n // of the component and is ended in `componentWillUnmount`. By starting and ending it\n // without explicit timestamps, both boundaries are stamped from OTel hrTime\n // (monotonic). This avoids the wall-clock issues of the previous implementation\n // which captured `Date.now()` here and subtracted it from another `Date.now()` at\n // unmount — a problem that compounded over a long-lived component (router/app\n // shells can live for the entire session).\n this.renderSpan = this.createChildSpan('componentRender', this.mountSpan);\n }\n }\n\n override shouldComponentUpdate({ updateProps }: FaroProfilerProps): boolean {\n if (this.isOtelInitialized && this.mountSpan && updateProps !== this.props.updateProps) {\n const changedProps = Object.keys(updateProps).filter((key) => updateProps[key] !== this.props.updateProps[key]);\n\n if (changedProps.length > 0) {\n this.updateSpan = this.createChildSpan('componentUpdate', this.mountSpan, {\n attributes: {\n 'react.component.changed_props': changedProps,\n },\n });\n }\n }\n\n return true;\n }\n\n override componentDidUpdate(): void {\n if (this.isOtelInitialized && this.updateSpan) {\n this.updateSpan.end();\n this.updateSpan = undefined;\n }\n }\n\n override componentWillUnmount(): void {\n if (this.isOtelInitialized && this.renderSpan) {\n // End via OTel hrTime (monotonic). See `componentDidMount` for rationale.\n this.renderSpan.end();\n this.renderSpan = undefined;\n }\n }\n\n override render(): ReactNode {\n return this.props.children;\n }\n}\n"]}