@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.
- package/dist/bundle/faro-react.iife.js +1 -1
- package/dist/bundle/types/profiler/FaroProfiler.d.ts +1 -1
- package/dist/bundle/types/profiler/FaroProfiler.test.d.ts +1 -0
- package/dist/cjs/errorBoundary/FaroErrorBoundary.js +31 -49
- package/dist/cjs/errorBoundary/FaroErrorBoundary.js.map +1 -1
- package/dist/cjs/errorBoundary/withFaroErrorBoundary.js +8 -19
- package/dist/cjs/errorBoundary/withFaroErrorBoundary.js.map +1 -1
- package/dist/cjs/instrumentation.js +12 -31
- package/dist/cjs/instrumentation.js.map +1 -1
- package/dist/cjs/profiler/FaroProfiler.js +63 -97
- package/dist/cjs/profiler/FaroProfiler.js.map +1 -1
- package/dist/cjs/profiler/FaroProfiler.test.js +75 -0
- package/dist/cjs/profiler/FaroProfiler.test.js.map +1 -0
- package/dist/cjs/profiler/withFaroProfiler.js +8 -19
- package/dist/cjs/profiler/withFaroProfiler.js.map +1 -1
- package/dist/cjs/router/initialize.js +8 -8
- package/dist/cjs/router/initialize.js.map +1 -1
- package/dist/cjs/router/v4v5/FaroRoute.js +4 -15
- package/dist/cjs/router/v4v5/FaroRoute.js.map +1 -1
- package/dist/cjs/router/v4v5/activeEvent.js +3 -3
- package/dist/cjs/router/v4v5/activeEvent.js.map +1 -1
- package/dist/cjs/router/v4v5/initialize.js +12 -12
- package/dist/cjs/router/v4v5/initialize.js.map +1 -1
- package/dist/cjs/router/v6v7/FaroRoutes.js +16 -27
- package/dist/cjs/router/v6v7/FaroRoutes.js.map +1 -1
- package/dist/cjs/router/v6v7/initialize.js +8 -8
- package/dist/cjs/router/v6v7/initialize.js.map +1 -1
- package/dist/cjs/router/v6v7/utils.js +9 -9
- package/dist/cjs/router/v6v7/utils.js.map +1 -1
- package/dist/cjs/router/v6v7/withFaroRouterInstrumentation.js +13 -24
- package/dist/cjs/router/v6v7/withFaroRouterInstrumentation.js.map +1 -1
- package/dist/cjs/utils/reactVersion.js +2 -2
- package/dist/cjs/utils/reactVersion.js.map +1 -1
- package/dist/esm/profiler/FaroProfiler.js +18 -8
- package/dist/esm/profiler/FaroProfiler.js.map +1 -1
- package/dist/esm/profiler/FaroProfiler.test.js +73 -0
- package/dist/esm/profiler/FaroProfiler.test.js.map +1 -0
- package/dist/types/profiler/FaroProfiler.d.ts +1 -1
- package/dist/types/profiler/FaroProfiler.test.d.ts +1 -0
- 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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
18
|
+
getErrorWithComponentStack(error, errorInfo) {
|
|
36
19
|
if (!utils_1.isReactVersionAtLeast17 || !errorInfo.componentStack) {
|
|
37
20
|
return error;
|
|
38
21
|
}
|
|
39
|
-
|
|
40
|
-
newError.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
|
-
|
|
26
|
+
}
|
|
27
|
+
static getDerivedStateFromError(error) {
|
|
45
28
|
return {
|
|
46
29
|
hasError: true,
|
|
47
|
-
error
|
|
30
|
+
error,
|
|
48
31
|
};
|
|
49
|
-
}
|
|
50
|
-
|
|
32
|
+
}
|
|
33
|
+
componentDidCatch(error, errorInfo) {
|
|
51
34
|
var _a, _b, _c, _d;
|
|
52
|
-
|
|
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
|
|
57
|
-
}
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
react_1.default.createElement(WrappedComponent,
|
|
27
|
-
Component.displayName =
|
|
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":"
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
14
|
+
initialize() {
|
|
33
15
|
(0, dependencies_1.setDependencies)(this.internalLogger, this.api);
|
|
34
16
|
(0, router_1.initializeReactRouterInstrumentation)(this.options);
|
|
35
|
-
}
|
|
36
|
-
|
|
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":"
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
23
|
+
const span = this.tracer.startSpan(spanName, {
|
|
76
24
|
startTime: options === null || options === void 0 ? void 0 : options.startTime,
|
|
77
|
-
attributes:
|
|
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
|
-
|
|
86
|
-
var _this = this;
|
|
32
|
+
}
|
|
33
|
+
createChildSpan(spanName, parent, options) {
|
|
87
34
|
var _a;
|
|
88
|
-
|
|
89
|
-
(_a = this.otel) === null || _a === void 0 ? void 0 : _a.context.with(this.otel.trace.setSpan(this.otel.context.active(), parent),
|
|
90
|
-
span =
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
+
}
|
|
83
|
+
componentDidUpdate() {
|
|
116
84
|
if (this.isOtelInitialized && this.updateSpan) {
|
|
117
85
|
this.updateSpan.end();
|
|
118
86
|
this.updateSpan = undefined;
|
|
119
87
|
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (this.isOtelInitialized && this.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
95
|
+
}
|
|
96
|
+
render() {
|
|
130
97
|
return this.props.children;
|
|
131
|
-
}
|
|
132
|
-
|
|
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":"
|
|
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"]}
|