atom.io 0.25.1 → 0.25.3

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.
@@ -849,15 +849,19 @@ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
849
849
 
850
850
  // internal/src/selector/register-selector.ts
851
851
  var registerSelector = (selectorKey, covered, store) => ({
852
- get: (dependency, key) => {
852
+ get: (...params) => {
853
853
  const target = newest(store);
854
- if (key) {
855
- switch (dependency.type) {
854
+ let dependency;
855
+ if (params.length === 2) {
856
+ const [family, key] = params;
857
+ switch (family.type) {
856
858
  case `molecule_family`:
857
- return getFromStore(dependency, key, store);
858
- case `atom_family`:
859
- dependency = seekInStore(dependency, key, store);
859
+ return getFromStore(family, key, store);
860
+ default:
861
+ dependency = seekInStore(family, key, store);
860
862
  }
863
+ } else {
864
+ [dependency] = params;
861
865
  }
862
866
  if (dependency.type === `molecule`) {
863
867
  return getFromStore(dependency, store);
@@ -574,15 +574,19 @@ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
574
574
 
575
575
  // internal/src/selector/register-selector.ts
576
576
  var registerSelector = (selectorKey, covered, store) => ({
577
- get: (dependency, key) => {
577
+ get: (...params) => {
578
578
  const target = newest(store);
579
- if (key) {
580
- switch (dependency.type) {
579
+ let dependency;
580
+ if (params.length === 2) {
581
+ const [family, key] = params;
582
+ switch (family.type) {
581
583
  case `molecule_family`:
582
- return getFromStore(dependency, key, store);
583
- case `atom_family`:
584
- dependency = seekInStore(dependency, key, store);
584
+ return getFromStore(family, key, store);
585
+ default:
586
+ dependency = seekInStore(family, key, store);
585
587
  }
588
+ } else {
589
+ [dependency] = params;
586
590
  }
587
591
  if (dependency.type === `molecule`) {
588
592
  return getFromStore(dependency, store);
@@ -6,7 +6,7 @@ import type {
6
6
  ReadableToken,
7
7
  setState,
8
8
  SetterToolkit,
9
- WritableSelectorFamilyToken,
9
+ WritableFamilyToken,
10
10
  WritableToken,
11
11
  } from "atom.io"
12
12
  import type { findState } from "atom.io/ephemeral"
@@ -30,29 +30,32 @@ export const registerSelector = (
30
30
  store: Store,
31
31
  ): SetterToolkit => ({
32
32
  get: (
33
- dependency:
34
- | MoleculeFamilyToken<any>
35
- | MoleculeToken<MoleculeConstructor>
36
- | ReadableFamilyToken<any, any>
37
- | ReadableToken<any>,
38
- key?: Json.Serializable,
33
+ ...params:
34
+ | [MoleculeFamilyToken<any>, Json.Serializable]
35
+ | [MoleculeToken<MoleculeConstructor>]
36
+ | [ReadableFamilyToken<any, any>, Json.Serializable]
37
+ | [ReadableToken<any>]
39
38
  ) => {
40
39
  const target = newest(store)
40
+ let dependency: MoleculeToken<MoleculeConstructor> | ReadableToken<any>
41
41
 
42
- if (key) {
43
- switch (dependency.type) {
42
+ if (params.length === 2) {
43
+ const [family, key] = params
44
+ switch (family.type) {
44
45
  case `molecule_family`:
45
- return getFromStore(dependency, key, store)
46
- case `atom_family`:
47
- dependency = seekInStore(dependency, key, store) as any
46
+ return getFromStore(family, key, store)
47
+ default:
48
+ dependency = seekInStore(family, key, store) as any
48
49
  }
50
+ } else {
51
+ ;[dependency] = params
49
52
  }
50
53
 
51
54
  if (dependency.type === `molecule`) {
52
55
  return getFromStore(dependency, store)
53
56
  }
54
57
 
55
- const dependencyState = withdraw(dependency as ReadableToken<any>, store)
58
+ const dependencyState = withdraw(dependency, store)
56
59
  const dependencyValue = readOrComputeValue(dependencyState, store)
57
60
 
58
61
  store.logger.info(
@@ -79,7 +82,7 @@ export const registerSelector = (
79
82
  set: (<T, New extends T>(
80
83
  ...params:
81
84
  | [
82
- token: WritableSelectorFamilyToken<T, any>,
85
+ token: WritableFamilyToken<T, any>,
83
86
  key: Json.Serializable,
84
87
  value: New | ((oldValue: any) => New),
85
88
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.25.1",
3
+ "version": "0.25.3",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -56,12 +56,12 @@
56
56
  "@types/npmlog": "7.0.0",
57
57
  "@types/react": "18.3.3",
58
58
  "@types/tmp": "0.2.6",
59
- "@typescript-eslint/parser": "7.14.1",
60
- "@typescript-eslint/rule-tester": "7.14.1",
59
+ "@typescript-eslint/parser": "7.15.0",
60
+ "@typescript-eslint/rule-tester": "7.15.0",
61
61
  "@vitest/coverage-v8": "1.6.0",
62
62
  "@vitest/ui": "1.6.0",
63
63
  "concurrently": "8.2.2",
64
- "drizzle-kit": "0.22.7",
64
+ "drizzle-kit": "0.22.8",
65
65
  "drizzle-orm": "0.31.2",
66
66
  "eslint": "npm:eslint@8.57.0",
67
67
  "eslint-v9": "npm:eslint@9.6.0",
@@ -70,7 +70,7 @@
70
70
  "http-proxy": "1.18.1",
71
71
  "npmlog": "7.0.1",
72
72
  "postgres": "3.4.4",
73
- "preact": "10.22.0",
73
+ "preact": "10.22.1",
74
74
  "react": "18.3.1",
75
75
  "react-dom": "18.3.1",
76
76
  "react-router-dom": "6.24.0",
@@ -78,7 +78,7 @@
78
78
  "socket.io-client": "4.7.5",
79
79
  "tmp": "0.2.3",
80
80
  "tsup": "8.1.0",
81
- "typescript": "5.5.2",
81
+ "typescript": "5.5.3",
82
82
  "vite": "5.3.2",
83
83
  "vite-tsconfig-paths": "4.3.2",
84
84
  "vitest": "1.6.0"
@@ -28,28 +28,46 @@ var React5__namespace = /*#__PURE__*/_interopNamespace(React5);
28
28
  // react/src/store-context.tsx
29
29
  var StoreContext = React5__namespace.createContext(internal.IMPLICIT.STORE);
30
30
  var StoreProvider = ({ children, store = internal.IMPLICIT.STORE }) => /* @__PURE__ */ jsxRuntime.jsx(StoreContext.Provider, { value: store, children });
31
- function useI(token, key) {
31
+ function parseStateOverloads(store, ...rest) {
32
+ let token;
33
+ if (rest.length === 2) {
34
+ const family = rest[0];
35
+ const key = rest[1];
36
+ if (store.config.lifespan === `immortal`) {
37
+ const maybeToken = internal.seekInStore(family, key, store);
38
+ if (!maybeToken) {
39
+ throw new internal.NotFoundError(family, key, store);
40
+ }
41
+ token = maybeToken;
42
+ } else {
43
+ token = internal.findInStore(family, key, store);
44
+ }
45
+ } else {
46
+ token = rest[0];
47
+ }
48
+ return token;
49
+ }
50
+
51
+ // react/src/use-i.ts
52
+ function useI(...params) {
32
53
  const store = React5__namespace.useContext(StoreContext);
33
- const stateToken = token.type === `atom_family` || token.type === `mutable_atom_family` || token.type === `selector_family` ? internal.findInStore(token, key, store) : token;
54
+ const token = parseStateOverloads(store, ...params);
34
55
  const setter = React5__namespace.useRef(null);
35
56
  if (setter.current === null) {
36
57
  setter.current = (next) => {
37
- internal.setIntoStore(stateToken, next, store);
58
+ internal.setIntoStore(token, next, store);
38
59
  };
39
60
  }
40
61
  return setter.current;
41
62
  }
42
- function useO(token, key) {
63
+ function useO(...params) {
43
64
  const store = React5__namespace.useContext(StoreContext);
44
- const stateToken = token.type === `atom_family` || token.type === `mutable_atom_family` || token.type === `selector_family` || token.type === `readonly_selector_family` ? internal.seekInStore(token, key, store) : token;
45
- if (!stateToken) {
46
- throw new internal.NotFoundError(token, store);
47
- }
65
+ const token = parseStateOverloads(store, ...params);
48
66
  const id = React5__namespace.useId();
49
67
  return React5__namespace.useSyncExternalStore(
50
- (dispatch) => internal.subscribeToState(stateToken, dispatch, `use-o:${id}`, store),
51
- () => internal.getFromStore(stateToken, store),
52
- () => internal.getFromStore(stateToken, store)
68
+ (dispatch) => internal.subscribeToState(token, dispatch, `use-o:${id}`, store),
69
+ () => internal.getFromStore(token, store),
70
+ () => internal.getFromStore(token, store)
53
71
  );
54
72
  }
55
73
 
@@ -1,33 +1,51 @@
1
1
  import '../../dist/chunk-S4N6XNPH.js';
2
- import { IMPLICIT, findInStore, setIntoStore, seekInStore, NotFoundError, subscribeToState, getFromStore, getJsonToken, withdraw, subscribeToTimeline } from 'atom.io/internal';
2
+ import { IMPLICIT, setIntoStore, subscribeToState, getFromStore, findInStore, getJsonToken, withdraw, subscribeToTimeline, seekInStore, NotFoundError } from 'atom.io/internal';
3
3
  import * as React5 from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
  import { undo, redo } from 'atom.io';
6
6
 
7
7
  var StoreContext = React5.createContext(IMPLICIT.STORE);
8
8
  var StoreProvider = ({ children, store = IMPLICIT.STORE }) => /* @__PURE__ */ jsx(StoreContext.Provider, { value: store, children });
9
- function useI(token, key) {
9
+ function parseStateOverloads(store, ...rest) {
10
+ let token;
11
+ if (rest.length === 2) {
12
+ const family = rest[0];
13
+ const key = rest[1];
14
+ if (store.config.lifespan === `immortal`) {
15
+ const maybeToken = seekInStore(family, key, store);
16
+ if (!maybeToken) {
17
+ throw new NotFoundError(family, key, store);
18
+ }
19
+ token = maybeToken;
20
+ } else {
21
+ token = findInStore(family, key, store);
22
+ }
23
+ } else {
24
+ token = rest[0];
25
+ }
26
+ return token;
27
+ }
28
+
29
+ // react/src/use-i.ts
30
+ function useI(...params) {
10
31
  const store = React5.useContext(StoreContext);
11
- const stateToken = token.type === `atom_family` || token.type === `mutable_atom_family` || token.type === `selector_family` ? findInStore(token, key, store) : token;
32
+ const token = parseStateOverloads(store, ...params);
12
33
  const setter = React5.useRef(null);
13
34
  if (setter.current === null) {
14
35
  setter.current = (next) => {
15
- setIntoStore(stateToken, next, store);
36
+ setIntoStore(token, next, store);
16
37
  };
17
38
  }
18
39
  return setter.current;
19
40
  }
20
- function useO(token, key) {
41
+ function useO(...params) {
21
42
  const store = React5.useContext(StoreContext);
22
- const stateToken = token.type === `atom_family` || token.type === `mutable_atom_family` || token.type === `selector_family` || token.type === `readonly_selector_family` ? seekInStore(token, key, store) : token;
23
- if (!stateToken) {
24
- throw new NotFoundError(token, store);
25
- }
43
+ const token = parseStateOverloads(store, ...params);
26
44
  const id = React5.useId();
27
45
  return React5.useSyncExternalStore(
28
- (dispatch) => subscribeToState(stateToken, dispatch, `use-o:${id}`, store),
29
- () => getFromStore(stateToken, store),
30
- () => getFromStore(stateToken, store)
46
+ (dispatch) => subscribeToState(token, dispatch, `use-o:${id}`, store),
47
+ () => getFromStore(token, store),
48
+ () => getFromStore(token, store)
31
49
  );
32
50
  }
33
51
 
@@ -0,0 +1,43 @@
1
+ import type {
2
+ ReadableFamilyToken,
3
+ ReadableToken,
4
+ WritableFamilyToken,
5
+ WritableToken,
6
+ } from "atom.io"
7
+ import type { Store } from "atom.io/internal"
8
+ import { findInStore, NotFoundError, seekInStore } from "atom.io/internal"
9
+ import type { Json } from "atom.io/json"
10
+
11
+ export function parseStateOverloads<T, K extends Json.Serializable>(
12
+ store: Store,
13
+ ...rest: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]
14
+ ): WritableToken<T>
15
+
16
+ export function parseStateOverloads<T, K extends Json.Serializable>(
17
+ store: Store,
18
+ ...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
19
+ ): ReadableToken<T>
20
+
21
+ export function parseStateOverloads<T, K extends Json.Serializable>(
22
+ store: Store,
23
+ ...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
24
+ ): ReadableToken<T> {
25
+ let token: ReadableToken<any>
26
+ if (rest.length === 2) {
27
+ const family = rest[0]
28
+ const key = rest[1]
29
+
30
+ if (store.config.lifespan === `immortal`) {
31
+ const maybeToken = seekInStore(family, key, store)
32
+ if (!maybeToken) {
33
+ throw new NotFoundError(family, key, store)
34
+ }
35
+ token = maybeToken
36
+ } else {
37
+ token = findInStore(family, key, store)
38
+ }
39
+ } else {
40
+ token = rest[0]
41
+ }
42
+ return token
43
+ }
@@ -1,8 +1,9 @@
1
- import type { ReadableToken, WritableFamilyToken, WritableToken } from "atom.io"
2
- import { findInStore, setIntoStore } from "atom.io/internal"
1
+ import type { WritableFamilyToken, WritableToken } from "atom.io"
2
+ import { setIntoStore } from "atom.io/internal"
3
3
  import type { Json } from "atom.io/json"
4
4
  import * as React from "react"
5
5
 
6
+ import { parseStateOverloads } from "./parse-state-overloads"
6
7
  import { StoreContext } from "./store-context"
7
8
 
8
9
  export function useI<T>(
@@ -15,22 +16,16 @@ export function useI<T, K extends Json.Serializable>(
15
16
  ): <New extends T>(next: New | ((old: T) => New)) => void
16
17
 
17
18
  export function useI<T, K extends Json.Serializable>(
18
- token: WritableFamilyToken<T, K> | WritableToken<T>,
19
- key?: K,
19
+ ...params: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]
20
20
  ): <New extends T>(next: New | ((old: T) => New)) => void {
21
21
  const store = React.useContext(StoreContext)
22
- const stateToken: ReadableToken<any> =
23
- token.type === `atom_family` ||
24
- token.type === `mutable_atom_family` ||
25
- token.type === `selector_family`
26
- ? findInStore(token, key as K, store)
27
- : token
22
+ const token = parseStateOverloads(store, ...params)
28
23
  const setter: React.MutableRefObject<
29
24
  (<New extends T>(next: New | ((old: T) => New)) => void) | null
30
25
  > = React.useRef(null)
31
26
  if (setter.current === null) {
32
27
  setter.current = (next) => {
33
- setIntoStore(stateToken, next, store)
28
+ setIntoStore(token, next, store)
34
29
  }
35
30
  }
36
31
  return setter.current
@@ -1,13 +1,9 @@
1
1
  import type { ReadableFamilyToken, ReadableToken } from "atom.io"
2
- import {
3
- getFromStore,
4
- NotFoundError,
5
- seekInStore,
6
- subscribeToState,
7
- } from "atom.io/internal"
2
+ import { getFromStore, subscribeToState } from "atom.io/internal"
8
3
  import type { Json } from "atom.io/json"
9
4
  import * as React from "react"
10
5
 
6
+ import { parseStateOverloads } from "./parse-state-overloads"
11
7
  import { StoreContext } from "./store-context"
12
8
 
13
9
  export function useO<T>(token: ReadableToken<T>): T
@@ -18,24 +14,14 @@ export function useO<T, K extends Json.Serializable>(
18
14
  ): T
19
15
 
20
16
  export function useO<T, K extends Json.Serializable>(
21
- token: ReadableFamilyToken<T, K> | ReadableToken<T>,
22
- key?: K,
17
+ ...params: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
23
18
  ): T {
24
19
  const store = React.useContext(StoreContext)
25
- const stateToken: ReadableToken<any> | undefined =
26
- token.type === `atom_family` ||
27
- token.type === `mutable_atom_family` ||
28
- token.type === `selector_family` ||
29
- token.type === `readonly_selector_family`
30
- ? seekInStore(token, key as K, store)
31
- : token
32
- if (!stateToken) {
33
- throw new NotFoundError(token, store)
34
- }
20
+ const token = parseStateOverloads(store, ...params)
35
21
  const id = React.useId()
36
22
  return React.useSyncExternalStore<T>(
37
- (dispatch) => subscribeToState(stateToken, dispatch, `use-o:${id}`, store),
38
- () => getFromStore(stateToken, store),
39
- () => getFromStore(stateToken, store),
23
+ (dispatch) => subscribeToState(token, dispatch, `use-o:${id}`, store),
24
+ () => getFromStore(token, store),
25
+ () => getFromStore(token, store),
40
26
  )
41
27
  }