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.
- package/dist/react/index.d.ts +24 -6
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +54 -9
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.d.ts +3 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js +33 -18
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime-react/index.d.ts +4 -4
- package/dist/realtime-react/index.d.ts.map +1 -1
- package/dist/realtime-react/index.js +17 -17
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-testing/index.d.ts +3 -3
- package/dist/realtime-testing/index.d.ts.map +1 -1
- package/dist/{use-o-BrXc7Qro.js → use-o-DXPncKmZ.js} +8 -8
- package/dist/use-o-DXPncKmZ.js.map +1 -0
- package/package.json +5 -5
- package/src/react/index.ts +1 -0
- package/src/react/use-loadable.ts +79 -0
- package/src/react-devtools/AtomIODevtools.tsx +85 -77
- package/src/react-devtools/store.ts +32 -10
- package/dist/use-o-BrXc7Qro.js.map +0 -1
|
@@ -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,
|
|
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,
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
91
|
-
"react": "19.1.
|
|
92
|
-
"react-dom": "19.1.
|
|
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",
|
package/src/react/index.ts
CHANGED
|
@@ -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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
devtoolsAreHiddenAtom,
|
|
30
|
+
devtoolsAreOpenAtom,
|
|
31
|
+
devtoolsViewSelectionAtom,
|
|
32
|
+
devtoolsViewOptionsAtom,
|
|
30
33
|
} = useContext(DevtoolsContext)
|
|
31
34
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
}
|