use-page-view 0.0.1 → 1.0.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/README.md
CHANGED
@@ -199,10 +199,6 @@ The hook uses the following browser APIs:
|
|
199
199
|
|
200
200
|
It's compatible with all modern browsers that support these features.
|
201
201
|
|
202
|
-
## Contributing
|
203
|
-
|
204
|
-
Contributions are welcome! Please feel free to submit a Pull Request.
|
205
|
-
|
206
202
|
## License
|
207
203
|
|
208
204
|
MIT © [Christopher S. Aondona](https://codingsimba.com)
|
@@ -179,4 +179,4 @@ Unable to find an `+(r===!1?`accessible `:``)+`element with the role "`+t+`"`+c+
|
|
179
179
|
`+s).trim()},BT=Dw(FT,FT.name,`queryAll`),[VT,HT,UT,WT,GT]=Ow(FT,RT,zT),KT=()=>Q().testIdAttribute,qT=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return xC(t[0]),xw(KT(),...t)},JT=(e,t)=>`Found multiple elements by: [`+KT()+`="`+t+`"]`,YT=(e,t)=>`Unable to find an element by: [`+KT()+`="`+t+`"]`,XT=Dw(qT,qT.name,`queryAll`),[ZT,QT,$T,eE,tE]=Ow(qT,JT,YT);var nE=Object.freeze({__proto__:null,queryAllByLabelText:Vw,queryByLabelText:Fw,getAllByLabelText:zw,getByLabelText:Bw,findAllByLabelText:Lw,findByLabelText:Rw,queryByPlaceholderText:Kw,queryAllByPlaceholderText:Gw,getByPlaceholderText:Jw,getAllByPlaceholderText:qw,findAllByPlaceholderText:Yw,findByPlaceholderText:Xw,queryByText:tT,queryAllByText:eT,getByText:rT,getAllByText:nT,findAllByText:iT,findByText:aT,queryByDisplayValue:uT,queryAllByDisplayValue:lT,getByDisplayValue:fT,getAllByDisplayValue:dT,findAllByDisplayValue:pT,findByDisplayValue:mT,queryByAltText:bT,queryAllByAltText:yT,getByAltText:ST,getAllByAltText:xT,findAllByAltText:CT,findByAltText:wT,queryByTitle:AT,queryAllByTitle:kT,getByTitle:MT,getAllByTitle:jT,findAllByTitle:NT,findByTitle:PT,queryByRole:VT,queryAllByRole:BT,getAllByRole:HT,getByRole:UT,findAllByRole:WT,findByRole:GT,queryByTestId:ZT,queryAllByTestId:XT,getByTestId:$T,getAllByTestId:QT,findAllByTestId:eE,findByTestId:tE});function rE(e,t,n){return t===void 0&&(t=nE),n===void 0&&(n={}),Object.keys(t).reduce((n,r)=>{let i=t[r];return n[r]=i.bind(null,e),n},n)}const iE={copy:{EventType:`ClipboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},cut:{EventType:`ClipboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},paste:{EventType:`ClipboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},compositionEnd:{EventType:`CompositionEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},compositionStart:{EventType:`CompositionEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},compositionUpdate:{EventType:`CompositionEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},keyDown:{EventType:`KeyboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,charCode:0,composed:!0}},keyPress:{EventType:`KeyboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,charCode:0,composed:!0}},keyUp:{EventType:`KeyboardEvent`,defaultInit:{bubbles:!0,cancelable:!0,charCode:0,composed:!0}},focus:{EventType:`FocusEvent`,defaultInit:{bubbles:!1,cancelable:!1,composed:!0}},blur:{EventType:`FocusEvent`,defaultInit:{bubbles:!1,cancelable:!1,composed:!0}},focusIn:{EventType:`FocusEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},focusOut:{EventType:`FocusEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},change:{EventType:`Event`,defaultInit:{bubbles:!0,cancelable:!1}},input:{EventType:`InputEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},invalid:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!0}},submit:{EventType:`Event`,defaultInit:{bubbles:!0,cancelable:!0}},reset:{EventType:`Event`,defaultInit:{bubbles:!0,cancelable:!0}},click:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,button:0,composed:!0}},contextMenu:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},dblClick:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},drag:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},dragEnd:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},dragEnter:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},dragExit:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},dragLeave:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},dragOver:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},dragStart:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},drop:{EventType:`DragEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},mouseDown:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},mouseEnter:{EventType:`MouseEvent`,defaultInit:{bubbles:!1,cancelable:!1,composed:!0}},mouseLeave:{EventType:`MouseEvent`,defaultInit:{bubbles:!1,cancelable:!1,composed:!0}},mouseMove:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},mouseOut:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},mouseOver:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},mouseUp:{EventType:`MouseEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},select:{EventType:`Event`,defaultInit:{bubbles:!0,cancelable:!1}},touchCancel:{EventType:`TouchEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},touchEnd:{EventType:`TouchEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},touchMove:{EventType:`TouchEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},touchStart:{EventType:`TouchEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},resize:{EventType:`UIEvent`,defaultInit:{bubbles:!1,cancelable:!1}},scroll:{EventType:`UIEvent`,defaultInit:{bubbles:!1,cancelable:!1}},wheel:{EventType:`WheelEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},abort:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},canPlay:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},canPlayThrough:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},durationChange:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},emptied:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},encrypted:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},ended:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},loadedData:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},loadedMetadata:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},loadStart:{EventType:`ProgressEvent`,defaultInit:{bubbles:!1,cancelable:!1}},pause:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},play:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},playing:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},progress:{EventType:`ProgressEvent`,defaultInit:{bubbles:!1,cancelable:!1}},rateChange:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},seeked:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},seeking:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},stalled:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},suspend:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},timeUpdate:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},volumeChange:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},waiting:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},load:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},error:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},animationStart:{EventType:`AnimationEvent`,defaultInit:{bubbles:!0,cancelable:!1}},animationEnd:{EventType:`AnimationEvent`,defaultInit:{bubbles:!0,cancelable:!1}},animationIteration:{EventType:`AnimationEvent`,defaultInit:{bubbles:!0,cancelable:!1}},transitionCancel:{EventType:`TransitionEvent`,defaultInit:{bubbles:!0,cancelable:!1}},transitionEnd:{EventType:`TransitionEvent`,defaultInit:{bubbles:!0,cancelable:!0}},transitionRun:{EventType:`TransitionEvent`,defaultInit:{bubbles:!0,cancelable:!1}},transitionStart:{EventType:`TransitionEvent`,defaultInit:{bubbles:!0,cancelable:!1}},pointerOver:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},pointerEnter:{EventType:`PointerEvent`,defaultInit:{bubbles:!1,cancelable:!1}},pointerDown:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},pointerMove:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},pointerUp:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},pointerCancel:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},pointerOut:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!0,composed:!0}},pointerLeave:{EventType:`PointerEvent`,defaultInit:{bubbles:!1,cancelable:!1}},gotPointerCapture:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},lostPointerCapture:{EventType:`PointerEvent`,defaultInit:{bubbles:!0,cancelable:!1,composed:!0}},popState:{EventType:`PopStateEvent`,defaultInit:{bubbles:!0,cancelable:!1}},offline:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}},online:{EventType:`Event`,defaultInit:{bubbles:!1,cancelable:!1}}},aE={doubleClick:`dblClick`};function oE(e,t){return Q().eventWrapper(()=>{if(!t)throw Error(`Unable to fire an event - please provide an event object.`);if(!e)throw Error(`Unable to fire a "`+t.type+`" event - please provide a DOM element.`);return e.dispatchEvent(t)})}function sE(e,t,n,r){let{EventType:i=`Event`,defaultInit:a={}}=r===void 0?{}:r;if(!t)throw Error(`Unable to fire a "`+e+`" event - please provide a DOM element.`);let o={...a,...n},{target:{value:s,files:c,...l}={}}=o;s!==void 0&&cE(t,s),c!==void 0&&Object.defineProperty(t,`files`,{configurable:!0,enumerable:!0,writable:!0,value:c}),Object.assign(t,l);let u=bC(t),d=u[i]||u.Event,f;if(typeof d==`function`)f=new d(e,o);else{f=u.document.createEvent(i);let{bubbles:t,cancelable:n,detail:r,...a}=o;f.initEvent(e,t,n,r),Object.keys(a).forEach(e=>{f[e]=a[e]})}let p=[`dataTransfer`,`clipboardData`];return p.forEach(e=>{let t=o[e];typeof t==`object`&&(typeof u.DataTransfer==`function`?Object.defineProperty(f,e,{value:Object.getOwnPropertyNames(t).reduce((e,n)=>(Object.defineProperty(e,n,{value:t[n]}),e),new u.DataTransfer)}):Object.defineProperty(f,e,{value:t}))}),f}Object.keys(iE).forEach(e=>{let{EventType:t,defaultInit:n}=iE[e],r=e.toLowerCase();sE[e]=(e,i)=>sE(r,e,i,{EventType:t,defaultInit:n}),oE[e]=(t,n)=>oE(t,sE[e](t,n))});function cE(e,t){let{set:n}=Object.getOwnPropertyDescriptor(e,`value`)||{},r=Object.getPrototypeOf(e),{set:i}=Object.getOwnPropertyDescriptor(r,`value`)||{};if(i&&n!==i)i.call(e,t);else if(n)n.call(e,t);else throw Error(`The given element does not have a value setter`)}Object.keys(aE).forEach(e=>{let t=aE[e];oE[e]=function(){return oE[t](...arguments)}});function lE(e){return e.replace(/[ \t]*[\n][ \t]*/g,`
|
180
180
|
`)}function uE(e){return qS.default.compressToEncodedURIComponent(lE(e))}function dE(e){return`https://testing-playground.com/#markup=`+uE(e)}const fE=(e,t,n)=>Array.isArray(e)?e.forEach(e=>OC(e,t,n)):OC(e,t,n),pE=function(e){if(e===void 0&&(e=yC().body),!e||!(`innerHTML`in e)){console.log(`The element you're providing isn't a valid DOM element.`);return}if(!e.innerHTML){console.log(`The provided element doesn't have any children.`);return}let t=dE(e.innerHTML);return console.log(`Open this URL in your browser
|
181
181
|
|
182
|
-
`+t),t},mE={debug:fE,logTestingPlaygroundURL:pE},hE=typeof document<`u`&&document.body?rE(document.body,nE,mE):Object.keys(nE).reduce((e,t)=>(e[t]=()=>{throw TypeError(`For queries bound to document.body a global document has to be available... Learn more: https://testing-library.com/s/screen-global-error`)},e),mE),gE=typeof i.act==`function`?i.act:o.act;function _E(){if(typeof globalThis<`u`)return globalThis;if(typeof self<`u`)return self;if(typeof window<`u`)return window;if(typeof global<`u`)return global;throw Error(`unable to locate global object`)}function vE(e){_E().IS_REACT_ACT_ENVIRONMENT=e}function yE(){return _E().IS_REACT_ACT_ENVIRONMENT}function bE(e){return t=>{let n=yE();vE(!0);try{let r=!1,i=e(()=>{let e=t();return typeof e==`object`&&e&&typeof e.then==`function`&&(r=!0),e});if(r){let e=i;return{then:(t,r)=>{e.then(e=>{vE(n),t(e)},e=>{vE(n),r(e)})}}}else return vE(n),i}catch(e){throw vE(n),e}}}const xE=bE(gE),$=function(){return oE(...arguments)};Object.keys(oE).forEach(e=>{$[e]=function(){return oE[e](...arguments)}});const SE=$.mouseEnter,CE=$.mouseLeave;$.mouseEnter=function(){return SE(...arguments),$.mouseOver(...arguments)},$.mouseLeave=function(){return CE(...arguments),$.mouseOut(...arguments)};const wE=$.pointerEnter,TE=$.pointerLeave;$.pointerEnter=function(){return wE(...arguments),$.pointerOver(...arguments)},$.pointerLeave=function(){return TE(...arguments),$.pointerOut(...arguments)};const EE=$.select;$.select=(e,t)=>{EE(e,t),e.focus(),$.keyUp(e,t)};const DE=$.blur,OE=$.focus;$.blur=function(){return $.focusOut(...arguments),DE(...arguments)},$.focus=function(){return $.focusIn(...arguments),OE(...arguments)};let kE={reactStrictMode:!1};function AE(){return{...Q(),...kE}}function jE(){return typeof jest<`u`&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,`clock`):!1}jC({unstable_advanceTimersWrapper:e=>xE(e),asyncWrapper:async e=>{let t=yE();vE(!1);try{let t=await e();return await new Promise(e=>{setTimeout(()=>{e()},0),jE()&&jest.advanceTimersByTime(0)}),t}finally{vE(t)}},eventWrapper:e=>{let t;return xE(()=>{t=e()}),t}});const ME=new Set,NE=[];function PE(e){return AE().reactStrictMode?i.createElement(i.StrictMode,null,e):e}function FE(e,t){return t?i.createElement(t,null,e):e}function IE(e,t){let{hydrate:n,ui:r,wrapper:i}=t,a;return n?xE(()=>{a=c.hydrateRoot(e,PE(FE(r,i)))}):a=c.createRoot(e),{hydrate(){if(!n)throw Error("Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.")},render(e){a.render(e)},unmount(){a.unmount()}}}function LE(e){return{hydrate(t){s.hydrate(t,e)},render(t){s.render(t,e)},unmount(){s.unmountComponentAtNode(e)}}}function RE(e,t){let{baseElement:n,container:r,hydrate:i,queries:a,root:o,wrapper:s}=t;return xE(()=>{i?o.hydrate(PE(FE(e,s)),r):o.render(PE(FE(e,s)),r)}),{container:r,baseElement:n,debug:function(e,t,r){return e===void 0&&(e=n),Array.isArray(e)?e.forEach(e=>console.log(DC(e,t,r))):console.log(DC(e,t,r))},unmount:()=>{xE(()=>{o.unmount()})},rerender:e=>{RE(e,{container:r,baseElement:n,root:o,wrapper:s})},asFragment:()=>{if(typeof document.createRange==`function`)return document.createRange().createContextualFragment(r.innerHTML);{let e=document.createElement(`template`);return e.innerHTML=r.innerHTML,e.content}},...rE(n,a)}}function zE(e,t){let{container:n,baseElement:r=n,legacyRoot:i=!1,queries:a,hydrate:o=!1,wrapper:c}=t===void 0?{}:t;if(i&&typeof s.render!=`function`){let e=Error("`legacyRoot: true` is not supported in this version of React. Please use React 18 instead.");throw Error.captureStackTrace(e,zE),e}r||=document.body,n||=r.appendChild(document.createElement(`div`));let l;if(ME.has(n))NE.forEach(e=>{e.container===n&&(l=e.root)});else{let t=i?LE:IE;l=t(n,{hydrate:o,ui:e,wrapper:c}),NE.push({container:n,root:l}),ME.add(n)}return RE(e,{container:n,baseElement:r,queries:a,hydrate:o,wrapper:c,root:l})}function BE(){NE.forEach(e=>{let{root:t,container:n}=e;xE(()=>{t.unmount()}),n.parentNode===document.body&&document.body.removeChild(n)}),NE.length=0,ME.clear()}function VE(e,t){t===void 0&&(t={});let{initialProps:n,...r}=t;if(r.legacyRoot&&typeof s.render!=`function`){let e=Error("`legacyRoot: true` is not supported in this version of React. Please use React 18 instead.");throw Error.captureStackTrace(e,VE),e}let a=i.createRef();function o(t){let{renderCallbackProps:n}=t,r=e(n);return i.useEffect(()=>{a.current=r}),null}let{rerender:c,unmount:l}=zE(i.createElement(o,{renderCallbackProps:n}),r);function u(e){return c(i.createElement(o,{renderCallbackProps:e}))}return{result:a,rerender:u,unmount:l}}if((typeof process>`u`||!process.env?.RTL_SKIP_AUTO_CLEANUP)&&(typeof afterEach==`function`?afterEach(()=>{BE()}):typeof teardown==`function`&&teardown(()=>{BE()}),typeof beforeAll==`function`&&typeof afterAll==`function`)){let e=yE();beforeAll(()=>{e=yE(),vE(!0)}),afterAll(()=>{vE(e)})}window.IS_REACT_ACT_ENVIRONMENT=!0,ud(`usePageView`,()=>{let e=Hg.fn(),t={pageId:`test-page`,onPageView:e};cf(()=>{Hg.useFakeTimers(),e.mockClear(),Object.defineProperty(document,`hidden`,{configurable:!0,value:!1})}),lf(()=>{Hg.useRealTimers()}),dd(`should initialize with correct default values`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),wh(e.current.timeSpent).toBe(0),wh(e.current.isActive).toBe(!0)}),dd(`should track time spent correctly`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e.current.timeSpent).toBe(5)}),dd(`should not call onPageView before minTimeThreshold`,async()=>{VE(()=>r({...t,minTimeThreshold:10})),await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).not.toHaveBeenCalled()}),dd(`should track user activity correctly`,async()=>{let{result:e}=VE(()=>r({...t,inactivityThreshold:5}));await a(async()=>{await Promise.resolve()}),await a(async()=>{document.dispatchEvent(new MouseEvent(`mousemove`)),Hg.advanceTimersByTime(2e3),await Promise.resolve()}),wh(e.current.isActive).toBe(!0),await a(async()=>{Hg.advanceTimersByTime(6e3),await Promise.resolve()}),wh(e.current.isActive).toBe(!1)}),dd(`should handle page visibility changes`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),await a(async()=>{Object.defineProperty(document,`hidden`,{configurable:!0,value:!0}),document.dispatchEvent(new Event(`visibilitychange`)),await Promise.resolve()}),wh(e.current.isActive).toBe(!1),await a(async()=>{Object.defineProperty(document,`hidden`,{configurable:!0,value:!1}),document.dispatchEvent(new Event(`visibilitychange`)),await Promise.resolve()}),wh(e.current.isActive).toBe(!0)}),dd(`should handle trackOnce option correctly`,async()=>{VE(()=>r({...t,trackOnce:!0,trackOnceDelay:5})),await a(async()=>{await Promise.resolve()}),wh(e).not.toHaveBeenCalled(),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(1),wh(e).toHaveBeenCalledWith({pageId:`test-page`,timeSpent:5,isActive:!0}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(1)}),dd(`should send final data on unmount`,async()=>{let{unmount:n}=VE(()=>r({...t,minTimeThreshold:5}));await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),n(),wh(e).toHaveBeenCalledWith({pageId:`test-page`,timeSpent:10,isActive:!1})})});
|
182
|
+
`+t),t},mE={debug:fE,logTestingPlaygroundURL:pE},hE=typeof document<`u`&&document.body?rE(document.body,nE,mE):Object.keys(nE).reduce((e,t)=>(e[t]=()=>{throw TypeError(`For queries bound to document.body a global document has to be available... Learn more: https://testing-library.com/s/screen-global-error`)},e),mE),gE=typeof i.act==`function`?i.act:o.act;function _E(){if(typeof globalThis<`u`)return globalThis;if(typeof self<`u`)return self;if(typeof window<`u`)return window;if(typeof global<`u`)return global;throw Error(`unable to locate global object`)}function vE(e){_E().IS_REACT_ACT_ENVIRONMENT=e}function yE(){return _E().IS_REACT_ACT_ENVIRONMENT}function bE(e){return t=>{let n=yE();vE(!0);try{let r=!1,i=e(()=>{let e=t();return typeof e==`object`&&e&&typeof e.then==`function`&&(r=!0),e});if(r){let e=i;return{then:(t,r)=>{e.then(e=>{vE(n),t(e)},e=>{vE(n),r(e)})}}}else return vE(n),i}catch(e){throw vE(n),e}}}const xE=bE(gE),$=function(){return oE(...arguments)};Object.keys(oE).forEach(e=>{$[e]=function(){return oE[e](...arguments)}});const SE=$.mouseEnter,CE=$.mouseLeave;$.mouseEnter=function(){return SE(...arguments),$.mouseOver(...arguments)},$.mouseLeave=function(){return CE(...arguments),$.mouseOut(...arguments)};const wE=$.pointerEnter,TE=$.pointerLeave;$.pointerEnter=function(){return wE(...arguments),$.pointerOver(...arguments)},$.pointerLeave=function(){return TE(...arguments),$.pointerOut(...arguments)};const EE=$.select;$.select=(e,t)=>{EE(e,t),e.focus(),$.keyUp(e,t)};const DE=$.blur,OE=$.focus;$.blur=function(){return $.focusOut(...arguments),DE(...arguments)},$.focus=function(){return $.focusIn(...arguments),OE(...arguments)};let kE={reactStrictMode:!1};function AE(){return{...Q(),...kE}}function jE(){return typeof jest<`u`&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,`clock`):!1}jC({unstable_advanceTimersWrapper:e=>xE(e),asyncWrapper:async e=>{let t=yE();vE(!1);try{let t=await e();return await new Promise(e=>{setTimeout(()=>{e()},0),jE()&&jest.advanceTimersByTime(0)}),t}finally{vE(t)}},eventWrapper:e=>{let t;return xE(()=>{t=e()}),t}});const ME=new Set,NE=[];function PE(e){return AE().reactStrictMode?i.createElement(i.StrictMode,null,e):e}function FE(e,t){return t?i.createElement(t,null,e):e}function IE(e,t){let{hydrate:n,ui:r,wrapper:i}=t,a;return n?xE(()=>{a=c.hydrateRoot(e,PE(FE(r,i)))}):a=c.createRoot(e),{hydrate(){if(!n)throw Error("Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.")},render(e){a.render(e)},unmount(){a.unmount()}}}function LE(e){return{hydrate(t){s.hydrate(t,e)},render(t){s.render(t,e)},unmount(){s.unmountComponentAtNode(e)}}}function RE(e,t){let{baseElement:n,container:r,hydrate:i,queries:a,root:o,wrapper:s}=t;return xE(()=>{i?o.hydrate(PE(FE(e,s)),r):o.render(PE(FE(e,s)),r)}),{container:r,baseElement:n,debug:function(e,t,r){return e===void 0&&(e=n),Array.isArray(e)?e.forEach(e=>console.log(DC(e,t,r))):console.log(DC(e,t,r))},unmount:()=>{xE(()=>{o.unmount()})},rerender:e=>{RE(e,{container:r,baseElement:n,root:o,wrapper:s})},asFragment:()=>{if(typeof document.createRange==`function`)return document.createRange().createContextualFragment(r.innerHTML);{let e=document.createElement(`template`);return e.innerHTML=r.innerHTML,e.content}},...rE(n,a)}}function zE(e,t){let{container:n,baseElement:r=n,legacyRoot:i=!1,queries:a,hydrate:o=!1,wrapper:c}=t===void 0?{}:t;if(i&&typeof s.render!=`function`){let e=Error("`legacyRoot: true` is not supported in this version of React. Please use React 18 instead.");throw Error.captureStackTrace(e,zE),e}r||=document.body,n||=r.appendChild(document.createElement(`div`));let l;if(ME.has(n))NE.forEach(e=>{e.container===n&&(l=e.root)});else{let t=i?LE:IE;l=t(n,{hydrate:o,ui:e,wrapper:c}),NE.push({container:n,root:l}),ME.add(n)}return RE(e,{container:n,baseElement:r,queries:a,hydrate:o,wrapper:c,root:l})}function BE(){NE.forEach(e=>{let{root:t,container:n}=e;xE(()=>{t.unmount()}),n.parentNode===document.body&&document.body.removeChild(n)}),NE.length=0,ME.clear()}function VE(e,t){t===void 0&&(t={});let{initialProps:n,...r}=t;if(r.legacyRoot&&typeof s.render!=`function`){let e=Error("`legacyRoot: true` is not supported in this version of React. Please use React 18 instead.");throw Error.captureStackTrace(e,VE),e}let a=i.createRef();function o(t){let{renderCallbackProps:n}=t,r=e(n);return i.useEffect(()=>{a.current=r}),null}let{rerender:c,unmount:l}=zE(i.createElement(o,{renderCallbackProps:n}),r);function u(e){return c(i.createElement(o,{renderCallbackProps:e}))}return{result:a,rerender:u,unmount:l}}if((typeof process>`u`||!process.env?.RTL_SKIP_AUTO_CLEANUP)&&(typeof afterEach==`function`?afterEach(()=>{BE()}):typeof teardown==`function`&&teardown(()=>{BE()}),typeof beforeAll==`function`&&typeof afterAll==`function`)){let e=yE();beforeAll(()=>{e=yE(),vE(!0)}),afterAll(()=>{vE(e)})}window.IS_REACT_ACT_ENVIRONMENT=!0,ud(`usePageView`,()=>{let e=Hg.fn(),t={pageId:`test-page`,onPageView:e};cf(()=>{Hg.useFakeTimers(),e.mockClear(),Object.defineProperty(document,`hidden`,{configurable:!0,value:!1})}),lf(()=>{Hg.useRealTimers()}),dd(`should initialize with correct default values`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),wh(e.current.timeSpent).toBe(0),wh(e.current.isActive).toBe(!0)}),dd(`should track time spent correctly`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e.current.timeSpent).toBe(5)}),dd(`should not call onPageView before minTimeThreshold`,async()=>{VE(()=>r({...t,minTimeThreshold:10})),await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).not.toHaveBeenCalled()}),dd(`should call onPageView after minTimeThreshold`,async()=>{VE(()=>r({...t,minTimeThreshold:10,heartbeatInterval:10})),wh(e).not.toHaveBeenCalled(),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),wh(e).toHaveBeenCalledWith({pageId:`test-page`,timeSpent:10,isActive:!0})}),dd(`should track user activity correctly`,async()=>{let{result:e}=VE(()=>r({...t,inactivityThreshold:5}));await a(async()=>{await Promise.resolve()}),await a(async()=>{document.dispatchEvent(new MouseEvent(`mousemove`)),Hg.advanceTimersByTime(2e3),await Promise.resolve()}),wh(e.current.isActive).toBe(!0),await a(async()=>{Hg.advanceTimersByTime(6e3),await Promise.resolve()}),wh(e.current.isActive).toBe(!1)}),dd(`should handle page visibility changes`,async()=>{let{result:e}=VE(()=>r(t));await a(async()=>{await Promise.resolve()}),await a(async()=>{Object.defineProperty(document,`hidden`,{configurable:!0,value:!0}),document.dispatchEvent(new Event(`visibilitychange`)),await Promise.resolve()}),wh(e.current.isActive).toBe(!1),await a(async()=>{Object.defineProperty(document,`hidden`,{configurable:!0,value:!1}),document.dispatchEvent(new Event(`visibilitychange`)),await Promise.resolve()}),wh(e.current.isActive).toBe(!0)}),dd(`should handle trackOnce option correctly`,async()=>{VE(()=>r({...t,trackOnce:!0,trackOnceDelay:5})),await a(async()=>{await Promise.resolve()}),wh(e).not.toHaveBeenCalled(),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(1),wh(e).toHaveBeenCalledWith({pageId:`test-page`,timeSpent:5,isActive:!0}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(1)}),dd(`should include userId in page view data when provided`,async()=>{VE(()=>r({...t,userId:`test-user`,minTimeThreshold:5,heartbeatInterval:10})),await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),wh(e).toHaveBeenCalledWith({pageId:`test-page`,userId:`test-user`,timeSpent:10,isActive:!0})}),dd(`should handle custom heartbeat interval`,async()=>{VE(()=>r({...t,minTimeThreshold:5,heartbeatInterval:15})),await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(5e3),await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(15e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(1),await a(async()=>{Hg.advanceTimersByTime(15e3),await Promise.resolve()}),wh(e).toHaveBeenCalledTimes(2)}),dd(`should send final data on unmount`,async()=>{let{unmount:n}=VE(()=>r({...t,minTimeThreshold:5}));await a(async()=>{await Promise.resolve()}),await a(async()=>{Hg.advanceTimersByTime(1e4),await Promise.resolve()}),n(),wh(e).toHaveBeenCalledWith({pageId:`test-page`,timeSpent:10,isActive:!1})})});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "use-page-view",
|
3
|
-
"version": "0.0
|
3
|
+
"version": "1.0.0",
|
4
4
|
"description": "React hook for tracking page views",
|
5
5
|
"type": "module",
|
6
6
|
"main": "dist/index.js",
|
@@ -23,15 +23,16 @@
|
|
23
23
|
},
|
24
24
|
"scripts": {
|
25
25
|
"build": "tsdown",
|
26
|
-
"test": "vitest",
|
26
|
+
"test:watch": "vitest",
|
27
|
+
"test": "vitest run",
|
27
28
|
"lint": "tsc",
|
28
29
|
"format": "prettier --write .",
|
29
30
|
"format:check": "prettier . --check",
|
30
31
|
"exports:check": "attw --pack . --ignore-rules=cjs-resolves-to-esm",
|
32
|
+
"release:version": "changeset version",
|
31
33
|
"release:local": "changeset version && changeset publish",
|
32
34
|
"prepublishOnly": "npm run ci",
|
33
|
-
"
|
34
|
-
"ci": "npm run build && npm run format:check && npm run lint"
|
35
|
+
"ci": "npm run build && npm run format:check && npm run lint && npm run test"
|
35
36
|
},
|
36
37
|
"license": "MIT",
|
37
38
|
"dependencies": {
|