@lunora/react 1.0.0-alpha.26 → 1.0.0-alpha.261
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 +28 -18
- package/dist/index.d.mts +1036 -583
- package/dist/index.d.ts +1036 -583
- package/dist/index.mjs +1 -25
- package/dist/packem_shared/AuthLoading-BNDsvgQ4.mjs +2 -0
- package/dist/packem_shared/LunoraProvider-B5zAiX86.mjs +1 -0
- package/dist/packem_shared/hydratePreloaded-B6d3r_u1.mjs +2 -0
- package/dist/packem_shared/lunora-provider-CW9Gd-pp.mjs +2 -0
- package/dist/packem_shared/lunoraQueryOptions-IJB_aFzi.mjs +1 -0
- package/dist/packem_shared/query-core-CqnQ_-E5.mjs +2 -0
- package/dist/packem_shared/query-key-BysXrewF.mjs +1 -0
- package/dist/packem_shared/query-options.d-CdgGQ9s4.d.mts +38 -0
- package/dist/packem_shared/query-options.d-CdgGQ9s4.d.ts +38 -0
- package/dist/packem_shared/stream-state-abygFxmy.mjs +1 -0
- package/dist/packem_shared/use-paginated-core-D9QnfDFs.mjs +2 -0
- package/dist/packem_shared/useAction-DnbG-lGf.mjs +2 -0
- package/dist/packem_shared/useAgent-C4XTDKr3.mjs +2 -0
- package/dist/packem_shared/useAgentApprovals-DIrIfUkR.mjs +2 -0
- package/dist/packem_shared/useAgentChat-DgdA3BU5.mjs +2 -0
- package/dist/packem_shared/useAgentState-CZkoGPL4.mjs +2 -0
- package/dist/packem_shared/useAgentToolEvents-BrIFgqyT.mjs +2 -0
- package/dist/packem_shared/useAuth-Do03WzEi.mjs +2 -0
- package/dist/packem_shared/useAuthSessions-BYqSu44Q.mjs +2 -0
- package/dist/packem_shared/useAuthState-CR-hIsvP.mjs +2 -0
- package/dist/packem_shared/useClientQuery-47csppXE.mjs +2 -0
- package/dist/packem_shared/useConnectionStatus-B4A2Vw8x.mjs +2 -0
- package/dist/packem_shared/useFlag-DhCr93VG.mjs +2 -0
- package/dist/packem_shared/useHttpStream-D0biamGu.mjs +2 -0
- package/dist/packem_shared/useInfiniteQuery-C6B9M0s9.mjs +2 -0
- package/dist/packem_shared/useLiveTopic-COTTJo8q.mjs +2 -0
- package/dist/packem_shared/useMutation-DmI3aZBl.mjs +2 -0
- package/dist/packem_shared/useMutator-BtUd-xEA.mjs +2 -0
- package/dist/packem_shared/usePaginatedQuery-CK5xnM3r.mjs +2 -0
- package/dist/packem_shared/usePresence-Bgw_pYzz.mjs +2 -0
- package/dist/packem_shared/useQuery-CHjpBW-E.mjs +2 -0
- package/dist/packem_shared/useRateLimit-Cckxi8m9.mjs +2 -0
- package/dist/packem_shared/useStream-De5SDR6Y.mjs +2 -0
- package/dist/packem_shared/useSubscription-CC39EoMT.mjs +2 -0
- package/dist/packem_shared/useSuspenseQuery-ZsmWeJKm.mjs +2 -0
- package/dist/packem_shared/useVoiceAgent-TyztaWYJ.mjs +2 -0
- package/dist/payment.d.mts +107 -0
- package/dist/payment.d.ts +107 -0
- package/dist/payment.mjs +2 -0
- package/dist/server.d.mts +47 -29
- package/dist/server.d.ts +47 -29
- package/dist/server.mjs +1 -31
- package/dist/upload.d.mts +24 -0
- package/dist/upload.d.ts +24 -0
- package/dist/upload.mjs +2 -0
- package/package.json +14 -4
- package/dist/packem_shared/AuthLoading-DezUWNB2.mjs +0 -33
- package/dist/packem_shared/CheckoutButton-DUite8jJ.mjs +0 -189
- package/dist/packem_shared/LunoraProvider-BsuiW4Lk.mjs +0 -81
- package/dist/packem_shared/cache-D1O_xfAe.mjs +0 -80
- package/dist/packem_shared/hydratePreloaded-uMDH_xA9.mjs +0 -54
- package/dist/packem_shared/lunoraQueryOptions-C3uwOTMW.mjs +0 -16
- package/dist/packem_shared/query-key-BmCbgidV.mjs +0 -13
- package/dist/packem_shared/query-options.d-D4okOpO8.d.mts +0 -38
- package/dist/packem_shared/query-options.d-D4okOpO8.d.ts +0 -38
- package/dist/packem_shared/stable-key-CGp4e2Ux.mjs +0 -38
- package/dist/packem_shared/use-paginated-core-DafedU4l.mjs +0 -179
- package/dist/packem_shared/useAgent-DwLxTc3P.mjs +0 -101
- package/dist/packem_shared/useAgentChat-WPm5iHgR.mjs +0 -283
- package/dist/packem_shared/useAgentState-Cikdlomg.mjs +0 -37
- package/dist/packem_shared/useAgentToolEvents-BM7ERo00.mjs +0 -129
- package/dist/packem_shared/useAuth-BSutjJaa.mjs +0 -129
- package/dist/packem_shared/useAuthState-CyF35qZR.mjs +0 -36
- package/dist/packem_shared/useClientQuery-CN1sC3cP.mjs +0 -56
- package/dist/packem_shared/useConnectionStatus-PJ7vyCHy.mjs +0 -30
- package/dist/packem_shared/useFlag-C2Pkghli.mjs +0 -128
- package/dist/packem_shared/useInfiniteQuery-BeaehE9f.mjs +0 -97
- package/dist/packem_shared/useMutation-BeqeIjTr.mjs +0 -67
- package/dist/packem_shared/useMutator-IIrLtDiM.mjs +0 -47
- package/dist/packem_shared/usePaginatedQuery-_6ETVUmf.mjs +0 -46
- package/dist/packem_shared/usePresence-Rnx1Fznc.mjs +0 -115
- package/dist/packem_shared/useQuery-C-hDzP-t.mjs +0 -77
- package/dist/packem_shared/useRateLimit-DTEffQEi.mjs +0 -64
- package/dist/packem_shared/useStream-CGC26afa.mjs +0 -128
- package/dist/packem_shared/useSubscription-D38Jdyr8.mjs +0 -139
- package/dist/packem_shared/useVoiceAgent-sC5_ADB8.mjs +0 -416
package/dist/index.mjs
CHANGED
|
@@ -1,26 +1,2 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
export { useAuthState } from './packem_shared/useAuthState-CyF35qZR.mjs';
|
|
4
|
-
export { LunoraProvider, useLunora } from './packem_shared/LunoraProvider-BsuiW4Lk.mjs';
|
|
5
|
-
export { CheckoutButton, CustomerPortalButton, useCheckout } from './packem_shared/CheckoutButton-DUite8jJ.mjs';
|
|
6
|
-
export { lunoraQueryOptions } from './packem_shared/lunoraQueryOptions-C3uwOTMW.mjs';
|
|
7
|
-
export { useAgent } from './packem_shared/useAgent-DwLxTc3P.mjs';
|
|
8
|
-
export { useAgentChat } from './packem_shared/useAgentChat-WPm5iHgR.mjs';
|
|
9
|
-
export { useAgentState } from './packem_shared/useAgentState-Cikdlomg.mjs';
|
|
10
|
-
export { useAgentToolEvents } from './packem_shared/useAgentToolEvents-BM7ERo00.mjs';
|
|
11
|
-
export { default as useAuth } from './packem_shared/useAuth-BSutjJaa.mjs';
|
|
12
|
-
export { default as useClientQuery } from './packem_shared/useClientQuery-CN1sC3cP.mjs';
|
|
13
|
-
export { default as useConnectionStatus } from './packem_shared/useConnectionStatus-PJ7vyCHy.mjs';
|
|
14
|
-
export { useFlag, useFlags } from './packem_shared/useFlag-C2Pkghli.mjs';
|
|
15
|
-
export { default as useInfiniteQuery } from './packem_shared/useInfiniteQuery-BeaehE9f.mjs';
|
|
16
|
-
export { useMutation } from './packem_shared/useMutation-BeqeIjTr.mjs';
|
|
17
|
-
export { useMutator } from './packem_shared/useMutator-IIrLtDiM.mjs';
|
|
18
|
-
export { usePaginatedQuery } from './packem_shared/usePaginatedQuery-_6ETVUmf.mjs';
|
|
19
|
-
export { hydratePreloaded, default as usePreloadedQuery } from './packem_shared/hydratePreloaded-uMDH_xA9.mjs';
|
|
20
|
-
export { usePresence } from './packem_shared/usePresence-Rnx1Fznc.mjs';
|
|
21
|
-
export { default as useQuery } from './packem_shared/useQuery-C-hDzP-t.mjs';
|
|
22
|
-
export { useRateLimit } from './packem_shared/useRateLimit-DTEffQEi.mjs';
|
|
23
|
-
export { useStream } from './packem_shared/useStream-CGC26afa.mjs';
|
|
24
|
-
export { default as useSubscription } from './packem_shared/useSubscription-D38Jdyr8.mjs';
|
|
25
|
-
export { useVoiceAgent } from './packem_shared/useVoiceAgent-sC5_ADB8.mjs';
|
|
26
|
-
export { createClientQuery, getErrorCode, getRetryAfterMs, isConflictError, isForbiddenError, isRateLimitedError, isUnauthorizedError } from '@lunora/client';
|
|
2
|
+
import{AuthLoading as o,Authenticated as t,Unauthenticated as u}from"./packem_shared/AuthLoading-BNDsvgQ4.mjs";import{useAuthState as a}from"./packem_shared/useAuthState-CR-hIsvP.mjs";import{L as f,u as n}from"./packem_shared/lunora-provider-CW9Gd-pp.mjs";import{lunoraQueryOptions as m}from"./packem_shared/lunoraQueryOptions-IJB_aFzi.mjs";import{useAction as d}from"./packem_shared/useAction-DnbG-lGf.mjs";import{useAuthSessions as A,useAuthUsers as g,useImpersonate as c,useOrganizations as h,useSignUpInvitations as U}from"./packem_shared/useAuthSessions-BYqSu44Q.mjs";import{useAgent as S}from"./packem_shared/useAgent-C4XTDKr3.mjs";import{useAgentApprovals as E}from"./packem_shared/useAgentApprovals-DIrIfUkR.mjs";import{useAgentChat as L}from"./packem_shared/useAgentChat-DgdA3BU5.mjs";import{useAgentState as v}from"./packem_shared/useAgentState-CZkoGPL4.mjs";import{useAgentToolEvents as F}from"./packem_shared/useAgentToolEvents-BrIFgqyT.mjs";import{default as M}from"./packem_shared/useAuth-Do03WzEi.mjs";import{default as b}from"./packem_shared/useClientQuery-47csppXE.mjs";import{default as O}from"./packem_shared/useConnectionStatus-B4A2Vw8x.mjs";import{useFlag as H,useFlags as V}from"./packem_shared/useFlag-DhCr93VG.mjs";import{useHttpStream as q}from"./packem_shared/useHttpStream-D0biamGu.mjs";import{default as B}from"./packem_shared/useInfiniteQuery-C6B9M0s9.mjs";import{useLiveTopic as G}from"./packem_shared/useLiveTopic-COTTJo8q.mjs";import{useMutation as K}from"./packem_shared/useMutation-DmI3aZBl.mjs";import{useMutator as W}from"./packem_shared/useMutator-BtUd-xEA.mjs";import{usePaginatedQuery as Y}from"./packem_shared/usePaginatedQuery-CK5xnM3r.mjs";import{hydratePreloaded as _,default as $}from"./packem_shared/hydratePreloaded-B6d3r_u1.mjs";import{usePresence as re}from"./packem_shared/usePresence-Bgw_pYzz.mjs";import{default as te}from"./packem_shared/useQuery-CHjpBW-E.mjs";import{useRateLimit as se}from"./packem_shared/useRateLimit-Cckxi8m9.mjs";import{useStream as pe}from"./packem_shared/useStream-De5SDR6Y.mjs";import{default as ne}from"./packem_shared/useSubscription-CC39EoMT.mjs";import{default as me}from"./packem_shared/useSuspenseQuery-ZsmWeJKm.mjs";import{useVoiceAgent as de}from"./packem_shared/useVoiceAgent-TyztaWYJ.mjs";import{createClientQuery as Ae,getErrorCode as ge,getRetryAfterMs as ce,isConflictError as he,isForbiddenError as Ue,isRateLimitedError as ye,isUnauthorizedError as Se}from"@lunora/client";import{RestrictionError as Ee,UploadControl as Qe,UploadError as Le}from"@visulima/storage-client";import{useChunkedRestUpload as ve,useFileInput as Re,useMultipartUpload as Fe,usePasteUpload as Ie,useTusUpload as Me,useUpload as Te}from"@visulima/storage-client/react";export{o as AuthLoading,t as Authenticated,f as LunoraProvider,Ee as RestrictionError,u as Unauthenticated,Qe as UploadControl,Le as UploadError,Ae as createClientQuery,ge as getErrorCode,ce as getRetryAfterMs,_ as hydratePreloaded,he as isConflictError,Ue as isForbiddenError,ye as isRateLimitedError,Se as isUnauthorizedError,m as lunoraQueryOptions,d as useAction,S as useAgent,E as useAgentApprovals,L as useAgentChat,v as useAgentState,F as useAgentToolEvents,M as useAuth,A as useAuthSessions,a as useAuthState,g as useAuthUsers,ve as useChunkedRestUpload,b as useClientQuery,O as useConnectionStatus,Re as useFileInput,H as useFlag,V as useFlags,q as useHttpStream,c as useImpersonate,B as useInfiniteQuery,G as useLiveTopic,n as useLunora,Fe as useMultipartUpload,K as useMutation,W as useMutator,h as useOrganizations,Y as usePaginatedQuery,Ie as usePasteUpload,$ as usePreloadedQuery,re as usePresence,te as useQuery,se as useRateLimit,U as useSignUpInvitations,pe as useStream,ne as useSubscription,me as useSuspenseQuery,Me as useTusUpload,Te as useUpload,de as useVoiceAgent};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useAuthState as o}from"./useAuthState-CR-hIsvP.mjs";const s=t=>{const{children:n}=t,{isAuthenticated:i}=o();return i?n:void 0},d=t=>{const{children:n}=t,{isAuthenticated:i,isLoading:e}=o();return!e&&!i?n:void 0},r=t=>{const{children:n}=t,{isLoading:i}=o();return i?n:void 0};export{r as AuthLoading,s as Authenticated,d as Unauthenticated};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{L as e,u as o,a as u}from"./lunora-provider-CW9Gd-pp.mjs";export{e as LunoraProvider,o as useLunora,u as useLunoraClientSwapped};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as K}from"react/compiler-runtime";import{useQueryClient as P,useQuery as N}from"@tanstack/react-query";import{useRef as T,useEffect as I,useSyncExternalStore as w,useState as x}from"react";import{u as F,g as L,a as O}from"./lunora-provider-CW9Gd-pp.mjs";import{l as V,s as z}from"./query-key-BysXrewF.mjs";const D=function(o,r){const e=K(11);let s;e[0]!==r?(s=r===void 0?{}:r,e[0]=r,e[1]=s):s=e[1];const i=s,t=F(),n=P(),S=T(i.onError);let c;e[2]!==i.onError?(c=()=>{S.current=i.onError},e[2]=i.onError,e[3]=c):c=e[3],I(c);let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u=h=>{S.current?.(h)},e[4]=u):u=e[4];const b=u,m=L(t);let a;e[5]!==t?(a=()=>t.identityEpoch(),e[5]=t,e[6]=a):a=e[6];const _=w(m.subscribeIdentityEpoch,a,Y),[Q]=x(t),R=O(),{args:p,functionPath:q,shardKey:l}=o,g=_===0&&!R&&t===Q?o.value:void 0,d={__lunoraRef:q},f=V(d,p,l),{data:v}=N({initialData:g,queryFn:async h=>{const{signal:C}=h;return m.liveValue(n,f,C,{fetch:async()=>t.query(d,p,{shardKey:l}),shardKey:l})},queryKey:f,staleTime:Number.POSITIVE_INFINITY}),E=z(f);let y;return e[7]!==t||e[8]!==n||e[9]!==E?(y=[t,n,E,b],e[7]=t,e[8]=n,e[9]=E,e[10]=y):y=e[10],I(()=>m.attach(n,f,d,p,l,{onError:b}),y),v===void 0?g:v},G=function(o,r={}){return D(o,r)};function Y(){return 0}export{D as default,G as hydratePreloaded};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as W}from"react/compiler-runtime";import{LunoraError as D}from"@lunora/errors";import{QueryClientContext as M,QueryClientProvider as A,QueryClient as N}from"@tanstack/react-query";import{use as Q,useState as S,useEffect as T,useRef as R,createContext as x}from"react";import{k as b}from"./query-key-BysXrewF.mjs";import{jsx as m}from"react/jsx-runtime";const E=n=>{n!==void 0&&(n.cancel({silent:!0}),n.setState({...n.state,data:void 0,dataUpdatedAt:0,error:null,fetchStatus:"idle",status:"pending"}))},I={status:"idle"},F=(n,e)=>{for(const s of n.waiters)s(e);n.waiters.clear()},_=1e4,z=async(n,e,s)=>new Promise((i,d)=>{if(e.aborted){d(e.reason);return}let u,h;const l=()=>{clearTimeout(u),h?.(),n.waiters.delete(r),e.removeEventListener("abort",t)},t=()=>{l(),d(e.reason)},r=c=>{l(),i(c)};u=setTimeout(()=>{r(!1)},_),n.waiters.add(r),e.addEventListener("abort",t,{once:!0}),h=s(()=>{r(!1)}),n.waiters.has(r)||h()});class U{constructor(e){this.client=e}client;entries=new Map;live=new Map;identityWatched=new Set;listening=!1;hasConsumers(e){return this.entries.has(b(e))}async liveValue(e,s,i,d){const{fetch:u,shardKey:h,waitForPush:l=!0}=d;if(!("window"in globalThis)||this.client.getWebSocketImpl()===void 0)return u();const t=b(s),r=this.liveFor(t),c=r.state.status==="pushed"?e.getQueryData(s)??r.state.value:void 0;if(c!==void 0)return c;if(l&&r.state.status!=="errored"&&!this.client.isCrossTabFollower()&&this.client.expectsPush({shardKey:h})){let o;try{o=await z(r,i,f=>this.client.onConnectionStatus(()=>{this.client.expectsPush({shardKey:h})||f()}))}finally{this.forgetIdleLive(t)}if(o)return this.liveValue(e,s,i,d)}const p=r.state;let a;try{a=await u()}finally{this.forgetIdleLive(t)}if(r.state!==p&&r.state.status==="pushed"){const o=e.getQueryData(s);return o!==void 0?o:r.state.value}return a}clearOnIdentityChange(e){this.listenForIdentityChange(),this.identityWatched.add(e)}stopClearingOnIdentityChange(e){this.identityWatched.delete(e)}subscribeIdentityEpoch=e=>(this.listenForIdentityChange(),this.client.onIdentityChange(e));listenForIdentityChange(){this.listening||(this.listening=!0,this.client.onIdentityChange(()=>{for(const e of this.identityWatched)this.clearQueries(e)}))}clearQueries(e){const s=e.getQueryCache();for(const i of s.findAll({queryKey:["lunora"]}))E(i),i.getObserversCount()===0&&!this.hasConsumers(i.queryKey)&&s.remove(i)}attach(e,s,i,d,u,h={}){const l=b(s);let t=this.entries.get(l);if(!t){t={clients:new Map([[e,0]]),errorCallbacks:new Set,unsubscribe:void 0},this.entries.set(l,t);const a=t;try{t.unsubscribe=this.client.subscribe(i,d,o=>{const f=this.liveFor(l);if(o===void 0){f.state=I;for(const v of a.clients.keys())E(v.getQueryCache().find({exact:!0,queryKey:s}));return}for(const v of a.clients.keys())v.setQueryData(s,o);f.state={status:"pushed",value:o},F(f,!0)},{onError:o=>{const f=this.liveFor(l);f.state.status!=="pushed"&&(f.state={status:"errored"},F(f,!1));for(const v of a.errorCallbacks)v(o)},shardKey:u})}catch(o){throw this.entries.delete(l),this.dropLive(l),o}}t.clients.set(e,(t.clients.get(e)??0)+1);const r=this.live.get(l);r?.state.status==="pushed"&&e.setQueryData(s,r.state.value);const{onError:c}=h;c&&t.errorCallbacks.add(c);let p=!1;return()=>{if(p)return;p=!0;const a=this.entries.get(l);if(!a)return;const o=(a.clients.get(e)??1)-1;o>0?a.clients.set(e,o):a.clients.delete(e),c&&a.errorCallbacks.delete(c),a.clients.size===0&&(a.unsubscribe?.(),this.entries.delete(l),this.dropLive(l))}}liveFor(e){let s=this.live.get(e);return s||(s={state:I,waiters:new Set},this.live.set(e,s)),s}forgetIdleLive(e){!this.entries.has(e)&&this.live.get(e)?.waiters.size===0&&this.live.delete(e)}dropLive(e){const s=this.live.get(e);s!==void 0&&(s.waiters.size===0?this.live.delete(e):s.state=I)}}const k=new WeakMap,L=n=>{let e=k.get(n);return e||(e=new U(n),k.set(n,e)),e},P=x(null),O=x(!1),V=()=>new N({defaultOptions:{mutations:{retry:0},queries:{gcTime:5*6e4,retry:0,staleTime:Number.POSITIVE_INFINITY}}}),J=n=>{const e=W(20),{children:s,client:i,queryClient:d}=n,u=Q(M);let h;e[0]!==u||e[1]!==d?(h=()=>d??u??V(),e[0]=u,e[1]=d,e[2]=h):h=e[2];const[l]=S(h),t=d??u??l;let r,c;e[3]!==i||e[4]!==t?(r=()=>{L(i).clearOnIdentityChange(t)},c=[i,t],e[3]=i,e[4]=t,e[5]=r,e[6]=c):(r=e[5],c=e[6]),T(r,c);const p=R(i);let a,o;e[7]!==i||e[8]!==t?(a=()=>{p.current!==i&&(L(p.current).stopClearingOnIdentityChange(t),p.current=i,L(i).clearQueries(t),t.invalidateQueries({queryKey:["lunora"]}))},o=[i,t],e[7]=i,e[8]=t,e[9]=a,e[10]=o):(a=e[9],o=e[10]),T(a,o);const[f]=S(i),v=i!==f;let g;e[11]!==s||e[12]!==v?(g=m(O,{value:v,children:s}),e[11]=s,e[12]=v,e[13]=g):g=e[13];let w;e[14]!==i||e[15]!==g?(w=m(P,{value:i,children:g}),e[14]=i,e[15]=g,e[16]=w):w=e[16];const C=w;if(u===t)return C;let y;return e[17]!==C||e[18]!==t?(y=m(A,{client:t,children:C}),e[17]=C,e[18]=t,e[19]=y):y=e[19],y},X=()=>Q(O),Z=()=>{const n=Q(P);if(!n)throw new D("INTERNAL","useLunora must be used inside <LunoraProvider />");return n};export{J as L,X as a,L as g,Z as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as u}from"./query-key-BysXrewF.mjs";const t=(a,r,s,e={})=>{const y=s??{};return{queryFn:()=>a.query(r,y,{shardKey:e.shardKey}),queryKey:u(r,y,e.shardKey),staleTime:Number.POSITIVE_INFINITY}};export{t as lunoraQueryOptions};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as R}from"react/compiler-runtime";import{useRef as $,useEffect as b}from"react";import{g as h}from"./lunora-provider-CW9Gd-pp.mjs";const x=g=>{const e=R(16),{args:a,argsKey:E,client:r,function_:n,onError:s,queryClient:t,queryKey:m,shardKey:i,skipped:o}=g,p=`${n.__lunoraRef}\0${E}\0${i??""}`,y=$(s);let c;e[0]!==s?(c=()=>{y.current=s},e[0]=s,e[1]=c):c=e[1],b(c);let u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=K=>{y.current?.(K)},e[2]=u):u=e[2];const _=u;let f;e[3]!==a||e[4]!==r||e[5]!==n||e[6]!==t||e[7]!==m||e[8]!==i||e[9]!==o?(f=()=>o?S:h(r).attach(t,m,n,a,i,{onError:_}),e[3]=a,e[4]=r,e[5]=n,e[6]=t,e[7]=m,e[8]=i,e[9]=o,e[10]=f):f=e[10];let l;e[11]!==r||e[12]!==t||e[13]!==o||e[14]!==p?(l=[r,t,p,o,_],e[11]=r,e[12]=t,e[13]=o,e[14]=p,e[15]=l):l=e[15],b(f,l)};function S(){}export{x as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{stableWireKey as a}from"@lunora/wire";const o=e=>a(e),l=(e,r,s)=>["lunora",e,r,s??null],y=(e,r,s)=>l(e.__lunoraRef,a(r),s),u=e=>o(e);export{l as a,o as k,y as l,u as s};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FunctionReference, ReturnOf, LunoraClient, ArgsOf } from '@lunora/client';
|
|
2
|
+
import { QueryKey } from '@tanstack/react-query';
|
|
3
|
+
/**
|
|
4
|
+
* Pure, transport-free adapter between a Lunora function reference and a
|
|
5
|
+
* TanStack Query options object. No `"use client"` directive and only a
|
|
6
|
+
* type-level `@lunora/client` import, so it is safe to use on either side of an
|
|
7
|
+
* RSC boundary (the runtime transport is the `LunoraClient` you pass in).
|
|
8
|
+
*
|
|
9
|
+
* Use it when you want to drive a Lunora query through TanStack's own hooks —
|
|
10
|
+
* `useSuspenseQuery`, `useQueries`, or the server-side
|
|
11
|
+
* `queryClient.ensureQueryData` / `prefetchQuery` — rather than the first-class
|
|
12
|
+
* `useQuery` from `@lunora/react`.
|
|
13
|
+
*/
|
|
14
|
+
/** Shape returned by `lunoraQueryOptions`, spread into a TanStack hook. */
|
|
15
|
+
interface LunoraQueryOptions<F extends FunctionReference> {
|
|
16
|
+
queryFn: () => Promise<ReturnOf<F>>;
|
|
17
|
+
queryKey: QueryKey;
|
|
18
|
+
staleTime: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a TanStack Query options object for a Lunora query, keyed identically
|
|
22
|
+
* to the first-class hooks (see `lunoraQueryKey`) so a value fetched through
|
|
23
|
+
* this adapter shares cache identity with anything `useQuery` /
|
|
24
|
+
* `prefetchQuery` reads or writes for the same `(fn, args, shardKey)` triple.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const { data } = useSuspenseQuery(lunoraQueryOptions(client, api.posts.list, {}));
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* This is a one-shot fetch: it resolves once and `staleTime` is infinite, so
|
|
31
|
+
* TanStack never refetches on its own. It does not open a WebSocket — for live
|
|
32
|
+
* updates that re-render on every server push, use `useQuery` from
|
|
33
|
+
* `@lunora/react`, which attaches a shared subscription to the same cache key.
|
|
34
|
+
*/
|
|
35
|
+
declare const lunoraQueryOptions: <F extends FunctionReference>(client: LunoraClient, function_: F, args: ArgsOf<F>, options?: {
|
|
36
|
+
shardKey?: string;
|
|
37
|
+
}) => LunoraQueryOptions<F>;
|
|
38
|
+
export { LunoraQueryOptions as L, lunoraQueryOptions as l };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FunctionReference, ReturnOf, LunoraClient, ArgsOf } from '@lunora/client';
|
|
2
|
+
import { QueryKey } from '@tanstack/react-query';
|
|
3
|
+
/**
|
|
4
|
+
* Pure, transport-free adapter between a Lunora function reference and a
|
|
5
|
+
* TanStack Query options object. No `"use client"` directive and only a
|
|
6
|
+
* type-level `@lunora/client` import, so it is safe to use on either side of an
|
|
7
|
+
* RSC boundary (the runtime transport is the `LunoraClient` you pass in).
|
|
8
|
+
*
|
|
9
|
+
* Use it when you want to drive a Lunora query through TanStack's own hooks —
|
|
10
|
+
* `useSuspenseQuery`, `useQueries`, or the server-side
|
|
11
|
+
* `queryClient.ensureQueryData` / `prefetchQuery` — rather than the first-class
|
|
12
|
+
* `useQuery` from `@lunora/react`.
|
|
13
|
+
*/
|
|
14
|
+
/** Shape returned by `lunoraQueryOptions`, spread into a TanStack hook. */
|
|
15
|
+
interface LunoraQueryOptions<F extends FunctionReference> {
|
|
16
|
+
queryFn: () => Promise<ReturnOf<F>>;
|
|
17
|
+
queryKey: QueryKey;
|
|
18
|
+
staleTime: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a TanStack Query options object for a Lunora query, keyed identically
|
|
22
|
+
* to the first-class hooks (see `lunoraQueryKey`) so a value fetched through
|
|
23
|
+
* this adapter shares cache identity with anything `useQuery` /
|
|
24
|
+
* `prefetchQuery` reads or writes for the same `(fn, args, shardKey)` triple.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const { data } = useSuspenseQuery(lunoraQueryOptions(client, api.posts.list, {}));
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* This is a one-shot fetch: it resolves once and `staleTime` is infinite, so
|
|
31
|
+
* TanStack never refetches on its own. It does not open a WebSocket — for live
|
|
32
|
+
* updates that re-render on every server push, use `useQuery` from
|
|
33
|
+
* `@lunora/react`, which attaches a shared subscription to the same cache key.
|
|
34
|
+
*/
|
|
35
|
+
declare const lunoraQueryOptions: <F extends FunctionReference>(client: LunoraClient, function_: F, args: ArgsOf<F>, options?: {
|
|
36
|
+
shardKey?: string;
|
|
37
|
+
}) => LunoraQueryOptions<F>;
|
|
38
|
+
export { LunoraQueryOptions as L, lunoraQueryOptions as l };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const u=function(r,e){switch(e.type){case"chunk":return{chunks:[...r.chunks,e.chunk],error:void 0,status:"streaming"};case"complete":return{...r,status:"complete"};case"error":return{...r,error:e.error,status:"error"};case"reset":return{chunks:[],error:void 0,status:"idle"};case"start":return{...r,status:"streaming"};default:return r}},o=function(r,e){let n=!0,c=!1;const s=()=>{c||(c=!0,r.cancel())};return(async()=>{try{for await(const t of r){if(!n)return;e({chunk:t,type:"chunk"})}n&&e({type:"complete"})}catch(t){if(!n)return;e({error:t instanceof Error?t:new Error(String(t)),type:"error"})}})().catch(()=>{}),{cancel:s,cleanup:()=>{n=!1,s()}}};export{o as c,u as s};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{initialPages as T,rebalance as Y,derivePaginationStatus as D,applyLoadMore as _}from"@lunora/client/pagination";import{useQueryClient as B,CancelledError as G}from"@tanstack/react-query";import{useRef as m,useReducer as J,useState as z,useEffect as h,useCallback as U}from"react";import{u as W,g as X}from"./lunora-provider-CW9Gd-pp.mjs";import{s as u,l as I}from"./query-key-BysXrewF.mjs";const Z=function(i){const l=m(void 0);return l.current??=i(),l},oe=function(i,l,R){const y=W(),a=B(),{initialNumItems:S,shardKey:g}=R,f=l==="skip",p=f?{}:l,[,H]=J(e=>e+1,0),[P,K]=z(()=>T(S)),[V,k]=z(void 0),A=m(R.onError);h(()=>{A.current=R.onError});const E=`${u(I(i,p,g))}::${String(S)}`,x=m(E);x.current!==E&&(x.current=E,K(T(S)),k(void 0));const C=P.map(e=>{const t={...p,paginationOpts:{cursor:e.lower,endCursor:e.upper,numItems:e.numItems}},r=I(i,t,g);return{args:t,key:r}}),F=C.map(({key:e})=>u(e)).join("|"),b=m({baseArgs:p,entries:[],fn:i,shardKey:g});h(()=>{b.current={baseArgs:p,entries:C,fn:i,shardKey:g}});const L=(e,t,r)=>{k(r),K(n=>{const s=b.current,o=n.at(-1);if(n.length<=1||!o||a.getQueryData(t)!==void 0)return n;const v={...s.baseArgs,paginationOpts:{cursor:o.lower,endCursor:o.upper,numItems:o.numItems}};return u(I(s.fn,v,s.shardKey))===e?n.slice(0,-1):n}),A.current?.(r)},Q=Z(()=>new Map),M=m(y);h(()=>{const e=Q.current;if(M.current!==y){for(const s of e.values())s();e.clear(),M.current=y}if(f){for(const s of e.values())s();e.clear();return}const t=b.current,r=X(y),n=new Set(t.entries.map(({key:s})=>u(s)));for(const[s,o]of e)n.has(s)||(o(),e.delete(s));for(const s of t.entries){const o=u(s.key);if(e.has(o))continue;const v=async()=>y.query(t.fn,s.args,{shardKey:t.shardKey}),d=()=>{a.fetchQuery({gcTime:Number.POSITIVE_INFINITY,queryFn:async({signal:c})=>r.liveValue(a,s.key,c,{fetch:v,shardKey:t.shardKey}),queryKey:s.key,staleTime:0}).catch(c=>{if(c instanceof G){r.hasConsumers(s.key)&&d();return}L(o,s.key,c instanceof Error?{code:c.code,message:c.message}:{message:String(c)})})};d();const w=r.attach(a,s.key,t.fn,s.args,t.shardKey,{onError:O=>{L(o,s.key,O)}}),N=s.key;e.set(o,()=>{w(),r.hasConsumers(N)||a.removeQueries({exact:!0,queryKey:N})})}},[y,a,F,f]),h(()=>()=>{for(const e of Q.current.values())e();Q.current.clear()},[]),h(()=>{const e=a.getQueryCache(),t=new Set(C.map(({key:n})=>u(n)));return e.subscribe(n=>{if(n.type!=="updated")return;const s=u(n.query.queryKey);t.has(s)&&(k(void 0),H())})},[a,F]);const q=f?[]:C.map(({key:e})=>a.getQueryData(e));h(()=>{if(f)return;const e=Y(P,q);e&&K(e)});const{status:$}=D(f,q),j=U(e=>{k(void 0),K(t=>{const r=b.current,n=t.map(d=>{const w={...r.baseArgs,paginationOpts:{cursor:d.lower,endCursor:d.upper,numItems:d.numItems}};return a.getQueryData(I(r.fn,w,r.shardKey))}),{nextCursor:s,status:o}=D(!1,n);return _(t,o==="CanLoadMore"?s:void 0,e)??t})},[a]);return{error:V,loadMore:j,pageResults:q,status:$}};export{oe as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as R}from"react/compiler-runtime";import{createCallRunner as k}from"@lunora/client";import{useMutation as x}from"@tanstack/react-query";import{useState as n}from"react";import{u as C}from"./lunora-provider-CW9Gd-pp.mjs";const S=a=>{const t=R(12),i=C(),[c,g]=n(void 0),[l,m]=n(void 0),[u,M]=n(!1);let o;t[0]!==i||t[1]!==a?(o={mutationFn:async e=>{const{args:y,options:A}=e;return i.action(a,y,A)},networkMode:"always",retry:0},t[0]=i,t[1]=a,t[2]=o):o=t[2];const{mutateAsync:d,reset:p}=x(o);let s;t[3]!==d||t[4]!==p?(s=()=>({call:k(async(e,y)=>d({args:e,options:y}),{setError:m,setPending:M,setResult:e=>{g(()=>e),m(void 0)}}),reset:()=>{g(void 0),m(void 0),p()}}),t[3]=d,t[4]=p,t[5]=s):s=t[5];const[w]=n(s),{call:f,reset:v}=w;let r;return t[6]!==f||t[7]!==c||t[8]!==l||t[9]!==u||t[10]!==v?(r={call:f,data:c,error:l,pending:u,reset:v},t[6]=f,t[7]=c,t[8]=l,t[9]=u,t[10]=v,t[11]=r):r=t[11],r};export{S as useAction};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as N}from"react/compiler-runtime";import{useMutation as R}from"./useMutation-DmI3aZBl.mjs";import O from"./useSubscription-CC39EoMT.mjs";const b={__lunoraRef:""},F=_=>{const t=N(20),{api:A,cancel:a,onError:d,run:I,runArgs:f,threadKey:e}=_,s=R(I),T=R(a??b);let c;t[0]!==e?(c={key:e},t[0]=e,t[1]=c):c=t[1];let r;t[2]!==d?(r={onError:d},t[2]=d,t[3]=r):r=t[3];const{data:v,error:p}=O(A.agents.agentThread,c,r),n=v,g=n?.status,o=n?.instanceId,{mutate:m}=s,{mutate:M}=T;let i;t[4]!==f||t[5]!==m||t[6]!==e?(i=async(w,E)=>{await m({input:w,threadKey:e,...f,...E})},t[4]=f,t[5]=m,t[6]=e,t[7]=i):i=t[7];const h=i;let u;t[8]!==M||t[9]!==a||t[10]!==o||t[11]!==e?(u=async()=>{a===void 0||o===void 0||await M({instanceId:o,threadKey:e})},t[8]=M,t[9]=a,t[10]=o,t[11]=e,t[12]=u):u=t[12];const y=u;let l;return t[13]!==y||t[14]!==p||t[15]!==h||t[16]!==s.pending||t[17]!==g||t[18]!==n?(l={cancel:y,error:p,pending:s.pending,run:h,status:g,thread:n},t[13]=y,t[14]=p,t[15]=h,t[16]=s.pending,t[17]=g,t[18]=n,t[19]=l):l=t[19],l};export{F as useAgent};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as p}from"react/compiler-runtime";import c from"./useSubscription-CC39EoMT.mjs";const m=n=>{const e=p(4);let t;e[0]===Symbol.for("react.memo_cache_sentinel")?(t={},e[0]=t):t=e[0];const{data:a,error:r}=c(n.api.agents.agentPendingApprovals,t),s=a;let o;return e[1]!==r||e[2]!==s?(o={approvals:s,error:r},e[1]=r,e[2]=s,e[3]=o):o=e[3],o};export{m as useAgentApprovals};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{reconcileOptimistic as M,maxSeq as R}from"@lunora/client";import{useState as nt,useRef as k}from"react";import{u as rt}from"./lunora-provider-CW9Gd-pp.mjs";import{useMutation as s}from"./useMutation-DmI3aZBl.mjs";import{useStream as at}from"./useStream-De5SDR6Y.mjs";import d from"./useSubscription-CC39EoMT.mjs";const ot={__lunoraRef:""},st={__lunoraRef:""},ct=[],it=[],kt=A=>{const{api:r,cancel:m,limit:g,onError:i,send:E,sendArgs:_,stream:v,threadKey:e}=A,T=g===void 0?{key:e}:{key:e,limit:g},{data:w,error:x}=d(r.agents.agentMessages,T,{onError:i}),{data:G,error:I}=d(r.agents.agentThread,{key:e},{onError:i}),{data:O,error:b}=d(r.agents.agentApprovalGrants,{key:e},{onError:i}),C=v===void 0?"skip":{key:e},{chunks:D}=at(v??st,C),j=s(E),q=s(m??ot),F=s(r.agents.agentResolveApproval),N=s(r.agents.agentRevokeApprovalGrant),K=s(r.agents.agentDeclineSecret),P=rt(),[Y,u]=nt([]),h=k(0),f=k(e);f.current!==e&&(f.current=e,u([]));const y=G,L=y?.status,c=y?.instanceId,a=w??ct,S=M(Y,a),U=R(a),$=S.length===0?a:[...a,...S.map((t,n)=>({content:t.content,optimistic:!0,role:"user",seq:U+1+n}))],z=a.filter(t=>t.role==="assistant").length,B=D.filter(t=>t.kind!=="progress"&&t.threadKey===e&&t.turn>=z).map(t=>t.text).join(""),{mutate:H}=j,{mutate:J}=q,{mutate:Q}=F,{mutate:V}=N,{mutate:W}=K,X=async(t,n)=>{const o=h.current;h.current+=1;const Z=R(a);u(p=>[...M(p,a),{content:t,id:o,maxDurableSeqAtSend:Z}]);try{await H({input:t,threadKey:e,..._,...n})}catch(p){throw u(tt=>tt.filter(et=>et.id!==o)),p}},l=async(t,n,o)=>{if(c===void 0)throw new Error(`useAgentChat: cannot ${t} — no in-flight run (thread has no instanceId)`);await Q({decision:t,instanceId:c,threadKey:e,toolCallId:n,...o===void 0?{}:{note:o}})};return{approvalGrants:O??it,approve:(t,n)=>l("approve",t,n),approveForThread:(t,n)=>l("approve_for_thread",t,n),cancel:async()=>{m===void 0||c===void 0||await J({instanceId:c,threadKey:e})},declineSecret:async t=>{await W({threadKey:e,toolCallId:t})},error:x??I??b,messages:$,reject:(t,n)=>l("reject",t,n),revokeGrant:async t=>{await V({threadKey:e,toolName:t})},send:X,status:L,streamingText:B,supplySecret:async(t,n)=>{await P.mutation(r.agents.agentSupplySecret,{secret:n,threadKey:e,toolCallId:t},{onlineOnly:!0})}}};export{kt as useAgentChat};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as o}from"react/compiler-runtime";import d from"./useSubscription-CC39EoMT.mjs";const l=t=>{const e=o(5);let r;e[0]!==t.threadKey?(r={key:t.threadKey},e[0]=t.threadKey,e[1]=r):r=e[1];const{data:n,error:s}=d(t.api.agents.agentState,r),c=n;let a;return e[2]!==s||e[3]!==c?(a={error:s,state:c},e[2]=s,e[3]=c,e[4]=a):a=e[4],a};export{l as useAgentState};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as C}from"react/compiler-runtime";import{useStream as y}from"./useStream-De5SDR6Y.mjs";import _ from"./useSubscription-CC39EoMT.mjs";const I={__lunoraRef:""},N=[],S={awaiting_approval:"awaiting-approval",awaiting_secret:"awaiting-secret"},k=o=>{const t=o.status===void 0?void 0:S[o.status];if(t!==void 0)return{seq:o.seq,type:t,...o.toolCallId===void 0?{}:{toolCallId:o.toolCallId},...o.toolName===void 0?{}:{toolName:o.toolName}}},q=o=>{if(o.role==="assistant"&&o.toolCalls)return o.toolCalls.map(r=>({input:r.input,seq:o.seq,toolCallId:r.id,toolName:r.name,type:"call"}));if(o.role!=="tool")return;const t=k(o);return t!==void 0?[t]:[{output:o.content,seq:o.seq,type:"result",...o.status==="approved"||o.status==="rejected"?{status:o.status}:{},...o.toolCallId===void 0?{}:{toolCallId:o.toolCallId},...o.toolName===void 0?{}:{toolName:o.toolName}}]},m=o=>{const t=C(12),{api:r,limit:n,stream:i,threadKey:l}=o;let a;t[0]!==n||t[1]!==l?(a=n===void 0?{key:l}:{key:l,limit:n},t[0]=n,t[1]=l,t[2]=a):a=t[2];const v=a,{data:f}=_(r.agents.agentMessages,v);let s;t[3]!==i||t[4]!==l?(s=i===void 0?"skip":{key:l},t[3]=i,t[4]=l,t[5]=s):s=t[5];const E=s,{chunks:p}=y(i??I,E),c=f??N;let e;if(t[6]!==p||t[7]!==c||t[8]!==l){e=c.flatMap(A);for(const d of p)d.kind==="progress"&&d.threadKey===l&&e.push({data:d.data,toolCallId:d.toolCallId,type:"progress"});t[6]=p,t[7]=c,t[8]=l,t[9]=e}else e=t[9];let u;return t[10]!==e?(u={events:e},t[10]=e,t[11]=u):u=t[11],u};function A(o){return q(o)??[]}export{m as useAgentToolEvents};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as h}from"react/compiler-runtime";import{getIdentityStore as k}from"@lunora/client/auth";import{useSyncExternalStore as p}from"react";import{u as A}from"./lunora-provider-CW9Gd-pp.mjs";const _=()=>{const t=h(13),e=A();let o;t[0]!==e?(o=k(e),t[0]=e,t[1]=o):o=t[1];const n=o;let s,r,u;t[2]!==e?(s=g=>e.onAuthTokenChange(g),r=()=>e.getAuthToken(),u=()=>e.getAuthToken(),t[2]=e,t[3]=s,t[4]=r,t[5]=u):(s=t[3],r=t[4],u=t[5]);const i=p(s,r,u),f=p(n.subscribe,n.getUser,T),m=p(n.subscribe,n.getStatus,b);let l;t[6]!==e?(l=g=>{e.setAuthToken(g)},t[6]=e,t[7]=l):l=t[7];const a=l;let c;return t[8]!==a||t[9]!==m||t[10]!==i||t[11]!==f?(c={setToken:a,status:m,token:i,user:f},t[8]=a,t[9]=m,t[10]=i,t[11]=f,t[12]=c):c=t[12],c};function T(){return null}function b(){return"loading"}export{_ as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as y}from"react/compiler-runtime";import{useMutation as z,useQuery as _,keepPreviousData as b}from"@tanstack/react-query";import{useState as U,useSyncExternalStore as D}from"react";import{u as A}from"./lunora-provider-CW9Gd-pp.mjs";const E="lunora-react-admin-auth",F=50;function S(t,e,o,u={}){const{enabled:r=!0,pageSize:c=F}=u,[i,s]=U(c),l=D(m=>{const v=t.onAuthTokenChange(m),I=t.onIdentityChange(m);return()=>{v(),I()}},()=>t.currentIdentity(),()=>t.currentIdentity()),n=[E,l??"anon",...e,i],a=_({enabled:r,placeholderData:(m,v)=>v?.queryKey[1]===n[1]?b(m):void 0,queryFn:()=>o(i),queryKey:n,staleTime:0}),d=a.data?.rows,f=a.data?.total,p=f!==void 0&&d!==void 0&&d.length<f,h=()=>{p&&s(m=>m+c)},g=()=>{a.refetch().catch(()=>{})};return{data:d,error:a.error??void 0,hasMore:p,loadMore:h,loading:a.isLoading,refetch:g,total:f}}const q=t=>{const e=y(20);let o;e[0]!==t?(o=t===void 0?{}:t,e[0]=t,e[1]=o):o=e[1];const u=o,r=A(),{enabled:c,filterField:i,filterValue:s,pageSize:l,search:n,searchField:a,sortBy:d,sortDirection:f}=u;let p;e[2]!==i||e[3]!==s||e[4]!==n||e[5]!==a||e[6]!==d||e[7]!==f?(p=["users",{filterField:i,filterValue:s,search:n,searchField:a,sortBy:d,sortDirection:f}],e[2]=i,e[3]=s,e[4]=n,e[5]=a,e[6]=d,e[7]=f,e[8]=p):p=e[8];let h;e[9]!==r||e[10]!==i||e[11]!==s||e[12]!==n||e[13]!==a||e[14]!==d||e[15]!==f?(h=m=>r.listAuthUsers({filterField:i,filterValue:s,limit:m,search:n,searchField:a,sortBy:d,sortDirection:f}),e[9]=r,e[10]=i,e[11]=s,e[12]=n,e[13]=a,e[14]=d,e[15]=f,e[16]=h):h=e[16];let g;return e[17]!==c||e[18]!==l?(g={enabled:c,pageSize:l},e[17]=c,e[18]=l,e[19]=g):g=e[19],S(r,p,h,g)},M=t=>{const e=y(8);let o;e[0]!==t?(o=t===void 0?{}:t,e[0]=t,e[1]=o):o=e[1];const u=o,r=A(),{enabled:c,pageSize:i}=u;let s;e[2]===Symbol.for("react.memo_cache_sentinel")?(s=["organizations"],e[2]=s):s=e[2];let l;e[3]!==r?(l=a=>r.listAuthOrganizations({limit:a}),e[3]=r,e[4]=l):l=e[4];let n;return e[5]!==c||e[6]!==i?(n={enabled:c,pageSize:i},e[5]=c,e[6]=i,e[7]=n):n=e[7],S(r,s,l,n)},k=t=>{const e=y(8);let o;e[0]!==t?(o=t===void 0?{}:t,e[0]=t,e[1]=o):o=e[1];const u=o,r=A(),{enabled:c,pageSize:i}=u;let s;e[2]===Symbol.for("react.memo_cache_sentinel")?(s=["sign-up-invitations"],e[2]=s):s=e[2];let l;e[3]!==r?(l=a=>r.listAuthSignUpInvitations({limit:a}),e[3]=r,e[4]=l):l=e[4];let n;return e[5]!==c||e[6]!==i?(n={enabled:c,pageSize:i},e[5]=c,e[6]=i,e[7]=n):n=e[7],S(r,s,l,n)},K=t=>{const e=y(10);let o;e[0]!==t?(o=t===void 0?{}:t,e[0]=t,e[1]=o):o=e[1];const u=o,r=A(),{enabled:c,pageSize:i,userId:s}=u;let l;e[2]!==s?(l=["sessions",{userId:s}],e[2]=s,e[3]=l):l=e[3];let n;e[4]!==r||e[5]!==s?(n=d=>r.listAuthSessions({limit:d,userId:s}),e[4]=r,e[5]=s,e[6]=n):n=e[6];let a;return e[7]!==c||e[8]!==i?(a={enabled:c,pageSize:i},e[7]=c,e[8]=i,e[9]=a):a=e[9],S(r,l,n,a)},w=()=>{const t=y(10),e=A();let o;t[0]!==e?(o={mutationFn:a=>e.impersonateAuthUser({userId:a})},t[0]=e,t[1]=o):o=t[1];const u=z(o),{mutateAsync:r,reset:c}=u;let i;t[2]!==r?(i=a=>r(a),t[2]=r,t[3]=i):i=t[3];const s=i,l=u.error??void 0;let n;return t[4]!==s||t[5]!==u.data||t[6]!==u.isPending||t[7]!==c||t[8]!==l?(n={data:u.data,error:l,impersonate:s,pending:u.isPending,reset:c},t[4]=s,t[5]=u.data,t[6]=u.isPending,t[7]=c,t[8]=l,t[9]=n):n=t[9],n};export{K as useAuthSessions,q as useAuthUsers,w as useImpersonate,M as useOrganizations,k as useSignUpInvitations};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as u}from"react/compiler-runtime";import{isAuthenticatedStatus as r,isLoadingStatus as a}from"@lunora/client/auth";import n from"./useAuth-Do03WzEi.mjs";const m=()=>{const t=u(7),{status:e}=n();let s;t[0]!==e?(s=r(e),t[0]=e,t[1]=s):s=t[1];let i;t[2]!==e?(i=a(e),t[2]=e,t[3]=i):i=t[3];let o;return t[4]!==s||t[5]!==i?(o={isAuthenticated:s,isLoading:i},t[4]=s,t[5]=i,t[6]=o):o=t[6],o};export{m as useAuthState};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useCallback as u,useSyncExternalStore as l}from"react";import{u as c}from"./lunora-provider-CW9Gd-pp.mjs";const y=e=>{const t=c(),n=u(s=>t.subscribeClientQuery(e,()=>{s()}),[t,e.key]),r=l(n,()=>t.getClientQuery(e),()=>t.getClientQuery(e)),o=u(s=>{t.setClientQuery(e,s)},[t,e]);return[r,o]};export{y as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as r}from"react/compiler-runtime";import{useSyncExternalStore as u}from"react";import{u as a}from"./lunora-provider-CW9Gd-pp.mjs";const S=()=>{const t=r(4),n=a();let o,e,s;return t[0]!==n?(o=c=>n.onConnectionStatus(()=>{c()}),e=()=>n.connectionStatus(),s=()=>n.connectionStatus(),t[0]=n,t[1]=o,t[2]=e,t[3]=s):(o=t[1],e=t[2],s=t[3]),u(o,e,s)};export{S as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useState as _,useRef as i,useEffect as b}from"react";import{u as d}from"./lunora-provider-CW9Gd-pp.mjs";import{stableStringify as K}from"@lunora/wire";const g="__lunora_flags__:eval",m=t=>{const e=typeof t;return e==="boolean"||e==="number"||e==="string"?e:"object"},v={__lunoraRef:g},F=(t,e,n)=>{try{return t.subscribe(v,{default:e.default,key:e.key,type:m(e.default)},s=>{n(s)},{onError:()=>{n(e.default)}})}catch{return()=>{}}},S=(t,e)=>{const n=d(),[s,r]=_(e),o=m(e),u=`${t}::${o}`,f=i(u);f.current!==u&&(f.current=u,r(e));const l=i(e);return b(()=>{l.current=e}),b(()=>{let a=!1;const c=l.current;r(c);const p=F(n,{default:c,key:t},y=>{a||r(y)});return()=>{a=!0,p()}},[n,t,o]),s},h=t=>{const e=d(),[n,s]=_(t),r=K(t),o=i(r);o.current!==r&&(o.current=r,s(t));const u=i(t);return b(()=>{u.current=t}),b(()=>{let f=!1;const l=u.current;s(l);const a=[];for(const[c,p]of Object.entries(l))a.push(F(e,{default:p,key:c},y=>{f||s(R=>({...R,[c]:y}))}));return()=>{f=!0;for(const c of a)c()}},[e,r]),n};export{S as useFlag,h as useFlags};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as S}from"react/compiler-runtime";import{useReducer as _,useRef as v,useEffect as R}from"react";import{u as b}from"./lunora-provider-CW9Gd-pp.mjs";import{s as z,c as E}from"./stream-state-abygFxmy.mjs";import{stableWireKey as H}from"@lunora/wire";const w=(t,c,n)=>{const e=S(24);let m;e[0]!==n?(m=n===void 0?{}:n,e[0]=n,e[1]=m):m=e[1];const o=m,f=b();let a;e[2]===Symbol.for("react.memo_cache_sentinel")?(a={chunks:[],error:void 0,status:"idle"},e[2]=a):a=e[2];const[s,i]=_(z,a),r=c==="skip";let u;e[3]!==c||e[4]!==r?(u=r?"skip":H(c),e[3]=c,e[4]=r,e[5]=u):u=e[5];const k=u,x=v(void 0);let l;e[6]!==c||e[7]!==f||e[8]!==o.maxBuffer||e[9]!==t||e[10]!==r?(l=()=>{if(r)return i({type:"reset"}),K;i({type:"reset"}),i({type:"start"});const{cancel:B,cleanup:y}=E(f.httpStream(t,c,{maxBuffer:o.maxBuffer}),i);return x.current=B,()=>{y(),x.current=void 0}},e[6]=c,e[7]=f,e[8]=o.maxBuffer,e[9]=t,e[10]=r,e[11]=l):l=e[11];let p;e[12]!==f||e[13]!==o.maxBuffer||e[14]!==t.method||e[15]!==t.path||e[16]!==k||e[17]!==r?(p=[f,t.method,t.path,k,r,o.maxBuffer],e[12]=f,e[13]=o.maxBuffer,e[14]=t.method,e[15]=t.path,e[16]=k,e[17]=r,e[18]=p):p=e[18],R(l,p);let h;e[19]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{x.current?.()},e[19]=h):h=e[19];let d;return e[20]!==s.chunks||e[21]!==s.error||e[22]!==s.status?(d={cancel:h,chunks:s.chunks,error:s.error,status:s.status},e[20]=s.chunks,e[21]=s.error,e[22]=s.status,e[23]=d):d=e[23],d};function K(){}export{w as useHttpStream};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as M}from"react/compiler-runtime";import{useRef as R,useEffect as y}from"react";import{u as C}from"./use-paginated-core-D9QnfDFs.mjs";const v=(x,c,N)=>{const e=M(16),{initialNumItems:s}=N,{error:u,loadMore:o,pageResults:m,status:a}=C(x,c==="skip"?"skip":c,N),P=c==="skip";let t;if(e[0]!==m){t=[];for(const f of m)f&&t.push(f.page);e[0]=m,e[1]=t}else t=e[1];let i;e[2]!==s||e[3]!==o?(i={defaultNumItems:s,loadMore:o},e[2]=s,e[3]=o,e[4]=i):i=e[4];const h=R(i);let n;e[5]!==s||e[6]!==o?(n=()=>{h.current={defaultNumItems:s,loadMore:o}},e[5]=s,e[6]=o,e[7]=n):n=e[7],y(n);let r;e[8]===Symbol.for("react.memo_cache_sentinel")?(r=f=>{const{defaultNumItems:k,loadMore:L}=h.current;L(f??k)},e[8]=r):r=e[8];const I=r,d=a==="CanLoadMore",p=!P&&a==="LoadingMore",g=!P&&a==="LoadingFirstPage";let l;return e[9]!==u||e[10]!==t||e[11]!==a||e[12]!==d||e[13]!==p||e[14]!==g?(l={error:u,fetchNextPage:I,hasNextPage:d,isFetchingNextPage:p,isLoading:g,pages:t,status:a},e[9]=u,e[10]=t,e[11]=a,e[12]=d,e[13]=p,e[14]=g,e[15]=l):l=e[15],l};export{v as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as D}from"react/compiler-runtime";import{liveTopicSubscription as R,subscribeLiveTopic as C}from"@lunora/client";import{stableWireKey as M}from"@lunora/wire";import{useState as W,useRef as $,useEffect as y}from"react";import{u as g}from"./lunora-provider-CW9Gd-pp.mjs";function F(b,f){const t=D(8),d=f===void 0?{}:f,o=R(g(),b,d),{headers:k,maxDelayMs:T,retryDelay:K,sessionKey:L,topic:S,url:h,withCredentials:w}=o,e=M({headers:k,maxDelayMs:T,retryDelay:K,sessionKey:L,topic:S,url:h,withCredentials:w}),[p,l]=W(),m=p?.key===e?p:void 0,s=$(o);let n;t[0]!==o?(n=()=>{s.current=o},t[0]=o,t[1]=n):n=t[1],y(n);let i,c;t[2]!==e?(i=()=>{const x=C({...s.current,onError:r=>{l(E=>({error:r,key:e,lastEvent:E?.key===e?E.lastEvent:void 0})),s.current.onError?.(r)},onEvent:r=>{l({error:void 0,key:e,lastEvent:r}),s.current.onEvent?.(r)}});return()=>{x(),l(void 0)}},c=[e],t[2]=e,t[3]=i,t[4]=c):(i=t[3],c=t[4]),y(i,c);const a=m?.error,v=m?.lastEvent;let u;return t[5]!==a||t[6]!==v?(u={error:a,lastEvent:v},t[5]=a,t[6]=v,t[7]=u):u=t[7],u}export{F as useLiveTopic};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useQueryClient as k,useMutation as v,onlineManager as g}from"@tanstack/react-query";import{useRef as A,useState as P,useCallback as O}from"react";import{u as Q}from"./lunora-provider-CW9Gd-pp.mjs";const R=async()=>new Promise(n=>{if(g.isOnline()){n();return}const r=g.subscribe(u=>{u&&(r(),n())})}),x=n=>{const r=Q(),u=k(),a=n.sensitive===!0,c=A(0),[l,p]=P(!1),b=v({mutationFn:async({args:e,options:t})=>(!(a||t?.onlineOnly===!0)&&!r.canQueueOffline(t?.shardKey)&&await R(),r.mutation(n,e,t)),networkMode:"always",...a?{gcTime:0}:{},retry:0,onMutate:()=>{c.current+=1,p(!0)},onSettled:(e,t,o)=>{if(c.current-=1,p(c.current>0),a||o.options?.onlineOnly===!0){const i=u.getMutationCache();for(const h of i.findAll({predicate:C=>C.state.variables===o}))i.remove(h)}}}),{data:m,error:d,isError:f,mutateAsync:s,reset:y}=b,w=O((e,t)=>s({args:e,options:t}),[s]),M=O(e=>({data:m,error:d,isError:f,mutate:(o,i)=>s({args:o,options:{optimisticUpdate:e,...i}}),pending:l,reset:y,withOptimisticUpdate:M}),[s,m,d,f,l,y]);return{data:m,error:d,isError:f,mutate:w,pending:l,reset:y,withOptimisticUpdate:M}};export{x as useMutation};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as p}from"react/compiler-runtime";import{createMutatorRunner as l}from"@lunora/client";import{useState as f}from"react";const E=function(s){const t=p(8),[n,m]=f(!1),[r,a]=f(void 0);let e;t[0]!==s?(e=l(s,{setError:a,setPending:m}),t[0]=s,t[1]=e):e=t[1];const{mutate:i,reset:u}=e,c=r!==void 0;let o;return t[2]!==r||t[3]!==i||t[4]!==n||t[5]!==u||t[6]!==c?(o={error:r,isError:c,mutate:i,pending:n,reset:u},t[2]=r,t[3]=i,t[4]=n,t[5]=u,t[6]=c,t[7]=o):o=t[7],o};export{E as useMutator};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c}from"react/compiler-runtime";import{u as f}from"./use-paginated-core-D9QnfDFs.mjs";const L=(d,i,l)=>{const e=c(8),{error:r,loadMore:p,pageResults:n,status:t}=f(d,i==="skip"?"skip":i,l);let s;if(e[0]!==n){s=[];for(const u of n)u&&s.push(...u.page);e[0]=n,e[1]=s}else s=e[1];const a=!(i==="skip")&&(t==="LoadingFirstPage"||t==="LoadingMore");let o;return e[2]!==r||e[3]!==p||e[4]!==s||e[5]!==t||e[6]!==a?(o={error:r,isLoading:a,loadMore:p,results:s,status:t},e[2]=r,e[3]=p,e[4]=s,e[5]=t,e[6]=a,e[7]=o):o=e[7],o};export{L as usePaginatedQuery};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useMemo as _,useState as w,useRef as l,useEffect as u,useCallback as E}from"react";import{u as D}from"./lunora-provider-CW9Gd-pp.mjs";const V=e=>{if(!Number.isFinite(e)||e<=0)throw new RangeError(`presence intervalMs must be a positive number, got ${String(e)}`)},A=()=>{if(typeof crypto<"u"){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto.getRandomValues=="function"){const e=crypto.getRandomValues(new Uint8Array(16));return Array.from(e,r=>r.toString(16).padStart(2,"0")).join("")}}throw new Error("randomSessionId: no Web Crypto available — a session id needs crypto.randomUUID or crypto.getRandomValues")},C=1e4,P=(e,r)=>{const t=D(),{heartbeat:g,intervalMs:y=C,listPresent:m,shardKey:s}=r;V(y);const o=_(()=>r.sessionId??A(),[r.sessionId]),d=JSON.stringify([m.__lunoraRef,e,s??""]),[b,p]=w(),h=b?.client===t&&b.key===d?b:void 0,R=l(r.onError);u(()=>{R.current=r.onError});const v=l(r.data),I=l(!1),S=l({client:t,heartbeat:g,roomId:e,sessionId:o,shardKey:s});u(()=>{S.current={client:t,heartbeat:g,roomId:e,sessionId:o,shardKey:s}});const i=E(()=>{const{client:n,heartbeat:c,roomId:a,sessionId:f,shardKey:k}=S.current,L={roomId:a,sessionId:f,...v.current===void 0?{}:{data:v.current}};n.mutation(c,L,{shardKey:k}).catch(()=>{})},[]),U=E(n=>{v.current=n,I.current&&i()},[i]);return u(()=>(I.current=!0,()=>{I.current=!1}),[]),u(()=>{i();const n=setInterval(i,y),c=()=>{typeof document<"u"&&document.visibilityState==="visible"&&i()};return typeof document<"u"&&document.addEventListener("visibilitychange",c),()=>{clearInterval(n),typeof document<"u"&&document.removeEventListener("visibilitychange",c)}},[i,y,t,e,o,s]),u(()=>t.acquireConnectionContext({roomId:e,sessionId:o},{shardKey:s}),[t,e,o,s]),u(()=>{let n=!1;const c=t.subscribe(m,{roomId:e},a=>{n||p({client:t,error:void 0,key:d,present:a})},{onError:a=>{n||p(f=>({client:t,error:a,key:d,present:f?.client===t&&f.key===d?f.present:void 0})),R.current?.(a)},shardKey:s});return()=>{n=!0,c(),p(void 0)}},[t,m.__lunoraRef,e,d,s]),{error:h?.error,present:h?.present,sessionId:o,setData:U}};export{P as usePresence};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as k}from"react/compiler-runtime";import{useQueryClient as q,useQuery as E}from"@tanstack/react-query";import{useState as F,useEffect as N}from"react";import{u as T,g as V}from"./lunora-provider-CW9Gd-pp.mjs";import{u as A}from"./query-core-CqnQ_-E5.mjs";import{a as C}from"./query-key-BysXrewF.mjs";import{stableWireKey as D}from"@lunora/wire";const P=(s,K,R)=>{const e=k(26),v=R===void 0?{}:R,t=T(),y=q(),{onError:Q,shardKey:r}=v,u=K==="skip",o=u?{}:K,l=D(o),a=C(s.__lunoraRef,l,r),[n,b]=F(t.isReady);let d,c;e[0]!==t||e[1]!==n?(d=()=>{n||t.whenReady().then(()=>{b(!0)})},c=[t,n],e[0]=t,e[1]=n,e[2]=d,e[3]=c):(d=e[2],c=e[3]),N(d,c);let m;if(!u){const h=t.peekHydratedQueryByKey(s.__lunoraRef,l,r);m=h===void 0?t.peekActiveQuerySnapshot(s.__lunoraRef,o,r).value:h}const g=!u&&n;let i;e[4]!==o||e[5]!==t||e[6]!==s||e[7]!==y||e[8]!==a||e[9]!==r?(i=async h=>{const{signal:S}=h;return V(t).liveValue(y,a,S,{fetch:async()=>t.query(s,o,{shardKey:r}),shardKey:r})},e[4]=o,e[5]=t,e[6]=s,e[7]=y,e[8]=a,e[9]=r,e[10]=i):i=e[10];let p;e[11]!==m||e[12]!==a||e[13]!==g||e[14]!==i?(p={enabled:g,initialData:m,queryFn:i,queryKey:a,staleTime:Number.POSITIVE_INFINITY},e[11]=m,e[12]=a,e[13]=g,e[14]=i,e[15]=p):p=e[15];const{data:I}=E(p);let f;return e[16]!==l||e[17]!==o||e[18]!==t||e[19]!==s||e[20]!==Q||e[21]!==y||e[22]!==a||e[23]!==r||e[24]!==u?(f={args:o,argsKey:l,client:t,function_:s,onError:Q,queryClient:y,queryKey:a,shardKey:r,skipped:u},e[16]=l,e[17]=o,e[18]=t,e[19]=s,e[20]=Q,e[21]=y,e[22]=a,e[23]=r,e[24]=u,e[25]=f):f=e[25],A(f),u?void 0:I};export{P as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{evaluate as u}from"@lunora/ratelimit";import{useRef as i,useReducer as w,useCallback as c,useEffect as R}from"react";const p=(t,a={})=>{const r=a.now??Date.now,l=a.tickMs??1e3,s=i(void 0),[,n]=w(e=>e+1,0),v=c((e=1)=>{const{status:d,value:f}=u(t,s.current,{consume:!0,count:e,now:r(),reserve:!1});return f!==void 0&&(s.current=f),n(),d},[t,r]),k=c((e=1)=>u(t,s.current,{consume:!1,count:e,now:r(),reserve:!1}).status.ok,[t,r]),m=c(()=>{s.current=void 0,n()},[]),{status:o}=u(t,s.current,{consume:!1,count:1,now:r(),reserve:!1});return R(()=>{if(o.ok)return()=>{};const e=setInterval(n,l);return()=>{clearInterval(e)}},[o.ok,l]),{check:k,consume:v,disabled:!o.ok,ok:o.ok,reset:m,retryAfter:o.retryAfter}};export{p as useRateLimit};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as K}from"react/compiler-runtime";import{useReducer as B,useRef as R,useEffect as _}from"react";import{u as v}from"./lunora-provider-CW9Gd-pp.mjs";import{s as S,c as z}from"./stream-state-abygFxmy.mjs";import{stableWireKey as E}from"@lunora/wire";const A=(u,a,l)=>{const e=K(27);let c;e[0]!==l?(c=l===void 0?{}:l,e[0]=l,e[1]=c):c=e[1];const r=c,o=v();let f;e[2]===Symbol.for("react.memo_cache_sentinel")?(f={chunks:[],error:void 0,status:"idle"},e[2]=f):f=e[2];const[t,m]=B(S,f),s=a==="skip";let n;e[3]!==a||e[4]!==s?(n=s?"skip":E(a),e[3]=a,e[4]=s,e[5]=n):n=e[5];const y=n,b=R(void 0);let i;e[6]!==a||e[7]!==o||e[8]!==u||e[9]!==r.durable||e[10]!==r.maxBuffer||e[11]!==r.shardKey||e[12]!==s?(i=()=>{if(s)return m({type:"reset"}),L;m({type:"reset"}),m({type:"start"});const{cancel:k,cleanup:x}=z(o.stream(u,a,{durable:r.durable,maxBuffer:r.maxBuffer,shardKey:r.shardKey}),m);return b.current=k,()=>{x(),b.current=void 0}},e[6]=a,e[7]=o,e[8]=u,e[9]=r.durable,e[10]=r.maxBuffer,e[11]=r.shardKey,e[12]=s,e[13]=i):i=e[13];let d;e[14]!==o||e[15]!==u.__lunoraRef||e[16]!==r.durable||e[17]!==r.maxBuffer||e[18]!==r.shardKey||e[19]!==y||e[20]!==s?(d=[o,u.__lunoraRef,y,s,r.shardKey,r.maxBuffer,r.durable],e[14]=o,e[15]=u.__lunoraRef,e[16]=r.durable,e[17]=r.maxBuffer,e[18]=r.shardKey,e[19]=y,e[20]=s,e[21]=d):d=e[21],_(i,d);let p;e[22]===Symbol.for("react.memo_cache_sentinel")?(p=()=>{b.current?.()},e[22]=p):p=e[22];let h;return e[23]!==t.chunks||e[24]!==t.error||e[25]!==t.status?(h={cancel:p,chunks:t.chunks,error:t.error,status:t.status},e[23]=t.chunks,e[24]=t.error,e[25]=t.status,e[26]=h):h=e[26],h};function L(){}export{A as useStream};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as O}from"react/compiler-runtime";import{createQuerySubscription as j}from"@lunora/client/query";import{LunoraError as L}from"@lunora/errors";import{useState as M,useRef as R,useEffect as E}from"react";import{u as q}from"./lunora-provider-CW9Gd-pp.mjs";import{stableWireKey as x}from"@lunora/wire";const A=Object.freeze({data:void 0,error:void 0}),W=(t,n,b)=>{const e=O(20),r=b===void 0?{}:b,o=q(),a=n==="skip",c=a?"skip":x(n),i=JSON.stringify([t.__lunoraRef,c,r.shardKey??""]),[y,p]=M(void 0),v=R(r.onError);let u;e[0]!==r.onError?(u=()=>{v.current=r.onError},e[0]=r.onError,e[1]=u):u=e[1],E(u);let d;e[2]!==n||e[3]!==t?(d={args:n,fn:t},e[2]=n,e[3]=t,e[4]=d):d=e[4];const K=R(d);let l;e[5]!==n||e[6]!==t?(l=()=>{K.current={args:n,fn:t}},e[5]=n,e[6]=t,e[7]=l):l=e[7],E(l);let f;e[8]!==o||e[9]!==i||e[10]!==r.shardKey||e[11]!==a?(f=()=>{if(a)return D;let h=!1;const{args:k,fn:w}=K.current,S=j(o,w,k,{onData:s=>{h||p({client:o,key:i,result:{data:s,error:void 0}})},onError:s=>{const z=Object.assign(s.code===void 0?new Error(s.message):new L(s.code,s.message),s.why===void 0?{}:{why:s.why});v.current?.(s),queueMicrotask(()=>{h||p({client:o,key:i,result:{data:void 0,error:z}})})}},{shardKey:r.shardKey});return()=>{h=!0,S(),p(void 0)}},e[8]=o,e[9]=i,e[10]=r.shardKey,e[11]=a,e[12]=f):f=e[12];let m;return e[13]!==o||e[14]!==t.__lunoraRef||e[15]!==i||e[16]!==r.shardKey||e[17]!==c||e[18]!==a?(m=[o,t.__lunoraRef,i,c,r.shardKey,a],e[13]=o,e[14]=t.__lunoraRef,e[15]=i,e[16]=r.shardKey,e[17]=c,e[18]=a,e[19]=m):m=e[19],E(f,m),y?.client===o&&y.key===i?y.result:A};function D(){}export{W as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as h}from"react/compiler-runtime";import{useQueryClient as R,useSuspenseQuery as S}from"@tanstack/react-query";import{u as I,g as b}from"./lunora-provider-CW9Gd-pp.mjs";import{u as q}from"./query-core-CqnQ_-E5.mjs";import{a as F}from"./query-key-BysXrewF.mjs";import{stableWireKey as k}from"@lunora/wire";const E=(s,m,c)=>{const e=h(21),f=c===void 0?{}:c,r=I(),u=R(),{onError:d,shardKey:a}=f,y=m,o=k(y),t=F(s.__lunoraRef,o,a),p=r.isReady?r.peekHydratedQueryByKey(s.__lunoraRef,o,a):void 0;let i;e[0]!==o||e[1]!==y||e[2]!==r||e[3]!==s||e[4]!==u||e[5]!==t||e[6]!==a?(i=async K=>{const{signal:Q}=K;return await r.whenReady(),r.peekHydratedQueryByKey(s.__lunoraRef,o,a)??b(r).liveValue(u,t,Q,{fetch:async()=>r.query(s,y,{shardKey:a}),waitForPush:!1})},e[0]=o,e[1]=y,e[2]=r,e[3]=s,e[4]=u,e[5]=t,e[6]=a,e[7]=i):i=e[7];let l;e[8]!==p||e[9]!==t||e[10]!==i?(l={initialData:p,queryFn:i,queryKey:t,staleTime:Number.POSITIVE_INFINITY},e[8]=p,e[9]=t,e[10]=i,e[11]=l):l=e[11];const{data:g}=S(l);let n;return e[12]!==o||e[13]!==y||e[14]!==r||e[15]!==s||e[16]!==d||e[17]!==u||e[18]!==t||e[19]!==a?(n={args:y,argsKey:o,client:r,function_:s,onError:d,queryClient:u,queryKey:t,shardKey:a,skipped:!1},e[12]=o,e[13]=y,e[14]=r,e[15]=s,e[16]=d,e[17]=u,e[18]=t,e[19]=a,e[20]=n):n=e[20],q(n),g};export{E as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{useState as T,useRef as W,useCallback as y,useEffect as G}from"react";import{u as X}from"./lunora-provider-CW9Gd-pp.mjs";const N="/_lunora/ws",j="/_lunora/voice/",z=4001,O=e=>e.startsWith("https://")?`wss://${e.slice(8)}`:e.startsWith("http://")?`ws://${e.slice(7)}`:e,Q=e=>{const r=e.startsWith("agents:")?e.slice(7):e;return r.endsWith("Voice")?r.slice(0,-5):r},Y=(e,r)=>{if(r===void 0||r==="")return O(e);if(r.endsWith(N))return r.slice(0,-N.length);try{return new URL(r).origin}catch{return O(e)}},Z=e=>{const r=Y(e.httpUrl,e.wsUrl),s=r.endsWith("/")?r.slice(0,-1):r,c=new URLSearchParams({threadKey:e.threadKey});return`${s}${j}${encodeURIComponent(e.agent)}?${c.toString()}`},ee=(e,r)=>{if(r?.code===z)return new Error(`${e}: authentication token expired — refresh the credential and start a new call`)},te=(e,r,s)=>{const c=e.currentIdentity();return e.onAuthTokenChange(()=>{e.currentIdentity()!==c&&s(new Error(`${r}: the signed-in identity changed during the call — the session was ended; start a new call`))})},ne=16e3,re=e=>{if(e.length===0)return 0;let r=0;for(const s of e)r+=s*s;return Math.sqrt(r/e.length)},se=(e,r)=>{const s=r/ne,c=s>1?Math.floor(e.length/s):e.length,d=new ArrayBuffer(c*2),l=new DataView(d);for(let u=0;u<c;u+=1){const g=e[Math.floor(u*s)]??0,p=Math.max(-1,Math.min(1,g));l.setInt16(u*2,p<0?p*32768:p*32767,!0)}return new Uint8Array(d)},oe=async e=>{const r=globalThis,s=r.navigator?.mediaDevices?.getUserMedia.bind(r.navigator.mediaDevices),c=r.AudioContext??r.webkitAudioContext;if(!s||!c)throw new Error("useVoiceAgent: microphone capture requires getUserMedia + AudioContext (no browser audio available)");const d=await s({audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0}}),l=new c,u=l.createMediaStreamSource(d),g=l.createScriptProcessor(4096,1,1);let p=!1,w=!1,a=0,h=0;return g.onaudioprocess=o=>{const f=o.inputBuffer.getChannelData(0),m=p?0:re(f);if(e.onLevel(m),p)return;if(e.onAudio(se(f,l.sampleRate)),e.isTurnActive()){h=m>=e.interruptThreshold?h+1:0,h>=e.interruptChunks&&(h=0,e.onInterrupt());return}h=0;const x=f.length/l.sampleRate*1e3;if(m>=e.silenceThreshold){w=!0,a=0;return}w&&(a+=x,a>=e.silenceDurationMs&&(w=!1,a=0,e.onSilence()))},u.connect(g),g.connect(l.destination),{setMuted:o=>{p=o},stop:()=>{g.disconnect(),u.disconnect();for(const o of d.getTracks())o.stop();l.close()}}},ie=()=>{const e=globalThis,r=e.AudioContext??e.webkitAudioContext;if(!r)throw new Error("useVoiceAgent: audio playback requires AudioContext (no browser audio available)");const s=new r,c=new Set;let d=0,l=Promise.resolve(),u=0;const g=async(a,h)=>{if(h!==u)return;let o;try{o=await s.decodeAudioData(a.buffer)}catch{return}if(h!==u)return;const f=s.createBufferSource();f.buffer=o,f.connect(s.destination);const m=Math.max(s.currentTime,d);f.start(m),d=m+o.duration,c.add(f),f.onended=()=>{c.delete(f)}},p=a=>{const h=Uint8Array.from(a),o=u;l=l.then(()=>g(h,o))},w=()=>{u+=1;for(const a of c)try{a.stop()}catch{}c.clear(),d=s.currentTime};return{enqueue:p,interrupt:w,stop:()=>{w(),s.close()}}},P=1,ce=.01,ae=1200,ue=.15,le=3,he=e=>{const{createMicrophone:r=oe,createSpeaker:s=ie,createSocket:c,interruptChunks:d=le,interruptThreshold:l=ue,silenceDurationMs:u=ae,silenceThreshold:g=ce,threadKey:p,voice:w}=e,a=X(),[h,o]=T("idle"),[f,m]=T(!1),[x,M]=T(""),[H,v]=T(""),[$,R]=T(0),[I,U]=T(!1),[B,E]=T(void 0),i=W(void 0),_=W(!1),C=y(n=>{const t=i.current?.socket;return t?.readyState===P?(t.send(JSON.stringify(n)),!0):!1},[]),A=y(()=>{const n=i.current;if(i.current=void 0,n){n.unwatchIdentity?.(),n.microphone?.stop(),n.speaker?.stop(),n.socket.onmessage=null,n.socket.onerror=null,n.socket.onclose=null;try{n.socket.close()}catch{}}_.current=!1,m(!1),o("idle"),R(0)},[]),L=y(n=>{const t=i.current;switch(n.type){case"assistant_delta":{t&&(t.speaking=!0),o("speaking"),v(F=>F+n.text);break}case"assistant_discarded":{t&&(t.suppressAudio=!0),t?.speaker?.interrupt(),v("");break}case"assistant_done":{t&&(t.awaitingTurn=!1,t.speaking=!1),v(n.text),o("listening");break}case"error":{t&&(t.awaitingTurn=!1,t.speaking=!1),E(new Error(n.message)),o("listening");break}case"interrupted":{t&&(t.awaitingTurn=!1,t.speaking=!1,t.suppressAudio=!1),t?.speaker?.interrupt(),o("listening");break}case"ready":{t&&(t.audioFormat=n.audioFormat,t.suppressAudio=!1),m(!0),o("listening");break}case"user_transcript":{t&&(t.suppressAudio=!1),M(n.text),v(""),o("thinking");break}}},[]),D=y(n=>{const t=i.current;!t||t.suppressAudio||(t.speaker??=s({audioFormat:t.audioFormat}),t.speaking=!0,o("speaking"),t.speaker.enqueue(n))},[s]),q=y(async()=>{if(i.current||_.current)return;_.current=!0,E(void 0),M(""),v("");let n;try{const t=Z({agent:Q(w.__lunoraRef),httpUrl:a.url,threadKey:p,wsUrl:a.wsUrl}),S=(c??(k=>{const b=a.getWebSocketImpl();if(!b)throw new Error("useVoiceAgent: no WebSocket implementation available (pass createSocket explicitly)");return new b(k)}))(t);S.binaryType="arraybuffer",n={audioFormat:"mp3",microphone:void 0,socket:S,speaker:void 0,speaking:!1,awaitingTurn:!1,suppressAudio:!1,unwatchIdentity:void 0},i.current=n,n.unwatchIdentity=te(a,"useVoiceAgent",k=>{i.current===n&&(E(k),A())}),S.onmessage=k=>{if(typeof k.data=="string"){try{L(JSON.parse(k.data))}catch{}return}D(new Uint8Array(k.data))},S.onerror=()=>{E(new Error("useVoiceAgent: voice socket error"))},S.onclose=k=>{if(i.current!==n)return;const b=ee("useVoiceAgent",k);b&&E(b),A()};const V=await r({interruptChunks:d,interruptThreshold:l,isTurnActive:()=>(i.current?.speaking??!1)||(i.current?.awaitingTurn??!1),onAudio:k=>{S.readyState===P&&S.send(k)},onInterrupt:()=>{C({type:"interrupt"}),i.current?.speaker?.interrupt(),i.current&&(i.current.awaitingTurn=!1,i.current.speaking=!1,i.current.suppressAudio=!0),o("listening")},onLevel:R,onSilence:()=>{C({type:"commit"}),i.current&&(i.current.awaitingTurn=!0),o("thinking")},silenceDurationMs:u,silenceThreshold:g});i.current===n?(n.microphone=V,U(!1),n.speaking||o("listening")):V.stop()}catch(t){i.current===n&&(E(t instanceof Error?t:new Error(String(t))),A())}finally{_.current=!1}},[a,r,c,D,L,d,l,C,u,g,A,p,w]),K=y(()=>{const n=!I;return i.current?.microphone?.setMuted(n),U(n),n},[I]),J=y(n=>{C({text:n,type:"text"})&&(i.current&&(i.current.awaitingTurn=!0),o("thinking"))},[C]);return G(()=>A,[A]),{audioLevel:$,connected:f,endCall:A,error:B,interimTranscript:H,isMuted:I,sendText:J,startCall:q,status:h,toggleMute:K,transcript:x}};export{he as useVoiceAgent};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Stable provider identifier. Mirror of `@lunora/payment`'s `ProviderId` — the
|
|
4
|
+
* value is persisted verbatim, so an app branching on it must see every provider
|
|
5
|
+
* that has an adapter, not just the two that shipped first.
|
|
6
|
+
*/
|
|
7
|
+
type ProviderId = "autumn" | "creem" | "dodopayments" | "polar" | "stripe";
|
|
8
|
+
/**
|
|
9
|
+
* Client-safe mirror of `@lunora/payment`'s `Subscription`. Re-declared here
|
|
10
|
+
* (rather than imported) so this React entry never pulls in the server-only
|
|
11
|
+
* `@lunora/payment` module graph — the kit stays React + DOM only.
|
|
12
|
+
* `__tests__/payment-mirror.test.ts` fails when this drifts from
|
|
13
|
+
* `packages/payment/src/types.ts`.
|
|
14
|
+
*/
|
|
15
|
+
interface Subscription {
|
|
16
|
+
readonly cancelAtPeriodEnd: boolean;
|
|
17
|
+
readonly createdAt: number;
|
|
18
|
+
readonly currentPeriodEnd?: number;
|
|
19
|
+
/** Start of the current billing period — the window metered usage is summed over. */
|
|
20
|
+
readonly currentPeriodStart?: number;
|
|
21
|
+
readonly id: string;
|
|
22
|
+
/** When the provider says the last applied event happened (epoch ms); older redeliveries are ignored. */
|
|
23
|
+
readonly lastEventAt?: number;
|
|
24
|
+
readonly priceId: string;
|
|
25
|
+
/**
|
|
26
|
+
* EVERY price/product id the subscription bills, not just the primary one. A Stripe
|
|
27
|
+
* subscription can carry an add-on or a metered price alongside the base plan, and a
|
|
28
|
+
* customer paying for one is entitled to it — so entitlements test membership here.
|
|
29
|
+
*
|
|
30
|
+
* Optional because the webhook path and any pre-existing stored row carry only
|
|
31
|
+
* `priceId`; absent reads as `[priceId]`, which is exactly right for the single-item
|
|
32
|
+
* case every other provider has.
|
|
33
|
+
*/
|
|
34
|
+
readonly priceIds?: ReadonlyArray<string>;
|
|
35
|
+
readonly provider: ProviderId;
|
|
36
|
+
readonly quantity: number;
|
|
37
|
+
readonly referenceId: string;
|
|
38
|
+
/** Store-maintained write counter. The kit does not read it; it is mirrored so the drift gate sees every field. */
|
|
39
|
+
readonly revision?: number;
|
|
40
|
+
readonly state: "active" | "canceled" | "past_due" | "paused" | "trialing";
|
|
41
|
+
readonly updatedAt: number;
|
|
42
|
+
}
|
|
43
|
+
/** The `{ url }` shape every checkout/portal trigger resolves to. */
|
|
44
|
+
interface RedirectTarget {
|
|
45
|
+
readonly url: string;
|
|
46
|
+
}
|
|
47
|
+
/** A thunk the app supplies that calls its own Lunora action and resolves a redirect URL. */
|
|
48
|
+
type RedirectTrigger = () => Promise<RedirectTarget>;
|
|
49
|
+
interface UseCheckoutResult {
|
|
50
|
+
/** Run the trigger and redirect the browser to the resolved URL. Resolves once the redirect is issued; rejects on failure. */
|
|
51
|
+
checkout: () => Promise<void>;
|
|
52
|
+
/** The most recent failure, or `undefined`. */
|
|
53
|
+
error: Error | undefined;
|
|
54
|
+
/** `true` while the trigger is in flight (before the redirect is issued). */
|
|
55
|
+
pending: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Decoupled redirect-on-resolve primitive shared by `CheckoutButton` and
|
|
59
|
+
* `CustomerPortalButton`. The app passes a `trigger` thunk that calls its own
|
|
60
|
+
* Lunora action (the one wrapping `LunoraPayment.createCheckout` /
|
|
61
|
+
* `createPortalSession`) and resolves `{ url }`; this hook awaits it, flips
|
|
62
|
+
* `pending`, surfaces any `error`, and on success navigates via
|
|
63
|
+
* `location.assign(url)`.
|
|
64
|
+
*
|
|
65
|
+
* Mirrors Convex's `CheckoutLink` / `CustomerPortalLink` flow (trigger an action
|
|
66
|
+
* that returns a URL, then redirect) while staying agnostic of the app's
|
|
67
|
+
* function names.
|
|
68
|
+
*/
|
|
69
|
+
declare const useCheckout: (trigger: RedirectTrigger) => UseCheckoutResult;
|
|
70
|
+
/**
|
|
71
|
+
* Presentational props shared by the redirect buttons. Kept to a curated set
|
|
72
|
+
* (rather than spreading arbitrary button attributes) so the component stays
|
|
73
|
+
* within the repo's `react/jsx-props-no-spreading` rule while covering the
|
|
74
|
+
* common styling / accessibility hooks.
|
|
75
|
+
*/
|
|
76
|
+
interface RedirectButtonOwnProps {
|
|
77
|
+
/** Accessible label when the visible `children` are icon-only. */
|
|
78
|
+
"aria-label"?: string;
|
|
79
|
+
children?: ReactNode;
|
|
80
|
+
className?: string;
|
|
81
|
+
/** Force-disable the control regardless of pending state. */
|
|
82
|
+
disabled?: boolean;
|
|
83
|
+
/** Called with the failure when the trigger rejects. The error is also surfaced via `useCheckout`. */
|
|
84
|
+
onError?: (error: Error) => void;
|
|
85
|
+
title?: string;
|
|
86
|
+
}
|
|
87
|
+
interface CheckoutButtonProps extends RedirectButtonOwnProps {
|
|
88
|
+
/** Calls the app's checkout action and resolves the hosted-checkout `{ url }`. */
|
|
89
|
+
onCheckout: RedirectTrigger;
|
|
90
|
+
}
|
|
91
|
+
interface CustomerPortalButtonProps extends RedirectButtonOwnProps {
|
|
92
|
+
/** Calls the app's portal action and resolves the customer-portal `{ url }`. */
|
|
93
|
+
onPortal: RedirectTrigger;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Button that starts a hosted checkout. On click it awaits `onCheckout` (a thunk
|
|
97
|
+
* that calls the app's checkout action) and redirects to the returned URL,
|
|
98
|
+
* disabling itself while the request is in flight.
|
|
99
|
+
*/
|
|
100
|
+
declare const CheckoutButton: ({ onCheckout, ...rest }: CheckoutButtonProps) => ReactNode;
|
|
101
|
+
/**
|
|
102
|
+
* Button that opens the provider's customer portal. On click it awaits
|
|
103
|
+
* `onPortal` (a thunk that calls the app's portal action) and redirects to the
|
|
104
|
+
* returned URL, disabling itself while the request is in flight.
|
|
105
|
+
*/
|
|
106
|
+
declare const CustomerPortalButton: ({ onPortal, ...rest }: CustomerPortalButtonProps) => ReactNode;
|
|
107
|
+
export { CheckoutButton, type CheckoutButtonProps, CustomerPortalButton, type CustomerPortalButtonProps, type ProviderId, type RedirectTarget, type RedirectTrigger, type Subscription, type UseCheckoutResult, useCheckout };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Stable provider identifier. Mirror of `@lunora/payment`'s `ProviderId` — the
|
|
4
|
+
* value is persisted verbatim, so an app branching on it must see every provider
|
|
5
|
+
* that has an adapter, not just the two that shipped first.
|
|
6
|
+
*/
|
|
7
|
+
type ProviderId = "autumn" | "creem" | "dodopayments" | "polar" | "stripe";
|
|
8
|
+
/**
|
|
9
|
+
* Client-safe mirror of `@lunora/payment`'s `Subscription`. Re-declared here
|
|
10
|
+
* (rather than imported) so this React entry never pulls in the server-only
|
|
11
|
+
* `@lunora/payment` module graph — the kit stays React + DOM only.
|
|
12
|
+
* `__tests__/payment-mirror.test.ts` fails when this drifts from
|
|
13
|
+
* `packages/payment/src/types.ts`.
|
|
14
|
+
*/
|
|
15
|
+
interface Subscription {
|
|
16
|
+
readonly cancelAtPeriodEnd: boolean;
|
|
17
|
+
readonly createdAt: number;
|
|
18
|
+
readonly currentPeriodEnd?: number;
|
|
19
|
+
/** Start of the current billing period — the window metered usage is summed over. */
|
|
20
|
+
readonly currentPeriodStart?: number;
|
|
21
|
+
readonly id: string;
|
|
22
|
+
/** When the provider says the last applied event happened (epoch ms); older redeliveries are ignored. */
|
|
23
|
+
readonly lastEventAt?: number;
|
|
24
|
+
readonly priceId: string;
|
|
25
|
+
/**
|
|
26
|
+
* EVERY price/product id the subscription bills, not just the primary one. A Stripe
|
|
27
|
+
* subscription can carry an add-on or a metered price alongside the base plan, and a
|
|
28
|
+
* customer paying for one is entitled to it — so entitlements test membership here.
|
|
29
|
+
*
|
|
30
|
+
* Optional because the webhook path and any pre-existing stored row carry only
|
|
31
|
+
* `priceId`; absent reads as `[priceId]`, which is exactly right for the single-item
|
|
32
|
+
* case every other provider has.
|
|
33
|
+
*/
|
|
34
|
+
readonly priceIds?: ReadonlyArray<string>;
|
|
35
|
+
readonly provider: ProviderId;
|
|
36
|
+
readonly quantity: number;
|
|
37
|
+
readonly referenceId: string;
|
|
38
|
+
/** Store-maintained write counter. The kit does not read it; it is mirrored so the drift gate sees every field. */
|
|
39
|
+
readonly revision?: number;
|
|
40
|
+
readonly state: "active" | "canceled" | "past_due" | "paused" | "trialing";
|
|
41
|
+
readonly updatedAt: number;
|
|
42
|
+
}
|
|
43
|
+
/** The `{ url }` shape every checkout/portal trigger resolves to. */
|
|
44
|
+
interface RedirectTarget {
|
|
45
|
+
readonly url: string;
|
|
46
|
+
}
|
|
47
|
+
/** A thunk the app supplies that calls its own Lunora action and resolves a redirect URL. */
|
|
48
|
+
type RedirectTrigger = () => Promise<RedirectTarget>;
|
|
49
|
+
interface UseCheckoutResult {
|
|
50
|
+
/** Run the trigger and redirect the browser to the resolved URL. Resolves once the redirect is issued; rejects on failure. */
|
|
51
|
+
checkout: () => Promise<void>;
|
|
52
|
+
/** The most recent failure, or `undefined`. */
|
|
53
|
+
error: Error | undefined;
|
|
54
|
+
/** `true` while the trigger is in flight (before the redirect is issued). */
|
|
55
|
+
pending: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Decoupled redirect-on-resolve primitive shared by `CheckoutButton` and
|
|
59
|
+
* `CustomerPortalButton`. The app passes a `trigger` thunk that calls its own
|
|
60
|
+
* Lunora action (the one wrapping `LunoraPayment.createCheckout` /
|
|
61
|
+
* `createPortalSession`) and resolves `{ url }`; this hook awaits it, flips
|
|
62
|
+
* `pending`, surfaces any `error`, and on success navigates via
|
|
63
|
+
* `location.assign(url)`.
|
|
64
|
+
*
|
|
65
|
+
* Mirrors Convex's `CheckoutLink` / `CustomerPortalLink` flow (trigger an action
|
|
66
|
+
* that returns a URL, then redirect) while staying agnostic of the app's
|
|
67
|
+
* function names.
|
|
68
|
+
*/
|
|
69
|
+
declare const useCheckout: (trigger: RedirectTrigger) => UseCheckoutResult;
|
|
70
|
+
/**
|
|
71
|
+
* Presentational props shared by the redirect buttons. Kept to a curated set
|
|
72
|
+
* (rather than spreading arbitrary button attributes) so the component stays
|
|
73
|
+
* within the repo's `react/jsx-props-no-spreading` rule while covering the
|
|
74
|
+
* common styling / accessibility hooks.
|
|
75
|
+
*/
|
|
76
|
+
interface RedirectButtonOwnProps {
|
|
77
|
+
/** Accessible label when the visible `children` are icon-only. */
|
|
78
|
+
"aria-label"?: string;
|
|
79
|
+
children?: ReactNode;
|
|
80
|
+
className?: string;
|
|
81
|
+
/** Force-disable the control regardless of pending state. */
|
|
82
|
+
disabled?: boolean;
|
|
83
|
+
/** Called with the failure when the trigger rejects. The error is also surfaced via `useCheckout`. */
|
|
84
|
+
onError?: (error: Error) => void;
|
|
85
|
+
title?: string;
|
|
86
|
+
}
|
|
87
|
+
interface CheckoutButtonProps extends RedirectButtonOwnProps {
|
|
88
|
+
/** Calls the app's checkout action and resolves the hosted-checkout `{ url }`. */
|
|
89
|
+
onCheckout: RedirectTrigger;
|
|
90
|
+
}
|
|
91
|
+
interface CustomerPortalButtonProps extends RedirectButtonOwnProps {
|
|
92
|
+
/** Calls the app's portal action and resolves the customer-portal `{ url }`. */
|
|
93
|
+
onPortal: RedirectTrigger;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Button that starts a hosted checkout. On click it awaits `onCheckout` (a thunk
|
|
97
|
+
* that calls the app's checkout action) and redirects to the returned URL,
|
|
98
|
+
* disabling itself while the request is in flight.
|
|
99
|
+
*/
|
|
100
|
+
declare const CheckoutButton: ({ onCheckout, ...rest }: CheckoutButtonProps) => ReactNode;
|
|
101
|
+
/**
|
|
102
|
+
* Button that opens the provider's customer portal. On click it awaits
|
|
103
|
+
* `onPortal` (a thunk that calls the app's portal action) and redirects to the
|
|
104
|
+
* returned URL, disabling itself while the request is in flight.
|
|
105
|
+
*/
|
|
106
|
+
declare const CustomerPortalButton: ({ onPortal, ...rest }: CustomerPortalButtonProps) => ReactNode;
|
|
107
|
+
export { CheckoutButton, type CheckoutButtonProps, CustomerPortalButton, type CustomerPortalButtonProps, type ProviderId, type RedirectTarget, type RedirectTrigger, type Subscription, type UseCheckoutResult, useCheckout };
|
package/dist/payment.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import{c as p}from"react/compiler-runtime";import{useState as k,useCallback as C}from"react";import{jsx as m}from"react/jsx-runtime";const y=n=>{const t=new URL(n,globalThis.location.href);if(t.protocol!=="https:"&&t.protocol!=="http:")throw new Error(`refusing to redirect to a non-http(s) URL: ${t.protocol}`);return t.href},L=n=>{const[t,e]=k(!1),[o,a]=k(void 0);return{checkout:C(async()=>{e(!0),a(void 0);try{const r=await n();globalThis.location.assign(y(r.url))}catch(r){const l=r instanceof Error?r:new Error(String(r));throw a(l),l}finally{e(!1)}},[n]),error:o,pending:t}},E=n=>{const t=p(11),{"aria-label":e,children:o,className:a,disabled:c,onError:r,title:l,trigger:u}=n,{checkout:i,pending:s}=L(u);let d;t[0]!==i||t[1]!==r?(d=()=>{i().catch(g=>{const w=g instanceof Error?g:new Error(String(g));r?.(w)})},t[0]=i,t[1]=r,t[2]=d):d=t[2];const f=d,b=c===!0||s;let h;return t[3]!==e||t[4]!==o||t[5]!==a||t[6]!==f||t[7]!==s||t[8]!==b||t[9]!==l?(h=m("button",{"aria-busy":s,"aria-label":e,className:a,disabled:b,onClick:f,title:l,type:"button",children:o}),t[3]=e,t[4]=o,t[5]=a,t[6]=f,t[7]=s,t[8]=b,t[9]=l,t[10]=h):h=t[10],h},N=n=>{const t=p(11);let e,o;t[0]!==n?({onCheckout:e,...o}=n,t[0]=n,t[1]=e,t[2]=o):(e=t[1],o=t[2]);const{"aria-label":a,children:c,className:r,disabled:l,onError:u,title:i}=o;let s;return t[3]!==a||t[4]!==c||t[5]!==r||t[6]!==l||t[7]!==e||t[8]!==u||t[9]!==i?(s=m(E,{"aria-label":a,className:r,disabled:l,onError:u,title:i,trigger:e,children:c}),t[3]=a,t[4]=c,t[5]=r,t[6]=l,t[7]=e,t[8]=u,t[9]=i,t[10]=s):s=t[10],s},P=n=>{const t=p(11);let e,o;t[0]!==n?({onPortal:e,...o}=n,t[0]=n,t[1]=e,t[2]=o):(e=t[1],o=t[2]);const{"aria-label":a,children:c,className:r,disabled:l,onError:u,title:i}=o;let s;return t[3]!==a||t[4]!==c||t[5]!==r||t[6]!==l||t[7]!==u||t[8]!==e||t[9]!==i?(s=m(E,{"aria-label":a,className:r,disabled:l,onError:u,title:i,trigger:e,children:c}),t[3]=a,t[4]=c,t[5]=r,t[6]=l,t[7]=u,t[8]=e,t[9]=i,t[10]=s):s=t[10],s};export{N as CheckoutButton,P as CustomerPortalButton,L as useCheckout};
|