atom.io 0.31.1 → 0.32.1

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.
Files changed (162) hide show
  1. package/data/dist/index.d.ts +3 -154
  2. package/data/dist/index.js +11 -559
  3. package/data/src/index.ts +0 -2
  4. package/data/src/struct-family.ts +1 -1
  5. package/data/src/struct.ts +1 -2
  6. package/dist/chunk-3PQTWLQQ.js +83 -0
  7. package/dist/chunk-3ZFTRSNG.js +523 -0
  8. package/dist/chunk-4LWKCEW3.js +14 -0
  9. package/dist/chunk-KVI5OBF2.js +153 -0
  10. package/dist/{chunk-Y5MBNTVU.js → chunk-UQEYZ3OI.js} +1814 -721
  11. package/dist/chunk-UYYKOGZQ.js +1034 -0
  12. package/dist/chunk-VRJP2PCU.js +631 -0
  13. package/dist/chunk-X7SD2NXU.js +108 -0
  14. package/dist/index.d.ts +137 -12
  15. package/dist/index.js +1 -228
  16. package/eslint-plugin/dist/index.d.ts +1 -30
  17. package/eslint-plugin/dist/index.js +3 -149
  18. package/eslint-plugin/src/index.ts +0 -1
  19. package/eslint-plugin/src/rules/explicit-state-types.ts +1 -0
  20. package/eslint-plugin/src/rules/index.ts +0 -1
  21. package/eslint-plugin/src/rules/synchronous-selector-dependencies.ts +1 -0
  22. package/eslint-plugin/src/walk.ts +1 -0
  23. package/internal/dist/index.d.ts +129 -58
  24. package/internal/dist/index.js +1 -1
  25. package/internal/src/atom/create-regular-atom.ts +3 -3
  26. package/internal/src/atom/dispose-atom.ts +4 -13
  27. package/internal/src/atom/is-default.ts +3 -3
  28. package/internal/src/caching.ts +5 -5
  29. package/internal/src/capitalize.ts +3 -0
  30. package/internal/src/families/create-readonly-selector-family.ts +5 -6
  31. package/internal/src/families/create-writable-selector-family.ts +1 -4
  32. package/internal/src/families/dispose-from-store.ts +3 -13
  33. package/internal/src/get-state/get-from-store.ts +2 -2
  34. package/internal/src/get-state/read-or-compute-value.ts +1 -1
  35. package/internal/src/index.ts +2 -0
  36. package/internal/src/install-into-store.ts +1 -1
  37. package/internal/src/join/edit-relations-in-store.ts +32 -0
  38. package/internal/src/join/find-relations-in-store.ts +124 -0
  39. package/internal/src/join/get-internal-relations-from-store.ts +14 -0
  40. package/internal/src/join/get-join.ts +31 -0
  41. package/internal/src/join/index.ts +5 -0
  42. package/{data/src/join.ts → internal/src/join/join-internal.ts} +21 -430
  43. package/internal/src/junction.ts +7 -4
  44. package/internal/src/keys.ts +7 -7
  45. package/internal/src/mutable/create-mutable-atom-family.ts +1 -1
  46. package/internal/src/mutable/create-mutable-atom.ts +3 -3
  47. package/internal/src/mutable/get-json-token.ts +1 -1
  48. package/internal/src/mutable/tracker-family.ts +19 -17
  49. package/internal/src/mutable/tracker.ts +8 -8
  50. package/internal/src/pretty-print.ts +1 -1
  51. package/internal/src/selector/create-readonly-selector.ts +3 -7
  52. package/internal/src/selector/create-writable-selector.ts +4 -4
  53. package/internal/src/selector/dispose-selector.ts +20 -11
  54. package/internal/src/selector/get-selector-dependency-keys.ts +1 -1
  55. package/internal/src/selector/register-selector.ts +6 -9
  56. package/internal/src/selector/trace-selector-atoms.ts +2 -2
  57. package/internal/src/set-state/copy-mutable-if-needed.ts +1 -1
  58. package/internal/src/set-state/emit-update.ts +4 -2
  59. package/internal/src/set-state/evict-downstream.ts +1 -1
  60. package/internal/src/set-state/set-atom-or-selector.ts +1 -1
  61. package/internal/src/set-state/set-atom.ts +10 -10
  62. package/internal/src/set-state/set-into-store.ts +2 -2
  63. package/internal/src/set-state/stow-update.ts +1 -1
  64. package/internal/src/store/store.ts +1 -1
  65. package/internal/src/store/withdraw.ts +22 -22
  66. package/internal/src/subscribe/recall-state.ts +1 -1
  67. package/internal/src/subscribe/subscribe-in-store.ts +3 -3
  68. package/internal/src/subscribe/subscribe-to-root-atoms.ts +3 -3
  69. package/internal/src/subscribe/subscribe-to-state.ts +5 -5
  70. package/internal/src/subscribe/subscribe-to-timeline.ts +3 -3
  71. package/internal/src/subscribe/subscribe-to-transaction.ts +3 -3
  72. package/internal/src/timeline/create-timeline.ts +19 -38
  73. package/internal/src/timeline/time-travel.ts +2 -1
  74. package/internal/src/transaction/act-upon-store.ts +2 -2
  75. package/internal/src/transaction/apply-transaction.ts +5 -5
  76. package/internal/src/transaction/assign-transaction-to-continuity.ts +1 -1
  77. package/internal/src/transaction/build-transaction.ts +5 -8
  78. package/internal/src/transaction/create-transaction.ts +3 -3
  79. package/internal/src/transaction/get-epoch-number.ts +3 -3
  80. package/internal/src/transaction/set-epoch-number.ts +2 -2
  81. package/introspection/dist/index.js +2 -620
  82. package/json/dist/index.d.ts +2 -2
  83. package/json/dist/index.js +1 -80
  84. package/json/src/select-json-family.ts +3 -14
  85. package/package.json +31 -49
  86. package/react/dist/index.js +2 -82
  87. package/react/src/use-o.ts +1 -1
  88. package/react/src/use-tl.ts +2 -2
  89. package/react-devtools/dist/index.css +16 -14
  90. package/react-devtools/dist/index.js +31 -18
  91. package/react-devtools/src/Updates.tsx +12 -0
  92. package/react-devtools/src/devtools.scss +16 -14
  93. package/react-devtools/src/json-editor/editors-by-type/utilities/cast-to-json.ts +2 -1
  94. package/realtime/dist/index.d.ts +1 -2
  95. package/realtime/dist/index.js +2 -107
  96. package/realtime/src/realtime-continuity.ts +3 -2
  97. package/realtime/src/shared-room-store.ts +1 -2
  98. package/realtime-client/dist/index.d.ts +9 -9
  99. package/realtime-client/dist/index.js +3 -509
  100. package/realtime-client/src/continuity/register-and-attempt-confirmed-update.ts +3 -3
  101. package/realtime-client/src/continuity/use-conceal-state.ts +1 -1
  102. package/realtime-client/src/pull-atom-family-member.ts +2 -2
  103. package/realtime-client/src/pull-atom.ts +2 -2
  104. package/realtime-client/src/pull-mutable-atom-family-member.ts +2 -2
  105. package/realtime-client/src/pull-mutable-atom.ts +2 -2
  106. package/realtime-client/src/pull-selector-family-member.ts +4 -4
  107. package/realtime-client/src/pull-selector.ts +4 -4
  108. package/realtime-client/src/push-state.ts +5 -10
  109. package/realtime-client/src/server-action.ts +4 -4
  110. package/realtime-client/src/sync-continuity.ts +6 -6
  111. package/realtime-react/dist/index.js +5 -154
  112. package/realtime-react/src/use-pull-atom-family-member.ts +1 -1
  113. package/realtime-react/src/use-pull-atom.ts +1 -1
  114. package/realtime-react/src/use-pull-mutable-atom.ts +1 -1
  115. package/realtime-react/src/use-pull-mutable-family-member.ts +1 -1
  116. package/realtime-react/src/use-pull-selector-family-member.ts +1 -1
  117. package/realtime-react/src/use-pull-selector.ts +1 -1
  118. package/realtime-react/src/use-push.ts +1 -1
  119. package/realtime-react/src/use-server-action.ts +2 -2
  120. package/realtime-react/src/use-sync-continuity.ts +1 -1
  121. package/realtime-server/dist/index.d.ts +2 -4
  122. package/realtime-server/dist/index.js +3 -1001
  123. package/realtime-server/src/continuity/prepare-to-serve-transaction-request.ts +1 -1
  124. package/realtime-server/src/continuity/prepare-to-sync-realtime-continuity.ts +3 -3
  125. package/realtime-server/src/continuity/subscribe-to-continuity-actions.ts +2 -2
  126. package/realtime-server/src/continuity/subscribe-to-continuity-perpectives.ts +2 -2
  127. package/realtime-server/src/ipc-sockets/child-socket.ts +2 -0
  128. package/realtime-server/src/realtime-action-receiver.ts +1 -1
  129. package/realtime-server/src/realtime-family-provider.ts +2 -2
  130. package/realtime-server/src/realtime-mutable-family-provider.ts +2 -2
  131. package/realtime-server/src/realtime-mutable-provider.ts +2 -2
  132. package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +2 -1
  133. package/realtime-server/src/realtime-server-stores/server-room-external-store.ts +1 -1
  134. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +10 -2
  135. package/realtime-server/src/realtime-server-stores/server-user-store.ts +1 -2
  136. package/realtime-server/src/realtime-state-provider.ts +2 -2
  137. package/realtime-testing/dist/index.js +20 -22
  138. package/realtime-testing/src/setup-realtime-test.tsx +2 -1
  139. package/src/index.ts +4 -0
  140. package/src/join.ts +218 -0
  141. package/src/silo.ts +4 -4
  142. package/src/timeline.ts +1 -1
  143. package/src/transaction.ts +4 -8
  144. package/transceivers/set-rtx/dist/index.d.ts +4 -3
  145. package/transceivers/set-rtx/dist/index.js +1 -215
  146. package/transceivers/set-rtx/src/set-rtx.ts +4 -7
  147. package/web/dist/index.js +1 -15
  148. package/data/src/until.ts +0 -15
  149. package/ephemeral/dist/index.d.ts +0 -67
  150. package/ephemeral/dist/index.js +0 -9
  151. package/ephemeral/package.json +0 -13
  152. package/ephemeral/src/index.ts +0 -1
  153. package/eslint-plugin/src/rules/lifespan.ts +0 -203
  154. package/immortal/dist/index.d.ts +0 -12
  155. package/immortal/dist/index.js +0 -9
  156. package/immortal/package.json +0 -13
  157. package/immortal/src/index.ts +0 -1
  158. package/immortal/src/seek-state.ts +0 -60
  159. package/react-devtools/src/json-editor/assets/Untitled-1.ai +2 -1436
  160. package/react-devtools/src/json-editor/assets/data-vis.ai +1 -1548
  161. package/react-devtools/src/json-editor/comp/json-editor-sketches.ai +5 -1449
  162. /package/{ephemeral/src → src}/find-state.ts +0 -0
@@ -20,9 +20,9 @@ export function prepareToServeTransactionRequest(
20
20
  performance.mark(performanceKeyStart)
21
21
  try {
22
22
  actUponStore(
23
+ store,
23
24
  { type: `transaction`, key: transactionKey },
24
25
  updateId,
25
- store,
26
26
  )(...update.params)
27
27
  } catch (thrown) {
28
28
  if (thrown instanceof Error) {
@@ -1,6 +1,6 @@
1
- import { findRelationsInStore } from "atom.io/data"
2
1
  import {
3
2
  findInStore,
3
+ findRelationsInStore,
4
4
  getFromStore,
5
5
  IMPLICIT,
6
6
  subscribeToState,
@@ -50,7 +50,9 @@ export function prepareToExposeRealtimeContinuity({
50
50
  store,
51
51
  ).socketKeyOfUser
52
52
  const unsubscribeFromSocketTracking = subscribeToState(
53
+ store,
53
54
  socketKeyState,
55
+ `sync-continuity:${continuityKey}:${userKey}`,
54
56
  ({ newValue: newSocketKey }) => {
55
57
  store.logger.info(
56
58
  `👋`,
@@ -77,8 +79,6 @@ export function prepareToExposeRealtimeContinuity({
77
79
  )
78
80
  }
79
81
  },
80
- `sync-continuity:${continuityKey}:${userKey}`,
81
- store,
82
82
  )
83
83
 
84
84
  const userUnacknowledgedUpdates = getFromStore(
@@ -28,7 +28,9 @@ export function subscribeToContinuityActions(
28
28
 
29
29
  for (const transaction of continuity.actions) {
30
30
  const unsubscribeFromTransaction = subscribeToTransaction(
31
+ store,
31
32
  transaction,
33
+ `sync-continuity:${continuityKey}:${userKey}`,
32
34
  (update) => {
33
35
  try {
34
36
  const visibleKeys = continuity.globals
@@ -97,8 +99,6 @@ export function subscribeToContinuityActions(
97
99
  }
98
100
  }
99
101
  },
100
- `sync-continuity:${continuityKey}:${userKey}`,
101
- store,
102
102
  )
103
103
  unsubscribeFunctions.push(unsubscribeFromTransaction)
104
104
  }
@@ -22,7 +22,9 @@ export function subscribeToContinuityPerspectives(
22
22
  const { viewAtoms } = perspective
23
23
  const userViewState = findInStore(store, viewAtoms, userKey)
24
24
  const unsubscribeFromUserView = subscribeToState(
25
+ store,
25
26
  userViewState,
27
+ `sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,
26
28
  ({ oldValue, newValue }) => {
27
29
  const oldKeys = oldValue.map((token) => token.key)
28
30
  const newKeys = newValue.map((token) => token.key)
@@ -51,8 +53,6 @@ export function subscribeToContinuityPerspectives(
51
53
  socket?.emit(`conceal:${continuityKey}`, concealed)
52
54
  }
53
55
  },
54
- `sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,
55
- store,
56
56
  )
57
57
  unsubFns.push(unsubscribeFromUserView)
58
58
  }
@@ -36,6 +36,8 @@ export class ChildSocket<
36
36
  case `e`:
37
37
  this.logger.error(...rest)
38
38
  break
39
+ default:
40
+ return
39
41
  }
40
42
  }
41
43
  }
@@ -19,7 +19,7 @@ export function realtimeActionReceiver({
19
19
  const performanceKeyStart = `${performanceKey}:start`
20
20
  const performanceKeyEnd = `${performanceKey}:end`
21
21
  performance.mark(performanceKeyStart)
22
- actUponStore<F>(tx, update.id, store)(...update.params)
22
+ actUponStore<F>(store, tx, update.id)(...update.params)
23
23
  performance.mark(performanceKeyEnd)
24
24
  const metric = performance.measure(
25
25
  performanceKey,
@@ -40,12 +40,12 @@ export function realtimeAtomFamilyProvider({
40
40
  const token = findInStore(store, family, subKey)
41
41
  socket.emit(`serve:${token.key}`, getFromStore(store, token))
42
42
  const unsubscribe = subscribeToState(
43
+ store,
43
44
  token,
45
+ `expose-family:${family.key}:${socket.id}`,
44
46
  ({ newValue }) => {
45
47
  socket.emit(`serve:${token.key}`, newValue)
46
48
  },
47
- `expose-family:${family.key}:${socket.id}`,
48
- store,
49
49
  )
50
50
  unsubCallbacksByKey.set(token.key, unsubscribe)
51
51
  socket.on(`unsub:${token.key}`, () => {
@@ -49,12 +49,12 @@ export function realtimeMutableFamilyProvider({
49
49
  const updateToken = getUpdateToken(token)
50
50
  socket.emit(`init:${token.key}`, getFromStore(store, jsonToken))
51
51
  const unsubscribe = subscribeToState(
52
+ store,
52
53
  updateToken,
54
+ `expose-family:${family.key}:${socket.id}`,
53
55
  ({ newValue }) => {
54
56
  socket.emit(`next:${token.key}`, newValue)
55
57
  },
56
- `expose-family:${family.key}:${socket.id}`,
57
- store,
58
58
  )
59
59
  unsubCallbacksByKey.set(token.key, unsubscribe)
60
60
  socket.on(`unsub:${token.key}`, () => {
@@ -34,12 +34,12 @@ export function realtimeMutableProvider({
34
34
  const fillSubRequest = () => {
35
35
  socket.emit(`init:${token.key}`, getFromStore(store, jsonToken))
36
36
  unsubscribeFromStateUpdates = subscribeToState(
37
+ store,
37
38
  trackerToken,
39
+ `expose-single:${socket.id}`,
38
40
  ({ newValue }) => {
39
41
  socket.emit(`next:${token.key}`, newValue)
40
42
  },
41
- `expose-single:${socket.id}`,
42
- store,
43
43
  )
44
44
  socket.on(`unsub:${token.key}`, fillUnsubRequest)
45
45
  }
@@ -1,5 +1,6 @@
1
+ import type { Loadable } from "atom.io"
1
2
  import * as AtomIO from "atom.io"
2
- import { editRelationsInStore, type Loadable } from "atom.io/data"
3
+ import { editRelationsInStore } from "atom.io/internal"
3
4
  import type { UserInRoomMeta } from "atom.io/realtime"
4
5
  import { roomIndex, usersInRooms } from "atom.io/realtime"
5
6
 
@@ -1,8 +1,8 @@
1
1
  import type { ChildProcessWithoutNullStreams } from "node:child_process"
2
2
  import { spawn } from "node:child_process"
3
3
 
4
+ import type { Loadable } from "atom.io"
4
5
  import { atomFamily, selectorFamily } from "atom.io"
5
- import type { Loadable } from "atom.io/data"
6
6
 
7
7
  import { ChildSocket } from "../ipc-sockets"
8
8
 
@@ -25,7 +25,13 @@ export function redactTransactionUpdateContent(
25
25
  )
26
26
  return { ...update, updates: redacted }
27
27
  }
28
- default:
28
+ case `atom_update`:
29
+ case `selector_update`:
30
+ case `molecule_creation`:
31
+ case `molecule_disposal`:
32
+ case `molecule_transfer`:
33
+ case `state_creation`:
34
+ case `state_disposal`:
29
35
  return update
30
36
  }
31
37
  })
@@ -35,10 +41,12 @@ export function redactTransactionUpdateContent(
35
41
  case `selector_update`:
36
42
  return visibleStateKeys.includes(update.key)
37
43
  case `state_creation`:
44
+ case `state_disposal`:
38
45
  return visibleStateKeys.includes(update.token.key)
39
46
  case `molecule_creation`:
40
- return true
41
47
  case `transaction_update`:
48
+ case `molecule_disposal`:
49
+ case `molecule_transfer`:
42
50
  return true
43
51
  }
44
52
  })
@@ -1,6 +1,5 @@
1
1
  import type { Hierarchy } from "atom.io"
2
- import { atom, atomFamily } from "atom.io"
3
- import { join } from "atom.io/data"
2
+ import { atom, atomFamily, join } from "atom.io"
4
3
  import type { SetRTXJson } from "atom.io/transceivers/set-rtx"
5
4
  import { SetRTX } from "atom.io/transceivers/set-rtx"
6
5
 
@@ -18,12 +18,12 @@ export function realtimeStateProvider({
18
18
  socket.emit(`serve:${token.key}`, getFromStore(store, token))
19
19
 
20
20
  unsubscribeFromStateUpdates = subscribeToState(
21
+ store,
21
22
  token,
23
+ `expose-single:${socket.id}`,
22
24
  ({ newValue }) => {
23
25
  socket.emit(`serve:${token.key}`, newValue)
24
26
  },
25
- `expose-single:${socket.id}`,
26
- store,
27
27
  )
28
28
 
29
29
  const fillUnsubRequest = () => {
@@ -1,15 +1,13 @@
1
+ import { RealtimeProvider } from '../../dist/chunk-KVI5OBF2.js';
2
+ import { myUsernameState } from '../../dist/chunk-3ZFTRSNG.js';
3
+ import { socketAtoms, usersOfSockets, userIndex, socketIndex, roomSelectors } from '../../dist/chunk-UYYKOGZQ.js';
4
+ import { roomIndex } from '../../dist/chunk-X7SD2NXU.js';
5
+ import '../../dist/chunk-4LWKCEW3.js';
6
+ import { StoreProvider } from '../../dist/chunk-3PQTWLQQ.js';
7
+ import { Silo, IMPLICIT, Realm, findInStore, setIntoStore, editRelationsInStore, toEntries, findRelationsInStore, getFromStore, clearStore, AtomIOLogger } from '../../dist/chunk-UQEYZ3OI.js';
1
8
  import '../../dist/chunk-XWL6SNVU.js';
2
9
  import * as http from 'node:http';
3
10
  import { render, prettyDOM } from '@testing-library/react';
4
- import * as AtomIO from 'atom.io';
5
- import { editRelationsInStore, findRelationsInStore } from 'atom.io/data';
6
- import { IMPLICIT, findInStore, setIntoStore, getFromStore, clearStore } from 'atom.io/internal';
7
- import { toEntries } from 'atom.io/json';
8
- import * as AR from 'atom.io/react';
9
- import * as RT from 'atom.io/realtime';
10
- import * as RTC from 'atom.io/realtime-client';
11
- import * as RTR from 'atom.io/realtime-react';
12
- import * as RTS from 'atom.io/realtime-server';
13
11
  import * as Happy from 'happy-dom';
14
12
  import * as SocketIO from 'socket.io';
15
13
  import { io } from 'socket.io-client';
@@ -17,7 +15,7 @@ import { jsx } from 'react/jsx-runtime';
17
15
 
18
16
  var testNumber = 0;
19
17
  function prefixLogger(store, prefix) {
20
- store.loggers[0] = new AtomIO.AtomIOLogger(`info`, undefined, {
18
+ store.loggers[0] = new AtomIOLogger(`info`, void 0, {
21
19
  info: (...args) => {
22
20
  console.info(prefix, ...args);
23
21
  },
@@ -31,14 +29,14 @@ function prefixLogger(store, prefix) {
31
29
  }
32
30
  var setupRealtimeTestServer = (options) => {
33
31
  ++testNumber;
34
- const silo = new AtomIO.Silo(
32
+ const silo = new Silo(
35
33
  {
36
34
  name: `SERVER-${testNumber}`,
37
35
  lifespan: options.immortal?.server ? `immortal` : `ephemeral`
38
36
  },
39
37
  IMPLICIT.STORE
40
38
  );
41
- const socketRealm = new AtomIO.Realm(silo.store);
39
+ const socketRealm = new Realm(silo.store);
42
40
  const httpServer = http.createServer((_, res) => res.end(`Hello World!`));
43
41
  const address = httpServer.listen(options.port).address();
44
42
  const port = typeof address === `string` ? null : address === null ? null : address.port;
@@ -48,19 +46,19 @@ var setupRealtimeTestServer = (options) => {
48
46
  if (token === `test` && socket.id) {
49
47
  const userClaim = socketRealm.allocate(`root`, `user::${username}`);
50
48
  const socketClaim = socketRealm.allocate(`root`, `socket::${socket.id}`);
51
- const socketState = findInStore(silo.store, RTS.socketAtoms, socketClaim);
49
+ const socketState = findInStore(silo.store, socketAtoms, socketClaim);
52
50
  setIntoStore(silo.store, socketState, socket);
53
51
  editRelationsInStore(
54
- RTS.usersOfSockets,
52
+ usersOfSockets,
55
53
  (relations) => {
56
54
  relations.set(userClaim, socketClaim);
57
55
  },
58
56
  silo.store
59
57
  );
60
- setIntoStore(silo.store, RTS.userIndex, (index) => index.add(userClaim));
58
+ setIntoStore(silo.store, userIndex, (index) => index.add(userClaim));
61
59
  setIntoStore(
62
60
  silo.store,
63
- RTS.socketIndex,
61
+ socketIndex,
64
62
  (index) => index.add(socketClaim)
65
63
  );
66
64
  next();
@@ -72,7 +70,7 @@ var setupRealtimeTestServer = (options) => {
72
70
  let userKey = null;
73
71
  function enableLogging() {
74
72
  const userKeyState = findRelationsInStore(
75
- RTS.usersOfSockets,
73
+ usersOfSockets,
76
74
  `socket::${socket.id}`,
77
75
  silo.store
78
76
  ).userKeyOfSocket;
@@ -92,9 +90,9 @@ var setupRealtimeTestServer = (options) => {
92
90
  });
93
91
  const dispose = async () => {
94
92
  await server.close();
95
- const roomKeys = getFromStore(silo.store, RT.roomIndex);
93
+ const roomKeys = getFromStore(silo.store, roomIndex);
96
94
  for (const roomKey of roomKeys) {
97
- const roomState = findInStore(silo.store, RTS.roomSelectors, roomKey);
95
+ const roomState = findInStore(silo.store, roomSelectors, roomKey);
98
96
  const room = getFromStore(silo.store, roomState);
99
97
  if (room && !(room instanceof Promise)) {
100
98
  room.process.kill();
@@ -116,17 +114,17 @@ var setupRealtimeTestClient = (options, name, port) => {
116
114
  const socket = io(`http://localhost:${port}/`, {
117
115
  auth: { token: `test`, username: `${name}-${testNumber}` }
118
116
  });
119
- const silo = new AtomIO.Silo({ name, lifespan: `ephemeral` }, IMPLICIT.STORE);
117
+ const silo = new Silo({ name, lifespan: `ephemeral` }, IMPLICIT.STORE);
120
118
  for (const [key, value] of silo.store.valueMap.entries()) {
121
119
  if (Array.isArray(value)) {
122
120
  silo.store.valueMap.set(key, [...value]);
123
121
  }
124
122
  }
125
- silo.setState(RTC.myUsernameState, `${name}-${testNumber}`);
123
+ silo.setState(myUsernameState, `${name}-${testNumber}`);
126
124
  const { document } = new Happy.Window();
127
125
  document.body.innerHTML = `<div id="app"></div>`;
128
126
  const renderResult = render(
129
- /* @__PURE__ */ jsx(AR.StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsx(RTR.RealtimeProvider, { socket, children: /* @__PURE__ */ jsx(options.client, {}) }) }),
127
+ /* @__PURE__ */ jsx(StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsx(RealtimeProvider, { socket, children: /* @__PURE__ */ jsx(options.client, {}) }) }),
130
128
  {
131
129
  container: document.querySelector(`#app`)
132
130
  }
@@ -3,11 +3,12 @@ import * as http from "node:http"
3
3
  import type { RenderResult } from "@testing-library/react"
4
4
  import { prettyDOM, render } from "@testing-library/react"
5
5
  import * as AtomIO from "atom.io"
6
- import { editRelationsInStore, findRelationsInStore } from "atom.io/data"
7
6
  import type { Store } from "atom.io/internal"
8
7
  import {
9
8
  clearStore,
9
+ editRelationsInStore,
10
10
  findInStore,
11
+ findRelationsInStore,
11
12
  getFromStore,
12
13
  IMPLICIT,
13
14
  setIntoStore,
package/src/index.ts CHANGED
@@ -17,7 +17,9 @@ import type {
17
17
 
18
18
  export * from "./atom"
19
19
  export * from "./dispose-state"
20
+ export * from "./find-state"
20
21
  export * from "./get-state"
22
+ export * from "./join"
21
23
  export * from "./logger"
22
24
  export * from "./realm"
23
25
  export * from "./selector"
@@ -146,3 +148,5 @@ export type FamilyMetadata<K extends Canonical = any> = {
146
148
  /** The family member's unique identifier, in the form of a string. */
147
149
  subKey: stringified<K>
148
150
  }
151
+
152
+ export type Loadable<T> = Promise<T> | T
package/src/join.ts ADDED
@@ -0,0 +1,218 @@
1
+ import type { MutableAtomFamilyToken, ReadonlySelectorToken } from "atom.io"
2
+ import type {
3
+ Junction,
4
+ JunctionEntriesBase,
5
+ JunctionSchemaBase,
6
+ Refinement,
7
+ Store,
8
+ } from "atom.io/internal"
9
+ import {
10
+ editRelationsInStore,
11
+ findRelationsInStore,
12
+ getInternalRelationsFromStore,
13
+ IMPLICIT,
14
+ Join,
15
+ } from "atom.io/internal"
16
+ import type { Json } from "atom.io/json"
17
+ import type { SetRTX, SetRTXJson } from "atom.io/transceivers/set-rtx"
18
+
19
+ export interface JoinOptions<
20
+ ASide extends string,
21
+ AType extends string,
22
+ BSide extends string,
23
+ BType extends string,
24
+ Cardinality extends `1:1` | `1:n` | `n:n`,
25
+ Content extends Json.Object | null,
26
+ > extends JunctionSchemaBase<ASide, BSide>,
27
+ Partial<JunctionEntriesBase<AType, BType, Content>> {
28
+ readonly key: string
29
+ readonly cardinality: Cardinality
30
+ readonly isAType: Refinement<string, AType>
31
+ readonly isBType: Refinement<string, BType>
32
+ }
33
+
34
+ export type JoinToken<
35
+ ASide extends string,
36
+ AType extends string,
37
+ BSide extends string,
38
+ BType extends string,
39
+ Cardinality extends `1:1` | `1:n` | `n:n`,
40
+ Content extends Json.Object | null = null,
41
+ > = {
42
+ key: string
43
+ type: `join`
44
+ cardinality: Cardinality
45
+ a: ASide
46
+ b: BSide
47
+ __aType?: AType
48
+ __bType?: BType
49
+ __content?: Content
50
+ }
51
+
52
+ export function join<
53
+ const ASide extends string,
54
+ const AType extends string,
55
+ const BSide extends string,
56
+ const BType extends string,
57
+ const Cardinality extends `1:1` | `1:n` | `n:n`,
58
+ >(
59
+ options: JoinOptions<ASide, AType, BSide, BType, Cardinality, null>,
60
+ defaultContent?: undefined,
61
+ store?: Store,
62
+ ): JoinToken<ASide, AType, BSide, BType, Cardinality, null>
63
+ export function join<
64
+ const ASide extends string,
65
+ const AType extends string,
66
+ const BSide extends string,
67
+ const BType extends string,
68
+ const Cardinality extends `1:1` | `1:n` | `n:n`,
69
+ const Content extends Json.Object,
70
+ >(
71
+ options: JoinOptions<ASide, AType, BSide, BType, Cardinality, Content>,
72
+ defaultContent: Content,
73
+ store?: Store,
74
+ ): JoinToken<ASide, AType, BSide, BType, Cardinality, Content>
75
+ export function join<
76
+ ASide extends string,
77
+ AType extends string,
78
+ BSide extends string,
79
+ BType extends string,
80
+ Cardinality extends `1:1` | `1:n` | `n:n`,
81
+ Content extends Json.Object,
82
+ >(
83
+ options: JoinOptions<ASide, AType, BSide, BType, Cardinality, Content>,
84
+ defaultContent: Content | undefined,
85
+ store: Store = IMPLICIT.STORE,
86
+ ): JoinToken<ASide, AType, BSide, BType, Cardinality, Content> {
87
+ store.joins.set(options.key, new Join(options, defaultContent, store))
88
+ const token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content> = {
89
+ key: options.key,
90
+ type: `join`,
91
+ a: options.between[0],
92
+ b: options.between[1],
93
+ cardinality: options.cardinality,
94
+ }
95
+ return token
96
+ }
97
+
98
+ export type JoinStates<
99
+ ASide extends string,
100
+ AType extends string,
101
+ BSide extends string,
102
+ BType extends string,
103
+ Cardinality extends `1:1` | `1:n` | `n:n`,
104
+ Content extends Json.Object | null,
105
+ > = Cardinality extends `1:1`
106
+ ? (Content extends Json.Object
107
+ ? {
108
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
109
+ [AType, Content] | null,
110
+ BType
111
+ >
112
+ } & {
113
+ readonly [B in BSide as `${B}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
114
+ [BType, Content] | null,
115
+ AType
116
+ >
117
+ }
118
+ : {}) & {
119
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
120
+ AType | null,
121
+ BType
122
+ >
123
+ } & {
124
+ readonly [B in BSide as `${B}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
125
+ BType | null,
126
+ AType
127
+ >
128
+ }
129
+ : Cardinality extends `1:n`
130
+ ? (Content extends Json.Object
131
+ ? {
132
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
133
+ [AType, Content] | null,
134
+ BType
135
+ >
136
+ } & {
137
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
138
+ [BType, Content][],
139
+ AType
140
+ >
141
+ }
142
+ : {}) & {
143
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
144
+ AType | null,
145
+ BType
146
+ >
147
+ } & {
148
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
149
+ BType[],
150
+ AType
151
+ >
152
+ }
153
+ : Cardinality extends `n:n`
154
+ ? (Content extends Json.Object
155
+ ? {
156
+ readonly [A in ASide as `${A}EntriesOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
157
+ [AType, Content][],
158
+ BType
159
+ >
160
+ } & {
161
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
162
+ [BType, Content][],
163
+ AType
164
+ >
165
+ }
166
+ : {}) & {
167
+ readonly [A in ASide as `${A}KeysOf${Capitalize<BSide>}`]: ReadonlySelectorToken<
168
+ AType[],
169
+ BType
170
+ >
171
+ } & {
172
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<
173
+ BType[],
174
+ AType
175
+ >
176
+ }
177
+ : never
178
+
179
+ export function findRelations<
180
+ ASide extends string,
181
+ AType extends string,
182
+ BSide extends string,
183
+ BType extends string,
184
+ Cardinality extends `1:1` | `1:n` | `n:n`,
185
+ Content extends Json.Object | null,
186
+ >(
187
+ token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>,
188
+ key: AType | BType,
189
+ ): JoinStates<ASide, AType, BSide, BType, Cardinality, Content> {
190
+ return findRelationsInStore(token, key, IMPLICIT.STORE)
191
+ }
192
+
193
+ export function editRelations<
194
+ ASide extends string,
195
+ AType extends string,
196
+ BSide extends string,
197
+ BType extends string,
198
+ Cardinality extends `1:1` | `1:n` | `n:n`,
199
+ Content extends Json.Object | null,
200
+ >(
201
+ token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>,
202
+ change: (relations: Junction<ASide, AType, BSide, BType, Content>) => void,
203
+ ): void {
204
+ editRelationsInStore(token, change, IMPLICIT.STORE)
205
+ }
206
+
207
+ export function getInternalRelations<
208
+ ASide extends string,
209
+ AType extends string,
210
+ BSide extends string,
211
+ BType extends string,
212
+ Cardinality extends `1:1` | `1:n` | `n:n`,
213
+ Content extends Json.Object | null,
214
+ >(
215
+ token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>,
216
+ ): MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string> {
217
+ return getInternalRelationsFromStore(token, IMPLICIT.STORE)
218
+ }
package/src/silo.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { findState } from "atom.io/ephemeral"
1
+ import type { findState } from "atom.io"
2
2
  import {
3
3
  actUponStore,
4
4
  arbitrary,
@@ -61,8 +61,8 @@ export class Silo {
61
61
  createStandaloneSelector(s, options)) as typeof selector
62
62
  this.selectorFamily = ((options: Parameters<typeof selectorFamily>[0]) =>
63
63
  createSelectorFamily(s, options)) as typeof selectorFamily
64
- this.transaction = (options) => createTransaction(options, s)
65
- this.timeline = (options) => createTimeline(options, s)
64
+ this.transaction = (options) => createTransaction(s, options)
65
+ this.timeline = (options) => createTimeline(s, options)
66
66
  this.findState = ((...params: Parameters<typeof findState>) =>
67
67
  findInStore(s, ...params)) as typeof findState
68
68
  this.getState = ((...params: Parameters<typeof getState>) =>
@@ -81,7 +81,7 @@ export class Silo {
81
81
  this.redo = (token) => {
82
82
  timeTravel(s, `redo`, token)
83
83
  }
84
- this.runTransaction = (token, id = arbitrary()) => actUponStore(token, id, s)
84
+ this.runTransaction = (token, id = arbitrary()) => actUponStore(s, token, id)
85
85
  this.install = (tokens, source = IMPLICIT.STORE) => {
86
86
  installIntoStore(tokens, s, source)
87
87
  }
package/src/timeline.ts CHANGED
@@ -49,7 +49,7 @@ export type TimelineUpdate<ManagedAtom extends TimelineManageable> =
49
49
  export const timeline = <ManagedAtom extends TimelineManageable>(
50
50
  options: TimelineOptions<ManagedAtom>,
51
51
  ): TimelineToken<ManagedAtom> => {
52
- return createTimeline(options, IMPLICIT.STORE)
52
+ return createTimeline(IMPLICIT.STORE, options)
53
53
  }
54
54
 
55
55
  export const redo = (tl: TimelineToken<any>): void => {
@@ -1,6 +1,4 @@
1
- import type { getState, setState } from "atom.io"
2
- import type { findState } from "atom.io/ephemeral"
3
- import type { seekState } from "atom.io/immortal"
1
+ import type { findState, getState, setState } from "atom.io"
4
2
  import type { EnvironmentData, Func, Transceiver } from "atom.io/internal"
5
3
  import {
6
4
  actUponStore,
@@ -83,12 +81,11 @@ export type TransactionUpdate<F extends Func> = {
83
81
  output: ReturnType<F>
84
82
  }
85
83
 
86
- export type GetterToolkit = Pick<SetterToolkit, `find` | `get` | `json` | `seek`>
84
+ export type GetterToolkit = Pick<SetterToolkit, `find` | `get` | `json`>
87
85
  export type SetterToolkit = Readonly<{
88
86
  get: typeof getState
89
87
  set: typeof setState
90
88
  find: typeof findState
91
- seek: typeof seekState
92
89
  json: <T extends Transceiver<any>, J extends Json.Serializable>(
93
90
  state: MutableAtomToken<T, J>,
94
91
  ) => WritableSelectorToken<J>
@@ -97,7 +94,6 @@ export type ActorToolkit = Readonly<{
97
94
  get: typeof getState
98
95
  set: typeof setState
99
96
  find: typeof findState
100
- seek: typeof seekState
101
97
  json: <T extends Transceiver<any>, J extends Json.Serializable>(
102
98
  state: MutableAtomToken<T, J>,
103
99
  ) => WritableSelectorToken<J>
@@ -132,12 +128,12 @@ export type TransactionIO<Token extends TransactionToken<any>> =
132
128
  export function transaction<F extends Func>(
133
129
  options: TransactionOptions<F>,
134
130
  ): TransactionToken<F> {
135
- return createTransaction(options, IMPLICIT.STORE)
131
+ return createTransaction(IMPLICIT.STORE, options)
136
132
  }
137
133
 
138
134
  export function runTransaction<F extends Func>(
139
135
  token: TransactionToken<F>,
140
136
  id = arbitrary(),
141
137
  ): (...parameters: Parameters<F>) => ReturnType<F> {
142
- return actUponStore(token, id, IMPLICIT.STORE)
138
+ return actUponStore(IMPLICIT.STORE, token, id)
143
139
  }