jotai-query-toolkit
Version:
A toolkit for opinionated ways to use Jotai, react-query, and next.js
2 lines (1 loc) • 5.12 kB
JavaScript
var B=Object.defineProperty,M=Object.defineProperties;var L=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,T=Object.prototype.propertyIsEnumerable;var q=(e,t,r)=>t in e?B(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,l=(e,t)=>{for(var r in t||(t={}))W.call(t,r)&&q(e,r,t[r]);if(x)for(var r of x(t))T.call(t,r)&&q(e,r,t[r]);return e},c=(e,t)=>M(e,L(t));var h=(e,t)=>{var r={};for(var o in e)W.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&x)for(var o of x(e))t.indexOf(o)<0&&T.call(e,o)&&(r[o]=e[o]);return r};import{createElement as v}from"react";import{Provider as te}from"jotai";var K=()=>new WeakMap;var de=Symbol?Symbol.isConcatSpreadable:void 0;var ge=K();function I(e){return`[jotai-query-toolkit] ${e}`}import{atom as z}from"jotai";import{atomFamily as J}from"jotai/utils";import U from"fast-deep-equal/es6";var k=J(e=>{let t=z(void 0);return t.debugLabel=`initialDataAtom/${e}`,t},U);var $=typeof window=="undefined",j,A=typeof process=="object"&&((j=process==null?void 0:process.env)==null?void 0:j.NODE_ENV)!=="production";import{QueryClient as H}from"react-query";var f=new H({defaultOptions:{queries:{cacheTime:1e3*60*60*12,notifyOnChangeProps:["data","error"]}}});import{atom as X}from"jotai";var R=X(f);import{hashQueryKey as Y}from"react-query";function w(e){return[...(e?Object.keys(e):[]).map(o=>{if(o&&e&&!(o in e))throw Error(`[Jotai Query Toolkit] no initial data found for ${Y(o)}`);let n=e?e[o]:null;return[k(o),n]})]}function S(e,t){return t.map(([r,o])=>{let n=e[r];return o(n)})}import{hashQueryKey as Z}from"react-query";import{useMemo as V}from"react";function ee(e,t){if(!t)return[e,[]];let r=S(e,t);return t.forEach(([o])=>{delete e[o]}),[e,r]}var F=(o,r)=>{var n=o,{initialQueryData:e}=n,t=h(n,["initialQueryData"]);let i=w(e),s=V(()=>Z(e?Object.keys(e):[]),[e]),[p,y]=ee(t,r),g=V(()=>[...y,...i],[i,y]);return l({initialValues:g,key:s},p)};function C(e,t){return o=>{let p=F(o,t),{initialValues:n,key:i}=p,s=h(p,["initialValues","key"]);return v(te,{initialValues:n,key:i},v(e,s))}}import{hashQueryKey as N}from"react-query";import{hashQueryKey as G}from"react-query";function E(e,t){let o=t.getQueryCache().getAll(),n=G(e),i=o.find(s=>s.queryHash===n);if(i)return i==null?void 0:i.state.data}function b(e,t){let r={};if(e.forEach(o=>{let n=E(o,t);n&&(r[G(o)]=n)}),Object.keys(r).length)return r}function re(e,t){return t[G(e)]}async function P(e){try{let{getQueries:t,ctx:r,getQueryProps:o,queryClient:n}=e,i=o?await o(r,n):void 0,s=m=>typeof m=="function"?m(r,i,n):m,p=typeof t=="function"?await t(r,i,n):t;if(!p)return{};let y=(await Promise.all(p.filter(([m])=>!!m).map(async([m,Q])=>[await s(m),Q]))).filter(([m])=>m),g=y.map(([m])=>m);if(g.length===0)return A&&console.error(I("getInitialPropsFromQueries -> no query keys")),{};let d=b(g,n)||{};return Object.keys(d).length===y.length||(await Promise.all(y.filter(([m])=>!!!d[N(m)]).map(async([m,Q])=>{let _=await Q(r,i,n);return[m,_]}))).forEach(([m,Q])=>{d[N(m)]=Q}),d}catch(t){return A&&console.error(I(t==null?void 0:t.message)),{error:!0,message:t.message}}}function D(e,t){return r=>async o=>{async function n(){try{return r?r(o):{}}catch(y){return console.error("[jotai-query-toolkit] getInitialQueryProps: getInitialProps failed. message:"),console.error(y),{}}}let i=[P({getQueries:e,getQueryProps:t,ctx:o,queryClient:f}),n()],[s,p]=await Promise.all(i);return c(l({},p),{initialQueryData:s})}}function oe(e,t,r){function o(n,i){let s=typeof e.getInitialProps!="undefined",p=typeof r!="undefined";if(p&&s)throw new TypeError("[jotai-query-toolkit] withInitialQueries: The wrapped next.js page has getInitialProps defined, and getInitialProps was passed to withInitialQueries. Please only use one of these.");let y=C(e,t);return typeof n!="undefined"?y.getInitialProps=D(n,i)(r||e.getInitialProps):p?y.getInitialProps=r:s&&(y.getInitialProps=e.getInitialProps),y}return o}import{createElement as O}from"react";import{useAtomValue as ne}from"jotai/utils";import{QueryClientProvider as ie}from"react-query";import{ReactQueryDevtools as se}from"react-query/devtools";import{memo as ae}from"react";var ue=ae(()=>{if(process.env.NODE_ENV==="production")return null;let e=ne(R);return e?O(ie,{client:e},O(se)):null});function pe(e,t){return r=>async o=>{let n=async()=>r?r(o):{props:{}},i=[P({getQueries:e,getQueryProps:t,ctx:o,queryClient:f}),n()],[s,p]=await Promise.all(i);return c(l({},p),{props:c(l({},p.props),{initialQueryData:s})})}}function me(e,t){return r=>async o=>{let i=[(async()=>r?r(o):{props:{}})()];typeof e!="undefined"&&i.push(P({getQueries:e,getQueryProps:t,ctx:o,queryClient:f}));let[s,p]=await Promise.all(i);return{props:c(l({},(s==null?void 0:s.props)||{}),{initialQueryData:p})}}}export{$ as IS_SSR,ue as JqtDevtools,S as buildInitialValueAtoms,b as getCachedQueryData,re as getDataFromQueryArray,P as getInitialPropsFromQueries,D as getInitialQueryProps,me as getServerSideQueryProps,E as getSingleCachedQueryData,pe as getStaticQueryProps,w as useQueryInitialValues,oe as withInitialQueries,C as withInitialQueryData};