atom.io 0.28.2 → 0.29.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.
@@ -33,57 +33,56 @@ export function initFamilyMemberInStore<
33
33
  store: Store,
34
34
  token: MutableAtomFamilyToken<T, J, K>,
35
35
  key: Key,
36
- ): MutableAtomToken<T, J>
36
+ ): MutableAtomToken<T, J, K>
37
37
 
38
38
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
39
39
  store: Store,
40
40
  token: RegularAtomFamilyToken<T, K>,
41
41
  key: Key,
42
- ): RegularAtomToken<T>
42
+ ): RegularAtomToken<T, K>
43
43
 
44
44
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
45
45
  store: Store,
46
46
  token: AtomFamilyToken<T, K>,
47
47
  key: Key,
48
- ): AtomToken<T>
48
+ ): AtomToken<T, K>
49
49
 
50
50
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
51
51
  store: Store,
52
52
  token: WritableSelectorFamilyToken<T, K>,
53
53
  key: Key,
54
- ): WritableSelectorToken<T>
54
+ ): WritableSelectorToken<T, K>
55
55
 
56
56
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
57
57
  store: Store,
58
58
  token: ReadonlySelectorFamilyToken<T, K>,
59
59
  key: Key,
60
- ): ReadonlySelectorToken<T>
60
+ ): ReadonlySelectorToken<T, K>
61
61
 
62
62
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
63
63
  store: Store,
64
64
  token: SelectorFamilyToken<T, K>,
65
65
  key: Key,
66
- ): SelectorToken<T>
66
+ ): SelectorToken<T, K>
67
67
 
68
68
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
69
69
  store: Store,
70
70
  token: WritableFamilyToken<T, K>,
71
71
  key: Key,
72
- ): WritableToken<T>
72
+ ): WritableToken<T, K>
73
73
 
74
74
  export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
75
75
  store: Store,
76
76
  token: ReadableFamilyToken<T, K>,
77
77
  key: Key,
78
- ): ReadableToken<T>
78
+ ): ReadableToken<T, K>
79
79
 
80
80
  export function initFamilyMemberInStore(
81
81
  store: Store,
82
82
  token: ReadableFamilyToken<any, any>,
83
83
  key: Json.Serializable,
84
84
  ): ReadableToken<any> {
85
- const familyKey = token.key
86
- const family = store.families.get(familyKey)
85
+ const family = store.families.get(token.key)
87
86
  if (family === undefined) {
88
87
  throw new NotFoundError(token, store)
89
88
  }
@@ -37,49 +37,49 @@ export function seekInStore<
37
37
  store: Store,
38
38
  token: MutableAtomFamilyToken<T, J, K>,
39
39
  key: Key,
40
- ): MutableAtomToken<T, J> | undefined
40
+ ): MutableAtomToken<T, J, K> | undefined
41
41
 
42
42
  export function seekInStore<T, K extends Canonical, Key extends K>(
43
43
  store: Store,
44
44
  token: RegularAtomFamilyToken<T, K>,
45
45
  key: Key,
46
- ): RegularAtomToken<T> | undefined
46
+ ): RegularAtomToken<T, K> | undefined
47
47
 
48
48
  export function seekInStore<T, K extends Canonical, Key extends K>(
49
49
  store: Store,
50
50
  token: AtomFamilyToken<T, K>,
51
51
  key: Key,
52
- ): AtomToken<T> | undefined
52
+ ): AtomToken<T, K> | undefined
53
53
 
54
54
  export function seekInStore<T, K extends Canonical, Key extends K>(
55
55
  store: Store,
56
56
  token: WritableSelectorFamilyToken<T, K>,
57
57
  key: Key,
58
- ): WritableSelectorToken<T> | undefined
58
+ ): WritableSelectorToken<T, K> | undefined
59
59
 
60
60
  export function seekInStore<T, K extends Canonical, Key extends K>(
61
61
  store: Store,
62
62
  token: ReadonlySelectorFamilyToken<T, K>,
63
63
  key: Key,
64
- ): ReadonlySelectorToken<T> | undefined
64
+ ): ReadonlySelectorToken<T, K> | undefined
65
65
 
66
66
  export function seekInStore<T, K extends Canonical, Key extends K>(
67
67
  store: Store,
68
68
  token: SelectorFamilyToken<T, K>,
69
69
  key: Key,
70
- ): SelectorToken<T> | undefined
70
+ ): SelectorToken<T, K> | undefined
71
71
 
72
72
  export function seekInStore<T, K extends Canonical, Key extends K>(
73
73
  store: Store,
74
74
  token: WritableFamilyToken<T, K>,
75
75
  key: Key,
76
- ): WritableToken<T> | undefined
76
+ ): WritableToken<T, K> | undefined
77
77
 
78
78
  export function seekInStore<T, K extends Canonical, Key extends K>(
79
79
  store: Store,
80
80
  token: ReadableFamilyToken<T, K>,
81
81
  key: Key,
82
- ): ReadableToken<T> | undefined
82
+ ): ReadableToken<T, K> | undefined
83
83
 
84
84
  export function seekInStore<M extends MoleculeConstructor>(
85
85
  store: Store,
@@ -6,9 +6,11 @@ import type {
6
6
  ReadableFamilyToken,
7
7
  ReadableToken,
8
8
  } from "atom.io"
9
- import { type Canonical, stringifyJson } from "atom.io/json"
9
+ import { type Canonical, parseJson } from "atom.io/json"
10
+ import { M } from "vitest/dist/chunks/environment.0M5R1SX_.js"
10
11
 
11
12
  import { findInStore, seekInStore } from "../families"
13
+ import { getFamilyOfToken } from "../families/get-family-of-token"
12
14
  import { NotFoundError } from "../not-found-error"
13
15
  import type { Store } from "../store"
14
16
  import { counterfeit, withdraw } from "../store"
@@ -58,11 +60,23 @@ export function getFromStore(
58
60
  | [token: ReadableToken<any>]
59
61
  ): any {
60
62
  let token: MoleculeToken<any> | ReadableToken<any>
63
+ let family:
64
+ | MoleculeFamilyToken<any>
65
+ | ReadableFamilyToken<any, Canonical>
66
+ | null
67
+ let key: Canonical | null
61
68
  if (params.length === 1) {
62
69
  token = params[0]
70
+ if (token.type !== `molecule`) {
71
+ family = getFamilyOfToken(store, token) ?? null
72
+ if (family) {
73
+ key = token.family ? parseJson(token.family.subKey) : null
74
+ token = findInStore(store, family, key)
75
+ }
76
+ }
63
77
  } else {
64
- const family = params[0]
65
- const key = params[1]
78
+ family = params[0]
79
+ key = params[1]
66
80
  let maybeToken: MoleculeToken<any> | ReadableToken<any>
67
81
  if (family.type === `molecule_family`) {
68
82
  maybeToken = seekInStore(store, family, key) ?? counterfeit(family, key)
@@ -72,7 +86,7 @@ export function getFromStore(
72
86
  token = maybeToken
73
87
  }
74
88
  if (`counterfeit` in token && `family` in token) {
75
- const family =
89
+ family =
76
90
  token.type === `molecule`
77
91
  ? withdraw(token.family, store)
78
92
  : // biome-ignore lint/style/noNonNullAssertion: family must be present
@@ -7,7 +7,11 @@ import type {
7
7
  } from "atom.io"
8
8
  import { parseJson, stringifyJson } from "atom.io/json"
9
9
 
10
- import { disposeFromStore, initFamilyMemberInStore } from "../families"
10
+ import {
11
+ disposeFromStore,
12
+ findInStore,
13
+ initFamilyMemberInStore,
14
+ } from "../families"
11
15
  import { growMoleculeInStore, makeMoleculeInStore } from "../molecule"
12
16
  import { type Store, withdraw } from "../store"
13
17
 
@@ -18,7 +22,7 @@ export function ingestCreationEvent(
18
22
  ): void {
19
23
  switch (applying) {
20
24
  case `newValue`: {
21
- createInStore(update.token, store)
25
+ createInStore(update, store)
22
26
  break
23
27
  }
24
28
  case `oldValue`: {
@@ -29,7 +33,7 @@ export function ingestCreationEvent(
29
33
  }
30
34
 
31
35
  export function ingestDisposalEvent(
32
- update: StateDisposal<any>,
36
+ update: StateDisposal<ReadableToken<any>>,
33
37
  applying: `newValue` | `oldValue`,
34
38
  store: Store,
35
39
  ): void {
@@ -39,35 +43,22 @@ export function ingestDisposalEvent(
39
43
  break
40
44
  }
41
45
  case `oldValue`: {
42
- createInStore(update.token, store)
46
+ createInStore(update, store)
43
47
  store.valueMap.set(update.token.key, update.value)
44
48
  break
45
49
  }
46
50
  }
47
51
  }
48
52
 
49
- function createInStore(token: ReadableToken<any>, store: Store): void {
50
- if (token.family) {
51
- const family = store.families.get(token.family.key)
53
+ function createInStore(
54
+ update: StateCreation<any> | StateDisposal<any>,
55
+ store: Store,
56
+ ): void {
57
+ const { family: familyMeta } = update.token
58
+ if (familyMeta) {
59
+ const family = store.families.get(familyMeta.key)
52
60
  if (family) {
53
- const molecule = store.molecules.get(token.family.subKey)
54
- if (molecule) {
55
- growMoleculeInStore(molecule, family, store)
56
- return
57
- }
58
- if (store.config.lifespan === `immortal`) {
59
- store.logger.error(
60
- `🐞`,
61
- `atom`,
62
- token.family.key,
63
- `tried to create member`,
64
- `"${token.family.subKey}"`,
65
- `but a molecule with that key was not found in store`,
66
- `"${store.config.name}"`,
67
- )
68
- return
69
- }
70
- initFamilyMemberInStore(store, family, parseJson(token.family.subKey))
61
+ findInStore(store, family, parseJson(familyMeta.subKey))
71
62
  }
72
63
  }
73
64
  }
@@ -52,19 +52,6 @@ export function disposeSelector(
52
52
  }
53
53
  target.valueMap.delete(key)
54
54
  target.selectorAtoms.delete(key)
55
- const downstreamTokens = target.selectorGraph
56
- .getRelationEntries({ upstreamSelectorKey: key })
57
- .filter(([_, { source }]) => source === key)
58
- .map(
59
- ([downstreamSelectorKey]) =>
60
- target.selectors.get(downstreamSelectorKey) ??
61
- target.readonlySelectors.get(downstreamSelectorKey),
62
- )
63
- for (const downstreamToken of downstreamTokens) {
64
- if (downstreamToken) {
65
- disposeSelector(downstreamToken, store)
66
- }
67
- }
68
55
  target.selectorGraph.delete(key)
69
56
  store.logger.info(`🔥`, selectorToken.type, key, `deleted`)
70
57
  if (isChildStore(target) && target.transactionMeta.phase === `building`) {
@@ -1,7 +1,8 @@
1
1
  import type { WritableFamilyToken, WritableToken } from "atom.io"
2
- import { type Canonical, stringifyJson } from "atom.io/json"
2
+ import { type Canonical, parseJson, stringifyJson } from "atom.io/json"
3
3
 
4
4
  import { findInStore } from "../families"
5
+ import { getFamilyOfToken } from "../families/get-family-of-token"
5
6
  import { closeOperation, openOperation } from "../operation"
6
7
  import type { Store } from "../store"
7
8
  import { withdraw } from "../store"
@@ -31,17 +32,24 @@ export function setIntoStore<T, New extends T>(
31
32
  | [token: WritableToken<T>, value: New | ((oldValue: T) => New)]
32
33
  ): void {
33
34
  let token: WritableToken<T>
35
+ let family: WritableFamilyToken<T, Canonical> | null
36
+ let key: Canonical | null
34
37
  let value: New | ((oldValue: T) => New)
35
38
  if (params.length === 2) {
36
39
  token = params[0]
37
40
  value = params[1]
41
+ family = getFamilyOfToken(store, token) ?? null
42
+ if (family) {
43
+ key = token.family ? parseJson(token.family.subKey) : null
44
+ token = findInStore(store, family, key)
45
+ }
38
46
  } else {
39
- const family = params[0]
40
- const key = params[1]
47
+ family = params[0]
48
+ key = params[1]
41
49
  value = params[2]
42
- const maybeToken = findInStore(store, family, key)
43
- token = maybeToken
50
+ token = findInStore(store, family, key)
44
51
  }
52
+
45
53
  if (`counterfeit` in token) {
46
54
  const disposal = store.disposalTraces.buffer.find(
47
55
  (item) => item?.key === token.key,
@@ -1,7 +1,7 @@
1
1
  import { Range, Flat, Store, Transceiver } from 'atom.io/internal';
2
2
  import * as AtomIO from 'atom.io';
3
3
 
4
- type Entries<K extends keyof any = keyof any, V = any> = [K, V][];
4
+ type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][];
5
5
  type KeyOfEntries<E extends Entries> = E extends [infer K, any][] ? K : never;
6
6
  type ValueOfEntry<E extends Entries, K extends KeyOfEntries<E>> = {
7
7
  [P in Range<E[`length`]>]: E[P] extends [K, infer V] ? V : never;
@@ -32,8 +32,8 @@ declare namespace Json {
32
32
  type Object<Key extends string = string, Value extends Serializable = Serializable> = Record<Key, Value>;
33
33
  type Array<Element extends Serializable = Serializable> = ReadonlyArray<Element>;
34
34
  }
35
- type stringified<J extends Json.Serializable> = string & {
36
- __json: J;
35
+ type stringified<J extends Json.Serializable> = J extends string ? `"${J}"` : J extends number ? `${J}` : J extends true ? `true` : J extends false ? `false` : J extends boolean ? `false` | `true` : J extends null ? `null` : string & {
36
+ __json?: J;
37
37
  };
38
38
  declare const parseJson: <S extends stringified<Json.Serializable>>(str: S | string) => S extends stringified<infer J> ? J : Json.Serializable;
39
39
  declare const stringifyJson: <J extends Json.Serializable>(json: J) => stringified<J>;
@@ -1,4 +1,4 @@
1
- import { createWritableSelectorFamily } from '../../dist/chunk-D3ZPRYEW.js';
1
+ import { createWritableSelectorFamily } from '../../dist/chunk-4WXELLFT.js';
2
2
  import '../../dist/chunk-IBTHB2PI.js';
3
3
  import '../../dist/chunk-XWL6SNVU.js';
4
4
  import { createStandaloneSelector, IMPLICIT, growMoleculeInStore, initFamilyMemberInStore, withdraw, seekInStore } from 'atom.io/internal';
@@ -1,6 +1,6 @@
1
1
  import type { Flat, Range } from "atom.io/internal"
2
2
 
3
- export type Entries<K extends keyof any = keyof any, V = any> = [K, V][]
3
+ export type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][]
4
4
 
5
5
  export type KeyOfEntries<E extends Entries> = E extends [infer K, any][]
6
6
  ? K
package/json/src/index.ts CHANGED
@@ -27,7 +27,19 @@ export namespace Json {
27
27
  ReadonlyArray<Element>
28
28
  }
29
29
 
30
- export type stringified<J extends Json.Serializable> = string & { __json: J }
30
+ export type stringified<J extends Json.Serializable> = J extends string
31
+ ? `"${J}"`
32
+ : J extends number
33
+ ? `${J}`
34
+ : J extends true
35
+ ? `true`
36
+ : J extends false
37
+ ? `false`
38
+ : J extends boolean
39
+ ? `false` | `true`
40
+ : J extends null
41
+ ? `null`
42
+ : string & { __json?: J }
31
43
 
32
44
  export const parseJson = <S extends stringified<Json.Serializable>>(
33
45
  str: S | string,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.28.2",
3
+ "version": "0.29.1",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -52,37 +52,37 @@
52
52
  }
53
53
  },
54
54
  "devDependencies": {
55
- "@testing-library/react": "16.0.0",
55
+ "@testing-library/react": "16.0.1",
56
56
  "@types/eslint": "9.6.1",
57
57
  "@types/estree": "1.0.5",
58
58
  "@types/http-proxy": "1.17.15",
59
59
  "@types/npmlog": "7.0.0",
60
- "@types/react": "18.3.4",
60
+ "@types/react": "18.3.5",
61
61
  "@types/tmp": "0.2.6",
62
- "@typescript-eslint/parser": "8.3.0",
63
- "@typescript-eslint/rule-tester": "8.3.0",
62
+ "@typescript-eslint/parser": "8.5.0",
63
+ "@typescript-eslint/rule-tester": "8.5.0",
64
64
  "@vitest/coverage-v8": "2.0.5",
65
65
  "@vitest/ui": "2.0.5",
66
- "concurrently": "8.2.2",
66
+ "concurrently": "9.0.1",
67
67
  "drizzle-kit": "0.24.2",
68
68
  "drizzle-orm": "0.33.0",
69
- "eslint": "9.9.1",
70
- "framer-motion": "11.3.30",
71
- "happy-dom": "15.0.0",
69
+ "eslint": "9.10.0",
70
+ "framer-motion": "11.5.4",
71
+ "happy-dom": "15.7.4",
72
72
  "http-proxy": "1.18.1",
73
73
  "npmlog": "7.0.1",
74
74
  "postgres": "3.4.4",
75
75
  "preact": "10.23.2",
76
76
  "react": "18.3.1",
77
77
  "react-dom": "18.3.1",
78
- "react-router-dom": "6.26.1",
78
+ "react-router-dom": "6.26.2",
79
79
  "socket.io": "4.7.5",
80
80
  "socket.io-client": "4.7.5",
81
81
  "tmp": "0.2.3",
82
82
  "tsup": "8.2.4",
83
- "tsx": "4.19.0",
84
- "typescript": "5.5.4",
85
- "vite": "5.4.2",
83
+ "tsx": "4.19.1",
84
+ "typescript": "5.6.2",
85
+ "vite": "5.4.4",
86
86
  "vite-tsconfig-paths": "5.0.1",
87
87
  "vitest": "2.0.5"
88
88
  },
@@ -14,21 +14,19 @@ interface EventBuffer<Key extends string, Params extends Json.Serializable[]> ex
14
14
  toString(): StringifiedEvent<Key, Params>;
15
15
  }
16
16
  declare class CustomSocket<I extends Events, O extends Events> implements Socket {
17
- emit: <Event extends keyof O>(event: Event, ...args: O[Event]) => CustomSocket<I, O>;
18
- protected listeners: Map<keyof I, Set<(...args: Json.Array) => void>>;
17
+ emit: <Event extends keyof I>(event: Event, ...args: I[Event]) => CustomSocket<I, O>;
18
+ protected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>;
19
19
  protected globalListeners: Set<(event: string, ...args: Json.Array) => void>;
20
20
  protected handleEvent<Event extends keyof I>(event: string, ...args: I[Event]): void;
21
21
  id: string;
22
- constructor(emit: <Event extends keyof O>(event: Event, ...args: O[Event]) => CustomSocket<I, O>);
23
- on<Event extends keyof I>(event: Event, listener: (...args: I[Event]) => void): this;
22
+ constructor(emit: <Event extends keyof I>(event: Event, ...args: I[Event]) => CustomSocket<I, O>);
23
+ on<Event extends keyof O>(event: Event, listener: (...args: O[Event]) => void): this;
24
24
  onAny(listener: (event: string, ...args: Json.Array) => void): this;
25
- off<Event extends keyof I>(event: Event, listener?: (...args: I[Event]) => void): this;
25
+ off<Event extends keyof O>(event: Event, listener?: (...args: O[Event]) => void): this;
26
26
  offAny(listener: (event: string, ...args: Json.Array) => void): this;
27
27
  }
28
28
 
29
- declare class ChildSocket<I extends Events, O extends Events & {
30
- "setup-relay": [string];
31
- }> extends CustomSocket<I, O> {
29
+ declare class ChildSocket<I extends Events, O extends Events> extends CustomSocket<I, O> {
32
30
  process: ChildProcessWithoutNullStreams;
33
31
  key: string;
34
32
  logger: {
@@ -58,12 +56,12 @@ declare class SubjectSocket<I extends Events, O extends Events> extends CustomSo
58
56
  dispose(): void;
59
57
  }
60
58
  declare class ParentSocket<I extends Events & {
59
+ [id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
60
+ }, O extends Events & {
61
61
  [id in string as `user:${id}`]: [string, ...Json.Serializable[]];
62
62
  } & {
63
63
  "user-joins": [string];
64
64
  "user-leaves": [string];
65
- }, O extends Events & {
66
- [id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
67
65
  }> extends CustomSocket<I, O> {
68
66
  protected incompleteData: string;
69
67
  protected unprocessedEvents: string[];
@@ -10,11 +10,7 @@ import { CustomSocket } from "./custom-socket"
10
10
 
11
11
  export class ChildSocket<
12
12
  I extends Events,
13
- O extends Events & {
14
- /* eslint-disable quotes */
15
- "setup-relay": [string]
16
- /* eslint-enable quotes */
17
- },
13
+ O extends Events,
18
14
  > extends CustomSocket<I, O> {
19
15
  protected incompleteData = ``
20
16
  protected unprocessedEvents: string[] = []
@@ -17,7 +17,7 @@ export interface EventBuffer<
17
17
  }
18
18
 
19
19
  export class CustomSocket<I extends Events, O extends Events> implements Socket {
20
- protected listeners: Map<keyof I, Set<(...args: Json.Array) => void>>
20
+ protected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>
21
21
  protected globalListeners: Set<(event: string, ...args: Json.Array) => void>
22
22
  protected handleEvent<Event extends keyof I>(
23
23
  event: string,
@@ -37,18 +37,18 @@ export class CustomSocket<I extends Events, O extends Events> implements Socket
37
37
  public id = `no_id_retrieved`
38
38
 
39
39
  public constructor(
40
- public emit: <Event extends keyof O>(
40
+ public emit: <Event extends keyof I>(
41
41
  event: Event,
42
- ...args: O[Event]
42
+ ...args: I[Event]
43
43
  ) => CustomSocket<I, O>,
44
44
  ) {
45
45
  this.listeners = new Map()
46
46
  this.globalListeners = new Set()
47
47
  }
48
48
 
49
- public on<Event extends keyof I>(
49
+ public on<Event extends keyof O>(
50
50
  event: Event,
51
- listener: (...args: I[Event]) => void,
51
+ listener: (...args: O[Event]) => void,
52
52
  ): this {
53
53
  const listeners = this.listeners.get(event)
54
54
  if (listeners) {
@@ -64,9 +64,9 @@ export class CustomSocket<I extends Events, O extends Events> implements Socket
64
64
  return this
65
65
  }
66
66
 
67
- public off<Event extends keyof I>(
67
+ public off<Event extends keyof O>(
68
68
  event: Event,
69
- listener?: (...args: I[Event]) => void,
69
+ listener?: (...args: O[Event]) => void,
70
70
  ): this {
71
71
  const listeners = this.listeners.get(event)
72
72
  if (listeners) {
@@ -37,6 +37,9 @@ export class SubjectSocket<
37
37
 
38
38
  export class ParentSocket<
39
39
  I extends Events & {
40
+ [id in string as `relay:${id}`]: [string, ...Json.Serializable[]]
41
+ },
42
+ O extends Events & {
40
43
  [id in string as `user:${id}`]: [string, ...Json.Serializable[]]
41
44
  } & {
42
45
  /* eslint-disable quotes */
@@ -44,9 +47,6 @@ export class ParentSocket<
44
47
  "user-leaves": [string]
45
48
  /* eslint-enable quotes */
46
49
  },
47
- O extends Events & {
48
- [id in string as `relay:${id}`]: [string, ...Json.Serializable[]]
49
- },
50
50
  > extends CustomSocket<I, O> {
51
51
  protected incompleteData = ``
52
52
  protected unprocessedEvents: string[] = []
@@ -167,7 +167,7 @@ export class ParentSocket<
167
167
  relay.in.next(data)
168
168
  })
169
169
  relay.out.subscribe(`socket`, (data) => {
170
- this.emit(...(data as [string, ...O[keyof O]]))
170
+ this.emit(...(data as [string, ...I[keyof I]]))
171
171
  })
172
172
  })
173
173
 
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Transceiver } from "atom.io/internal"
2
- import type { Canonical, Json } from "atom.io/json"
2
+ import type { Canonical, Json, stringified } from "atom.io/json"
3
3
 
4
4
  import type { AtomFamilyToken } from "./atom"
5
5
  import type {
@@ -20,44 +20,49 @@ export * from "./timeline"
20
20
  export * from "./transaction"
21
21
  export * from "./validators"
22
22
 
23
- export type RegularAtomToken<T> = {
23
+ export type RegularAtomToken<T, K extends Canonical = any> = {
24
24
  key: string
25
25
  type: `atom`
26
- family?: FamilyMetadata
26
+ family?: FamilyMetadata<K>
27
27
  __T?: T
28
28
  }
29
29
  export type MutableAtomToken<
30
30
  T extends Transceiver<any>,
31
31
  J extends Json.Serializable,
32
+ K extends Canonical = any,
32
33
  > = {
33
34
  key: string
34
35
  type: `mutable_atom`
35
- family?: FamilyMetadata
36
+ family?: FamilyMetadata<K>
36
37
  __J?: J
37
38
  __U?: T extends Transceiver<infer Update> ? Update : never
38
39
  }
39
- export type AtomToken<T> =
40
- | MutableAtomToken<T extends Transceiver<any> ? T : never, any>
41
- | RegularAtomToken<T>
40
+ export type AtomToken<T, K extends Canonical = any> =
41
+ | MutableAtomToken<T extends Transceiver<any> ? T : never, any, K>
42
+ | RegularAtomToken<T, K>
42
43
 
43
- export type WritableSelectorToken<T> = {
44
+ export type WritableSelectorToken<T, K extends Canonical = any> = {
44
45
  key: string
45
46
  type: `selector`
46
- family?: FamilyMetadata
47
+ family?: FamilyMetadata<K>
47
48
  __T?: T
48
49
  }
49
- export type ReadonlySelectorToken<T> = {
50
+ export type ReadonlySelectorToken<T, K extends Canonical = any> = {
50
51
  key: string
51
52
  type: `readonly_selector`
52
- family?: FamilyMetadata
53
+ family?: FamilyMetadata<K>
53
54
  __T?: T
54
55
  }
55
- export type SelectorToken<T> =
56
- | ReadonlySelectorToken<T>
57
- | WritableSelectorToken<T>
56
+ export type SelectorToken<T, K extends Canonical = any> =
57
+ | ReadonlySelectorToken<T, K>
58
+ | WritableSelectorToken<T, K>
58
59
 
59
- export type WritableToken<T> = AtomToken<T> | WritableSelectorToken<T>
60
- export type ReadableToken<T> = AtomToken<T> | SelectorToken<T>
60
+ export type WritableToken<T, K extends Canonical = any> =
61
+ | AtomToken<T, K>
62
+ | WritableSelectorToken<T, K>
63
+ export type ReadableToken<T, K extends Canonical = any> =
64
+ | AtomToken<T, K>
65
+ | SelectorToken<T, K>
61
66
 
62
67
  export type WritableFamilyToken<T, K extends Canonical> =
63
68
  | AtomFamilyToken<T, K>
@@ -66,4 +71,7 @@ export type ReadableFamilyToken<T, K extends Canonical> =
66
71
  | AtomFamilyToken<T, K>
67
72
  | SelectorFamilyToken<T, K>
68
73
 
69
- export type FamilyMetadata = { key: string; subKey: string }
74
+ export type FamilyMetadata<K extends Canonical = any> = {
75
+ key: string
76
+ subKey: stringified<K>
77
+ }