atom.io 0.33.16 → 0.33.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","next: New | ((old: J) => New)","old: J","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/on-mount.ts","../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAEgB,OAAA;;;KCGJ,kBAAA;UACH;YACE;;cAMEC,iBAAiB,KAAA,CAAM,QAAQ;cAM/BC,kBAAkB,KAAA,CAAM;EDjBrC,QAAgB,ECkBL,KAAA,CAAM,SDlBD;UCmBP;;;;iBCbO,sBAAsB,IAAA,CAAK,qBACnC,MAAA,CAAO,iBAAiB,KAC7B;;;iBCDa,kCACL,IAAA,CAAK,wBACL,uBACE,WACH,MAAA,CAAO,uBAAuB,GAAG,YAAY,MAAM;;;iBCJ7C,yBACL,4BACA,IAAA,CAAK,qBACP,MAAA,CAAO,iBAAiB,GAAG,KAAK;;;iBCFzB,yCACL,4BACA,IAAA,CAAK,wBACL,uBACE,ELZb,CAAA,WAAgB,EKaD,MAAA,CAAO,sBLbN,CKa6B,CLb7B,EKagC,CLbhC,EKamC,CLbnC,CAAA,EAAA,GAAA,EKa4C,GLb5C,CAAA,EKakD,CLblD;;;iBMMA,0BAA0B,IAAA,CAAK,qBACvC,MAAA,CAAO,cAAc,KAC1B;;;iBCDa,yCAEL,uBACE,gBACE,MAAA,CAAO,oBAAoB,GAAG,SAAS,MAAM;;;iBCL5C,kBAAkB,IAAA,CAAK,qBAC/B,MAAA,CAAO,cAAc,kBACb,SAAS,aAAa,MAAM;;;iBCD5B,0BAA0B,aAClC,MAAA,CAAO,iBAAiB,qBACb,WAAW,OAAO,WAAW;;;iBCJhC,iBAAA,QAAyB"}
1
+ {"version":3,"file":"index.d.ts","names":["effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","next: New | ((old: J) => New)","old: J","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/on-mount.ts","../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAEgB,OAAA;;;KCGJ,kBAAA;UACH;YACE;;cAMEC,iBAAiB,OAAA,CAAM,QAAQ;cAM/BC,kBAAkB,OAAA,CAAM;EDjBrC,QAAgB,ECkBL,OAAA,CAAM,SDlBD;UCmBP;;;;iBCbO,sBAAsB,IAAA,CAAK,qBACnC,MAAA,CAAO,iBAAiB,KAC7B;;;iBCDa,kCACL,IAAA,CAAK,wBACL,uBACE,WACH,MAAA,CAAO,uBAAuB,GAAG,YAAY,MAAM;;;iBCJ7C,yBACL,4BACA,IAAA,CAAK,qBACP,MAAA,CAAO,iBAAiB,GAAG,KAAK;;;iBCFzB,yCACL,4BACA,IAAA,CAAK,wBACL,uBACE,ELZb,CAAA,WAAgB,EKaD,MAAA,CAAO,sBLbN,CKa6B,CLb7B,EKagC,CLbhC,EKamC,CLbnC,CAAA,EAAA,GAAA,EKa4C,GLb5C,CAAA,EKakD,CLblD;;;iBMMA,0BAA0B,IAAA,CAAK,qBACvC,MAAA,CAAO,cAAc,KAC1B;;;iBCDa,yCAEL,uBACE,gBACE,MAAA,CAAO,oBAAoB,GAAG,SAAS,MAAM;;;iBCL5C,kBAAkB,IAAA,CAAK,qBAC/B,MAAA,CAAO,cAAc,kBACb,SAAS,aAAa,MAAM;;;iBCD5B,0BAA0B,aAClC,MAAA,CAAO,iBAAiB,qBACb,WAAW,OAAO,WAAW;;;iBCJhC,iBAAA,QAAyB"}
@@ -1,5 +1,5 @@
1
1
  import { actUponStore, arbitrary, findInStore } from "atom.io/internal";
2
- import * as React from "react";
2
+ import * as React$1 from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { StoreContext, useI, useO } from "atom.io/react";
5
5
  import * as RTC from "atom.io/realtime-client";
@@ -11,8 +11,8 @@ const IN_DEV = NODE_ENV === `development`;
11
11
  function noop() {}
12
12
  function useSingleEffect(effect, deps) {
13
13
  if (IN_DEV) {
14
- const cleanup = React.useRef(noop);
15
- React.useEffect(() => {
14
+ const cleanup = React$1.useRef(noop);
15
+ React$1.useEffect(() => {
16
16
  let dispose = cleanup.current;
17
17
  if (dispose === noop) {
18
18
  dispose = effect() ?? noop;
@@ -22,7 +22,7 @@ function useSingleEffect(effect, deps) {
22
22
  cleanup.current = noop;
23
23
  };
24
24
  }, deps);
25
- } else React.useEffect(effect, deps);
25
+ } else React$1.useEffect(effect, deps);
26
26
  }
27
27
 
28
28
  //#endregion
@@ -33,14 +33,14 @@ function onMount(effect) {
33
33
 
34
34
  //#endregion
35
35
  //#region src/realtime-react/realtime-context.tsx
36
- const RealtimeContext = React.createContext({
36
+ const RealtimeContext = React$1.createContext({
37
37
  socket: null,
38
38
  services: null
39
39
  });
40
40
  const RealtimeProvider = ({ children, socket }) => {
41
- const services = React.useRef(/* @__PURE__ */ new Map()).current;
41
+ const services = React$1.useRef(/* @__PURE__ */ new Map()).current;
42
42
  const setMyId = useI(RTC.myIdState__INTERNAL);
43
- React.useEffect(() => {
43
+ React$1.useEffect(() => {
44
44
  setMyId(socket?.id);
45
45
  socket?.on(`connect`, () => {
46
46
  setMyId(socket.id);
@@ -61,7 +61,7 @@ const RealtimeProvider = ({ children, socket }) => {
61
61
  //#endregion
62
62
  //#region src/realtime-react/use-realtime-service.ts
63
63
  function useRealtimeService(key, create) {
64
- const { socket, services } = React.useContext(RealtimeContext);
64
+ const { socket, services } = React$1.useContext(RealtimeContext);
65
65
  onMount(() => {
66
66
  let service = services?.get(key);
67
67
  if (service) service[0]++;
@@ -85,7 +85,7 @@ function useRealtimeService(key, create) {
85
85
  //#endregion
86
86
  //#region src/realtime-react/use-pull-atom.ts
87
87
  function usePullAtom(token) {
88
- const store = React.useContext(StoreContext);
88
+ const store = React$1.useContext(StoreContext);
89
89
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullAtom(store, socket, token));
90
90
  return useO(token);
91
91
  }
@@ -93,7 +93,7 @@ function usePullAtom(token) {
93
93
  //#endregion
94
94
  //#region src/realtime-react/use-pull-atom-family-member.ts
95
95
  function usePullAtomFamilyMember(family, subKey) {
96
- const store = React.useContext(StoreContext);
96
+ const store = React$1.useContext(StoreContext);
97
97
  const token = findInStore(store, family, subKey);
98
98
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullAtomFamilyMember(store, socket, token));
99
99
  return useO(token);
@@ -102,7 +102,7 @@ function usePullAtomFamilyMember(family, subKey) {
102
102
  //#endregion
103
103
  //#region src/realtime-react/use-pull-mutable-atom.ts
104
104
  function usePullMutable(token) {
105
- const store = React.useContext(StoreContext);
105
+ const store = React$1.useContext(StoreContext);
106
106
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullMutableAtom(store, socket, token));
107
107
  return useO(token);
108
108
  }
@@ -110,7 +110,7 @@ function usePullMutable(token) {
110
110
  //#endregion
111
111
  //#region src/realtime-react/use-pull-mutable-family-member.ts
112
112
  function usePullMutableAtomFamilyMember(familyToken, key) {
113
- const store = React.useContext(StoreContext);
113
+ const store = React$1.useContext(StoreContext);
114
114
  const token = findInStore(store, familyToken, key);
115
115
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullMutableAtomFamilyMember(store, socket, token));
116
116
  return useO(token);
@@ -119,7 +119,7 @@ function usePullMutableAtomFamilyMember(familyToken, key) {
119
119
  //#endregion
120
120
  //#region src/realtime-react/use-pull-selector.ts
121
121
  function usePullSelector(token) {
122
- const store = React.useContext(StoreContext);
122
+ const store = React$1.useContext(StoreContext);
123
123
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullSelector(store, socket, token));
124
124
  return useO(token);
125
125
  }
@@ -127,7 +127,7 @@ function usePullSelector(token) {
127
127
  //#endregion
128
128
  //#region src/realtime-react/use-pull-selector-family-member.ts
129
129
  function usePullSelectorFamilyMember(familyToken, key) {
130
- const store = React.useContext(StoreContext);
130
+ const store = React$1.useContext(StoreContext);
131
131
  const token = findInStore(store, familyToken, key);
132
132
  useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullSelectorFamilyMember(store, socket, token));
133
133
  return useO(token);
@@ -136,7 +136,7 @@ function usePullSelectorFamilyMember(familyToken, key) {
136
136
  //#endregion
137
137
  //#region src/realtime-react/use-push.ts
138
138
  function usePush(token) {
139
- const store = React.useContext(StoreContext);
139
+ const store = React$1.useContext(StoreContext);
140
140
  useRealtimeService(`push:${token.key}`, (socket) => RTC.pushState(store, socket, token));
141
141
  return useI(token);
142
142
  }
@@ -144,7 +144,7 @@ function usePush(token) {
144
144
  //#endregion
145
145
  //#region src/realtime-react/use-server-action.ts
146
146
  function useServerAction(token) {
147
- const store = React.useContext(StoreContext);
147
+ const store = React$1.useContext(StoreContext);
148
148
  useRealtimeService(`tx:${token.key}`, (socket) => RTC.serverAction(store, socket, token));
149
149
  return actUponStore(store, token, arbitrary());
150
150
  }
@@ -152,7 +152,7 @@ function useServerAction(token) {
152
152
  //#endregion
153
153
  //#region src/realtime-react/use-sync-continuity.ts
154
154
  function useSyncContinuity(token) {
155
- const store = React.useContext(StoreContext);
155
+ const store = React$1.useContext(StoreContext);
156
156
  useRealtimeService(`tx-sync:${token.key}`, (socket) => {
157
157
  return syncContinuity(store, socket, token);
158
158
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["effect: () => (() => void) | undefined | void","deps: unknown[]","effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","key: string","create: (socket: Socket) => (() => void) | undefined","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/on-mount.ts","../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-realtime-service.ts","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["/** biome-ignore-all lint/correctness/useHookAtTopLevel: intentional */\n\nimport * as React from \"react\"\n\n// @ts-expect-error this is a safe way to check a property on the global object\nconst { NODE_ENV } = globalThis[`env`] ?? {}\nconst IN_DEV = NODE_ENV === `development`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined | void): void {\n\tuseSingleEffect(effect, [])\n}\n","import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext: React.Context<RealtimeReactStore> =\n\tReact.createContext({\n\t\tsocket: null,\n\t\tservices: null,\n\t})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, family, subKey)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<\n\tT,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(store, socket, token),\n\t)\n\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Func } from \"atom.io/internal\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<F extends Func>(\n\ttoken: AtomIO.TransactionToken<F>,\n): (...parameters: Parameters<F>) => ReturnType<F> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(store, socket, token),\n\t)\n\treturn actUponStore(store, token, arbitrary())\n}\n","import { StoreContext } from \"atom.io/react\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport { syncContinuity } from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(store, socket, token)\n\t})\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["effect: () => (() => void) | undefined | void","deps: unknown[]","React","effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","React","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","key: string","create: (socket: Socket) => (() => void) | undefined","React","token: AtomIO.RegularAtomToken<J>","React","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","React","token: AtomIO.MutableAtomToken<T, J>","React","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","React","token: AtomIO.SelectorToken<J>","React","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","React","token: AtomIO.WritableToken<J>","React","token: AtomIO.TransactionToken<F>","React","token: ContinuityToken","React"],"sources":["../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/on-mount.ts","../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-realtime-service.ts","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["/** biome-ignore-all lint/correctness/useHookAtTopLevel: intentional */\n\nimport * as React from \"react\"\n\n// @ts-expect-error this is a safe way to check a property on the global object\nconst { NODE_ENV } = globalThis[`env`] ?? {}\nconst IN_DEV = NODE_ENV === `development`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined | void): void {\n\tuseSingleEffect(effect, [])\n}\n","import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext: React.Context<RealtimeReactStore> =\n\tReact.createContext({\n\t\tsocket: null,\n\t\tservices: null,\n\t})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, family, subKey)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<\n\tT,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(store, socket, token),\n\t)\n\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Func } from \"atom.io/internal\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<F extends Func>(\n\ttoken: AtomIO.TransactionToken<F>,\n): (...parameters: Parameters<F>) => ReturnType<F> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(store, socket, token),\n\t)\n\treturn actUponStore(store, token, arbitrary())\n}\n","import { StoreContext } from \"atom.io/react\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport { syncContinuity } from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(store, socket, token)\n\t})\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as AtomIO from "atom.io";
2
- import * as React from "react";
2
+ import * as React$1 from "react";
3
3
  import { RenderResult } from "@testing-library/react";
4
4
  import * as SocketIO from "socket.io";
5
5
  import { Socket } from "socket.io-client";
@@ -17,10 +17,10 @@ type TestSetupOptions = {
17
17
  }) => void;
18
18
  };
19
19
  type TestSetupOptions__SingleClient = TestSetupOptions & {
20
- client: React.FC;
20
+ client: React$1.FC;
21
21
  };
22
22
  type TestSetupOptions__MultiClient<ClientNames extends string> = TestSetupOptions & {
23
- clients: { [K in ClientNames]: React.FC };
23
+ clients: { [K in ClientNames]: React$1.FC };
24
24
  };
25
25
  type RealtimeTestTools = {
26
26
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["tools: {\n\t\tsocket: SocketIO.Socket\n\t\tsilo: AtomIO.Silo\n\t\tenableLogging: () => void\n\t}","options: TestSetupOptions","options: TestSetupOptions__SingleClient","name: string","port: number","options: TestSetupOptions__MultiClient<ClientNames>"],"sources":["../../src/realtime-testing/setup-realtime-test.tsx"],"sourcesContent":[],"mappings":";;;;;;;KA6CY,gBAAA;;EAAZ,QAAY,CAAA,EAAA;IAAA,MAAA,CAAA,EAAA,OAAA;EAAA,CAAA;EAIO,MACX,EAAA,CAAA,KAAO,EAAA;IAAA,MAAA,EADL,QAAA,CAAS,MACJ;IAIf,IAAY,EAJJ,MAAA,CAAO,IAIH;IAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAAA,CAAA,EAAA,GAAiC,IAAA;CAAA;AAC9B,KADH,8BAAA,GAAiC,gBAC9B,GAAA;EAEf,MAAY,EAFH,KAAA,CAAM,EAEH;CAAA;AACX,KADW,6BACX,CAAA,oBAAA,MAAA,CAAA,GAAA,gBAAA,GAAA;EAAA,OAEQ,EAAA,QAAA,WAAA,GAAc,KAAA,CAAM,EAApB,EAAA;CAAA;AAAoB,KAIjB,iBAAA,GAJiB;EAI7B,IAAY,EAAA,MAAA;EAIZ,IAAY,EAFL,MAAA,CAAO,IAEF;CAAA;AAAqB,KAArB,kBAAA,GAAqB,iBAAA,GAAA;EAAA,YAClB,EAAA,YAAA;EAAA,WAGN,EAAA,GAAA,GAAA,IAAA;EAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAET,MAAY,EAFH,MAEG;AAKZ,CAAA;AAAY,KALA,yBAAA,GAKA;EAAA,OAAqB,EAAA,GAAA,GAAA,IAAA;EAAA,IAAA,EACjB,GAAA,GAJH,kBAIG;AAAA,CAAA;AAIJ,KALA,kBAAA,GAAqB,iBAKrB,GAAA;EAAA,OAAA,EAAA,GAAA,GAJI,OAIJ,CAAA,IAAA,CAAA;EAAA,IAAA,EACH,MAAA;CAAA;AACQ,KAFL,eAAA,GAEK;EAEjB,MAAY,EAHH,kBAGG;EAAA,QAAA,EAAA,GAAA,GAFK,OAEL,CAAA,IAAA,CAAA;CAAA;AACH,KADG,6BAAA,GAAgC,eACnC,GAAA;EAAA,MAAA,EAAA,yBAAA;AAET,CAAA;AAAY,KAAA,4BAAA,CAAA,oBAAA,MAAA,CAAA,GACX,eADW,GAAA;EAAA,OACX,EACU,MADV,CACiB,WADjB,EAC8B,yBAD9B,CAAA;CAAA;AAC8B,cAGlB,uBAHkB,EAAA,CAAA,OAAA,EAIrB,gBAJqB,EAAA,GAK5B,kBAL4B;AAApB,cA0FE,uBA1FF,EAAA,CAAA,OAAA,EA2FD,8BA3FC,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GA8FR,yBA9FQ;AAAA,cA0JE,YA1JF,EAAA,CAAA,OAAA,EA2JD,8BA3JC,EAAA,GA4JR,6BA5JQ;AAGE,cAuKA,WArKV,EAAA,CAAA,oBAAA,MAAA,CAAA,CAAA,OAAA,EAsKO,6BAtKP,CAsKqC,WAtKrC,CAAA,EAAA,GAuKA,4BAvKA,CAuK6B,WAvK7B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":["tools: {\n\t\tsocket: SocketIO.Socket\n\t\tsilo: AtomIO.Silo\n\t\tenableLogging: () => void\n\t}","options: TestSetupOptions","options: TestSetupOptions__SingleClient","name: string","port: number","options: TestSetupOptions__MultiClient<ClientNames>"],"sources":["../../src/realtime-testing/setup-realtime-test.tsx"],"sourcesContent":[],"mappings":";;;;;;;KA6CY,gBAAA;;EAAZ,QAAY,CAAA,EAAA;IAAA,MAAA,CAAA,EAAA,OAAA;EAAA,CAAA;EAIO,MACX,EAAA,CAAA,KAAO,EAAA;IAAA,MAAA,EADL,QAAA,CAAS,MACJ;IAIf,IAAY,EAJJ,MAAA,CAAO,IAIH;IAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAAA,CAAA,EAAA,GAAiC,IAAA;CAAA;AAC9B,KADH,8BAAA,GAAiC,gBAC9B,GAAA;EAEf,MAAY,EAFH,OAAA,CAAM,EAEH;CAAA;AACX,KADW,6BACX,CAAA,oBAAA,MAAA,CAAA,GAAA,gBAAA,GAAA;EAAA,OAEQ,EAAA,QAAA,WAAA,GAAc,OAAA,CAAM,EAApB,EAAA;CAAA;AAAoB,KAIjB,iBAAA,GAJiB;EAI7B,IAAY,EAAA,MAAA;EAIZ,IAAY,EAFL,MAAA,CAAO,IAEF;CAAA;AAAqB,KAArB,kBAAA,GAAqB,iBAAA,GAAA;EAAA,YAClB,EAAA,YAAA;EAAA,WAGN,EAAA,GAAA,GAAA,IAAA;EAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAET,MAAY,EAFH,MAEG;AAKZ,CAAA;AAAY,KALA,yBAAA,GAKA;EAAA,OAAqB,EAAA,GAAA,GAAA,IAAA;EAAA,IAAA,EACjB,GAAA,GAJH,kBAIG;AAAA,CAAA;AAIJ,KALA,kBAAA,GAAqB,iBAKrB,GAAA;EAAA,OAAA,EAAA,GAAA,GAJI,OAIJ,CAAA,IAAA,CAAA;EAAA,IAAA,EACH,MAAA;CAAA;AACQ,KAFL,eAAA,GAEK;EAEjB,MAAY,EAHH,kBAGG;EAAA,QAAA,EAAA,GAAA,GAFK,OAEL,CAAA,IAAA,CAAA;CAAA;AACH,KADG,6BAAA,GAAgC,eACnC,GAAA;EAAA,MAAA,EAAA,yBAAA;AAET,CAAA;AAAY,KAAA,4BAAA,CAAA,oBAAA,MAAA,CAAA,GACX,eADW,GAAA;EAAA,OACX,EACU,MADV,CACiB,WADjB,EAC8B,yBAD9B,CAAA;CAAA;AAC8B,cAGlB,uBAHkB,EAAA,CAAA,OAAA,EAIrB,gBAJqB,EAAA,GAK5B,kBAL4B;AAApB,cA0FE,uBA1FF,EAAA,CAAA,OAAA,EA2FD,8BA3FC,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GA8FR,yBA9FQ;AAAA,cA0JE,YA1JF,EAAA,CAAA,OAAA,EA2JD,8BA3JC,EAAA,GA4JR,6BA5JQ;AAGE,cAuKA,WArKV,EAAA,CAAA,oBAAA,MAAA,CAAA,CAAA,OAAA,EAsKO,6BAtKP,CAsKqC,WAtKrC,CAAA,EAAA,GAuKA,4BAvKA,CAuK6B,WAvK7B,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { IMPLICIT, findInStore, getFromStore, setIntoStore, subscribeToState } from "atom.io/internal";
2
- import * as React from "react";
2
+ import * as React$1 from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
 
5
5
  //#region src/react/store-context.tsx
6
- const StoreContext = React.createContext(IMPLICIT.STORE);
6
+ const StoreContext = React$1.createContext(IMPLICIT.STORE);
7
7
  const StoreProvider = ({ children, store = IMPLICIT.STORE }) => /* @__PURE__ */ jsx(StoreContext.Provider, {
8
8
  value: store,
9
9
  children
@@ -24,9 +24,9 @@ function parseStateOverloads(store, ...rest) {
24
24
  //#endregion
25
25
  //#region src/react/use-i.ts
26
26
  function useI(...params) {
27
- const store = React.useContext(StoreContext);
27
+ const store = React$1.useContext(StoreContext);
28
28
  const token = parseStateOverloads(store, ...params);
29
- const setter = React.useRef(null);
29
+ const setter = React$1.useRef(null);
30
30
  setter.current ??= (next) => {
31
31
  setIntoStore(store, token, next);
32
32
  };
@@ -36,12 +36,12 @@ function useI(...params) {
36
36
  //#endregion
37
37
  //#region src/react/use-o.ts
38
38
  function useO(...params) {
39
- const store = React.useContext(StoreContext);
39
+ const store = React$1.useContext(StoreContext);
40
40
  const token = parseStateOverloads(store, ...params);
41
- const id = React.useId();
42
- return React.useSyncExternalStore((dispatch) => subscribeToState(store, token, `use-o:${id}`, dispatch), () => getFromStore(store, token), () => getFromStore(store, token));
41
+ const id = React$1.useId();
42
+ return React$1.useSyncExternalStore((dispatch) => subscribeToState(store, token, `use-o:${id}`, dispatch), () => getFromStore(store, token), () => getFromStore(store, token));
43
43
  }
44
44
 
45
45
  //#endregion
46
46
  export { StoreContext, StoreProvider, useI, useO };
47
- //# sourceMappingURL=use-o-BrXc7Qro.js.map
47
+ //# sourceMappingURL=use-o-DXPncKmZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-o-DXPncKmZ.js","names":["StoreContext: React.Context<Store>","React","StoreProvider: React.FC<{\n\tchildren: React.ReactNode\n\tstore?: Store\n}>","store: Store","token: ReadableToken<any>","React","setter: React.RefObject<\n\t\t(<New extends T>(next: New | ((old: T) => New)) => void) | null\n\t>","React"],"sources":["../src/react/store-context.tsx","../src/react/parse-state-overloads.ts","../src/react/use-i.ts","../src/react/use-o.ts"],"sourcesContent":["import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nexport const StoreContext: React.Context<Store> = React.createContext(\n\tIMPLICIT.STORE,\n)\n\nexport const StoreProvider: React.FC<{\n\tchildren: React.ReactNode\n\tstore?: Store\n}> = ({ children, store = IMPLICIT.STORE }) => (\n\t<StoreContext.Provider value={store}>{children}</StoreContext.Provider>\n)\n","import type {\n\tReadableFamilyToken,\n\tReadableToken,\n\tWritableFamilyToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport function parseStateOverloads<T, K extends Canonical>(\n\tstore: Store,\n\t...rest: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]\n): WritableToken<T>\n\nexport function parseStateOverloads<T, K extends Canonical>(\n\tstore: Store,\n\t...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]\n): ReadableToken<T>\n\nexport function parseStateOverloads<T, K extends Canonical>(\n\tstore: Store,\n\t...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]\n): ReadableToken<T> {\n\tlet token: ReadableToken<any>\n\tif (rest.length === 2) {\n\t\tconst family = rest[0]\n\t\tconst key = rest[1]\n\n\t\ttoken = findInStore(store, family, key)\n\t} else {\n\t\ttoken = rest[0]\n\t}\n\treturn token\n}\n","import type { WritableFamilyToken, WritableToken } from \"atom.io\"\nimport { setIntoStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport * as React from \"react\"\n\nimport { parseStateOverloads } from \"./parse-state-overloads\"\nimport { StoreContext } from \"./store-context\"\n\nexport function useI<T>(\n\ttoken: WritableToken<T>,\n): <New extends T>(next: New | ((old: T) => New)) => void\n\nexport function useI<T, K extends Canonical>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: K,\n): <New extends T>(next: New | ((old: T) => New)) => void\n\nexport function useI<T, K extends Canonical>(\n\t...params: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]\n): <New extends T>(next: New | ((old: T) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tconst token = parseStateOverloads(store, ...params)\n\tconst setter: React.RefObject<\n\t\t(<New extends T>(next: New | ((old: T) => New)) => void) | null\n\t> = React.useRef(null)\n\tsetter.current ??= (next) => {\n\t\tsetIntoStore(store, token, next)\n\t}\n\treturn setter.current\n}\n","import type { ReadableFamilyToken, ReadableToken } from \"atom.io\"\nimport { getFromStore, subscribeToState } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport * as React from \"react\"\n\nimport { parseStateOverloads } from \"./parse-state-overloads\"\nimport { StoreContext } from \"./store-context\"\n\nexport function useO<T>(token: ReadableToken<T>): T\n\nexport function useO<T, K extends Canonical>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: K,\n): T\n\nexport function useO<T, K extends Canonical>(\n\t...params: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]\n): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = parseStateOverloads(store, ...params)\n\tconst id = React.useId()\n\treturn React.useSyncExternalStore<T>(\n\t\t(dispatch) => subscribeToState(store, token, `use-o:${id}`, dispatch),\n\t\t() => getFromStore(store, token),\n\t\t() => getFromStore(store, token),\n\t)\n}\n"],"mappings":";;;;;AAIA,MAAaA,eAAqCC,QAAM,cACvD,SAAS,MACT;AAED,MAAaC,gBAGR,CAAC,EAAE,UAAU,QAAQ,SAAS,OAAO,yBACxC,aAAa;CAAS,OAAO;CAAQ;EAAiC;;;;ACQxE,SAAgB,oBACfC,OACA,GAAG,MACgB;CACnB,IAAIC;AACJ,KAAI,KAAK,WAAW,GAAG;EACtB,MAAM,SAAS,KAAK;EACpB,MAAM,MAAM,KAAK;EAEjB,QAAQ,YAAY,OAAO,QAAQ,IAAI;CACvC,OACA,QAAQ,KAAK;AAEd,QAAO;AACP;;;;ACjBD,SAAgB,KACf,GAAG,QACsD;CACzD,MAAM,QAAQC,QAAM,WAAW,aAAa;CAC5C,MAAM,QAAQ,oBAAoB,OAAO,GAAG,OAAO;CACnD,MAAMC,SAEFD,QAAM,OAAO,KAAK;CACtB,OAAO,YAAY,CAAC,SAAS;EAC5B,aAAa,OAAO,OAAO,KAAK;CAChC;AACD,QAAO,OAAO;AACd;;;;ACdD,SAAgB,KACf,GAAG,QACC;CACJ,MAAM,QAAQE,QAAM,WAAW,aAAa;CAC5C,MAAM,QAAQ,oBAAoB,OAAO,GAAG,OAAO;CACnD,MAAM,KAAKA,QAAM,OAAO;AACxB,QAAOA,QAAM,qBACZ,CAAC,aAAa,iBAAiB,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EACrE,MAAM,aAAa,OAAO,MAAM,EAChC,MAAM,aAAa,OAAO,MAAM,CAChC;AACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.33.16",
3
+ "version": "0.33.18",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -83,13 +83,13 @@
83
83
  "eslint": "9.32.0",
84
84
  "happy-dom": "18.0.1",
85
85
  "http-proxy": "1.18.1",
86
- "motion": "12.23.9",
86
+ "motion": "12.23.11",
87
87
  "npmlog": "7.0.1",
88
88
  "nyc": "17.1.0",
89
89
  "postgres": "3.4.7",
90
- "preact": "10.26.9",
91
- "react": "19.1.0",
92
- "react-dom": "19.1.0",
90
+ "preact": "10.27.0",
91
+ "react": "19.1.1",
92
+ "react-dom": "19.1.1",
93
93
  "react-router-dom": "7.7.1",
94
94
  "recoverage": "0.1.11",
95
95
  "socket.io": "4.8.1",
@@ -1,5 +1,6 @@
1
1
  export * from "./store-context"
2
2
  export * from "./use-i"
3
3
  export * from "./use-json"
4
+ export * from "./use-loadable"
4
5
  export * from "./use-o"
5
6
  export * from "./use-tl"
@@ -0,0 +1,79 @@
1
+ /** biome-ignore-all lint/correctness/useHookAtTopLevel: params are used in an invariant way */
2
+ import type { Loadable, ReadableFamilyToken, ReadableToken } from "atom.io"
3
+ import type { Canonical } from "atom.io/json"
4
+ import { useO } from "atom.io/react"
5
+ import React from "react"
6
+
7
+ export function useLoadable<T>(
8
+ token: ReadableToken<Loadable<T>>,
9
+ ): `LOADING` | { loading: boolean; value: T }
10
+
11
+ export function useLoadable<T, K extends Canonical>(
12
+ token: ReadableFamilyToken<Loadable<T>, K>,
13
+ key: K,
14
+ ): `LOADING` | { loading: boolean; value: T }
15
+
16
+ export function useLoadable<T, F extends T>(
17
+ token: ReadableToken<Loadable<T>>,
18
+ fallback: F,
19
+ ): { loading: boolean; value: T }
20
+
21
+ export function useLoadable<T, K extends Canonical, F extends T>(
22
+ token: ReadableFamilyToken<Loadable<T>, K>,
23
+ key: K,
24
+ fallback: F,
25
+ ): { loading: boolean; value: T }
26
+
27
+ export function useLoadable(
28
+ ...params:
29
+ | readonly [ReadableFamilyToken<any, Canonical>, Canonical, unknown]
30
+ | readonly [ReadableFamilyToken<any, Canonical>, Canonical]
31
+ | readonly [ReadableToken<any>, unknown]
32
+ | readonly [ReadableToken<any>]
33
+ ): `LOADING` | { loading: boolean; value: unknown } {
34
+ let loadable: ReadableToken<any>
35
+ let fallback: unknown
36
+
37
+ const [token] = params
38
+ let key: Canonical
39
+ switch (token.type) {
40
+ case `atom`:
41
+ case `mutable_atom`:
42
+ case `readonly_held_selector`:
43
+ case `readonly_pure_selector`:
44
+ case `writable_held_selector`:
45
+ case `writable_pure_selector`:
46
+ loadable = useO(token)
47
+ fallback = params[1]
48
+ break
49
+ case `atom_family`:
50
+ case `mutable_atom_family`:
51
+ case `readonly_held_selector_family`:
52
+ case `readonly_pure_selector_family`:
53
+ case `writable_held_selector_family`:
54
+ case `writable_pure_selector_family`:
55
+ key = params[1] as Canonical
56
+ loadable = useO(token, key)
57
+ fallback = params[2]
58
+ }
59
+
60
+ const lastLoadedRef = React.useRef(
61
+ fallback ?? (loadable instanceof Promise ? `LOADING` : loadable),
62
+ )
63
+ const { current: lastLoaded } = lastLoadedRef
64
+ if (loadable instanceof Promise) {
65
+ if (lastLoaded === `LOADING`) {
66
+ return `LOADING`
67
+ }
68
+ return {
69
+ loading: true,
70
+ value: lastLoaded,
71
+ }
72
+ }
73
+
74
+ lastLoadedRef.current = loadable
75
+ return {
76
+ loading: false,
77
+ value: loadable,
78
+ }
79
+ }
@@ -9,10 +9,12 @@ import { attachDevtoolsStates, DevtoolsContext } from "./store"
9
9
  import { TimelineIndex } from "./TimelineIndex"
10
10
  import { TransactionIndex } from "./TransactionIndex"
11
11
 
12
- export const AtomIODevtools: React.FC = () => {
12
+ export const AtomIODevtools: React.FC<{ hideByDefault?: boolean }> = ({
13
+ hideByDefault = false,
14
+ }) => {
13
15
  const store = useContext(StoreContext)
14
16
  return (
15
- <DevtoolsContext.Provider value={attachDevtoolsStates(store)}>
17
+ <DevtoolsContext.Provider value={attachDevtoolsStates(store, hideByDefault)}>
16
18
  <AtomIODevtoolsInternal />
17
19
  </DevtoolsContext.Provider>
18
20
  )
@@ -24,16 +26,19 @@ const AtomIODevtoolsInternal = (): React.ReactNode => {
24
26
  const {
25
27
  atomIndex,
26
28
  selectorIndex,
27
- devtoolsAreOpenState,
28
- devtoolsViewSelectionState,
29
- devtoolsViewOptionsState,
29
+ devtoolsAreHiddenAtom,
30
+ devtoolsAreOpenAtom,
31
+ devtoolsViewSelectionAtom,
32
+ devtoolsViewOptionsAtom,
30
33
  } = useContext(DevtoolsContext)
31
34
 
32
- const setDevtoolsAreOpen = useI(devtoolsAreOpenState)
33
- const devtoolsAreOpen = useO(devtoolsAreOpenState)
34
- const setDevtoolsView = useI(devtoolsViewSelectionState)
35
- const devtoolsView = useO(devtoolsViewSelectionState)
36
- const devtoolsViewOptions = useO(devtoolsViewOptionsState)
35
+ const devtoolsAreHidden = useO(devtoolsAreHiddenAtom)
36
+
37
+ const setDevtoolsAreOpen = useI(devtoolsAreOpenAtom)
38
+ const devtoolsAreOpen = useO(devtoolsAreOpenAtom)
39
+ const setDevtoolsView = useI(devtoolsViewSelectionAtom)
40
+ const devtoolsView = useO(devtoolsViewSelectionAtom)
41
+ const devtoolsViewOptions = useO(devtoolsViewOptionsAtom)
37
42
 
38
43
  const mouseHasMoved = useRef(false)
39
44
 
@@ -60,73 +65,76 @@ const AtomIODevtoolsInternal = (): React.ReactNode => {
60
65
  pointerEvents: `none`,
61
66
  }}
62
67
  />
63
- <motion.main
64
- drag
65
- dragConstraints={constraintsRef}
66
- data-css="atom_io_devtools"
67
- transition={{ type: `spring`, bounce: 0.25 }}
68
- style={
69
- devtoolsAreOpen
70
- ? {}
71
- : {
72
- backgroundColor: `#0000`,
73
- borderColor: `#0000`,
74
- maxHeight: 28,
75
- maxWidth: 33,
76
- }
77
- }
78
- >
79
- {devtoolsAreOpen ? (
80
- <>
81
- <motion.header>
82
- <h1>atom.io</h1>
83
- <nav>
84
- {devtoolsViewOptions.map((viewOption) => (
85
- <button
86
- key={viewOption}
87
- type="button"
88
- data-testid={`view-${viewOption}`}
89
- className={viewOption === devtoolsView ? `active` : ``}
90
- onClick={() => {
91
- setDevtoolsView(viewOption)
92
- }}
93
- disabled={viewOption === devtoolsView}
94
- >
95
- {viewOption}
96
- </button>
97
- ))}
98
- </nav>
99
- </motion.header>
100
- <motion.main>
101
- <LayoutGroup>
102
- {devtoolsView === `atoms` ? (
103
- <StateIndex tokenIndex={atomIndex} />
104
- ) : devtoolsView === `selectors` ? (
105
- <StateIndex tokenIndex={selectorIndex} />
106
- ) : devtoolsView === `transactions` ? (
107
- <TransactionIndex />
108
- ) : (
109
- <TimelineIndex />
110
- )}
111
- </LayoutGroup>
112
- </motion.main>
113
- </>
114
- ) : null}
115
- <footer>
116
- <button
117
- type="button"
118
- onMouseDown={() => (mouseHasMoved.current = false)}
119
- onMouseMove={() => (mouseHasMoved.current = true)}
120
- onMouseUp={() => {
121
- if (!mouseHasMoved.current) {
122
- setDevtoolsAreOpen((open) => !open)
123
- }
124
- }}
125
- >
126
- 🔍
127
- </button>
128
- </footer>
129
- </motion.main>
68
+ {devtoolsAreHidden ? null : (
69
+ <motion.main
70
+ drag
71
+ dragConstraints={constraintsRef}
72
+ data-css="atom_io_devtools"
73
+ data-testid="devtools"
74
+ transition={{ type: `spring`, bounce: 0.25 }}
75
+ style={
76
+ devtoolsAreOpen
77
+ ? {}
78
+ : {
79
+ backgroundColor: `#0000`,
80
+ borderColor: `#0000`,
81
+ maxHeight: 28,
82
+ maxWidth: 33,
83
+ }
84
+ }
85
+ >
86
+ {devtoolsAreOpen ? (
87
+ <>
88
+ <motion.header>
89
+ <h1>atom.io</h1>
90
+ <nav>
91
+ {devtoolsViewOptions.map((viewOption) => (
92
+ <button
93
+ key={viewOption}
94
+ type="button"
95
+ data-testid={`view-${viewOption}`}
96
+ className={viewOption === devtoolsView ? `active` : ``}
97
+ onClick={() => {
98
+ setDevtoolsView(viewOption)
99
+ }}
100
+ disabled={viewOption === devtoolsView}
101
+ >
102
+ {viewOption}
103
+ </button>
104
+ ))}
105
+ </nav>
106
+ </motion.header>
107
+ <motion.main>
108
+ <LayoutGroup>
109
+ {devtoolsView === `atoms` ? (
110
+ <StateIndex tokenIndex={atomIndex} />
111
+ ) : devtoolsView === `selectors` ? (
112
+ <StateIndex tokenIndex={selectorIndex} />
113
+ ) : devtoolsView === `transactions` ? (
114
+ <TransactionIndex />
115
+ ) : (
116
+ <TimelineIndex />
117
+ )}
118
+ </LayoutGroup>
119
+ </motion.main>
120
+ </>
121
+ ) : null}
122
+ <footer>
123
+ <button
124
+ type="button"
125
+ onMouseDown={() => (mouseHasMoved.current = false)}
126
+ onMouseMove={() => (mouseHasMoved.current = true)}
127
+ onMouseUp={() => {
128
+ if (!mouseHasMoved.current) {
129
+ setDevtoolsAreOpen((open) => !open)
130
+ }
131
+ }}
132
+ >
133
+ 🔍
134
+ </button>
135
+ </footer>
136
+ </motion.main>
137
+ )}
130
138
  </span>
131
139
  )
132
140
  }