atom.io 0.44.14 → 0.45.0

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 (72) hide show
  1. package/dist/eslint-plugin/index.js +1 -1
  2. package/dist/introspection/index.d.ts +3 -2
  3. package/dist/introspection/index.d.ts.map +1 -1
  4. package/dist/introspection/index.js.map +1 -1
  5. package/dist/json/index.d.ts +34 -20
  6. package/dist/json/index.d.ts.map +1 -1
  7. package/dist/json/index.js +40 -2
  8. package/dist/json/index.js.map +1 -1
  9. package/dist/main/index.d.ts +3 -3
  10. package/dist/main/index.d.ts.map +1 -1
  11. package/dist/main/index.js +3 -2
  12. package/dist/main/index.js.map +1 -1
  13. package/dist/react/index.d.ts +4 -4
  14. package/dist/react/index.d.ts.map +1 -1
  15. package/dist/react/index.js.map +1 -1
  16. package/dist/react-devtools/index.js.map +1 -1
  17. package/dist/realtime-client/index.d.ts +1 -1
  18. package/dist/realtime-client/index.d.ts.map +1 -1
  19. package/dist/realtime-client/index.js.map +1 -1
  20. package/dist/realtime-server/index.d.ts +5 -0
  21. package/dist/realtime-server/index.d.ts.map +1 -1
  22. package/dist/realtime-server/index.js +38 -12
  23. package/dist/realtime-server/index.js.map +1 -1
  24. package/dist/realtime-testing/index.d.ts.map +1 -1
  25. package/dist/realtime-testing/index.js +3 -9
  26. package/dist/realtime-testing/index.js.map +1 -1
  27. package/dist/transceivers/o-list/index.d.ts +1 -2
  28. package/dist/transceivers/o-list/index.d.ts.map +1 -1
  29. package/dist/transceivers/o-list/index.js +23 -24
  30. package/dist/transceivers/o-list/index.js.map +1 -1
  31. package/dist/transceivers/u-list/index.d.ts +1 -2
  32. package/dist/transceivers/u-list/index.d.ts.map +1 -1
  33. package/dist/transceivers/u-list/index.js +5 -6
  34. package/dist/transceivers/u-list/index.js.map +1 -1
  35. package/package.json +2 -10
  36. package/src/introspection/attach-introspection-states.ts +1 -1
  37. package/src/introspection/attach-transaction-logs.ts +2 -2
  38. package/src/introspection/index.ts +3 -0
  39. package/src/json/canonical.ts +42 -0
  40. package/src/json/enumeration.ts +36 -0
  41. package/src/json/index.ts +3 -132
  42. package/src/json/json.ts +128 -0
  43. package/src/main/index.ts +9 -2
  44. package/src/main/logger.ts +4 -2
  45. package/src/react/use-loadable.ts +10 -5
  46. package/src/react-devtools/TransactionIndex.tsx +1 -1
  47. package/src/react-devtools/store.ts +3 -3
  48. package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +2 -2
  49. package/src/realtime-server/realtime-family-provider.ts +44 -0
  50. package/src/realtime-server/realtime-mutable-family-provider.ts +38 -0
  51. package/src/realtime-server/realtime-mutable-provider.ts +19 -0
  52. package/src/realtime-server/realtime-server-stores/provide-rooms.ts +2 -1
  53. package/src/realtime-server/realtime-state-provider.ts +20 -0
  54. package/src/realtime-server/server-config.ts +2 -1
  55. package/src/realtime-testing/setup-realtime-test.tsx +3 -9
  56. package/src/transceivers/o-list/o-list.ts +27 -28
  57. package/src/transceivers/u-list/u-list.ts +7 -8
  58. package/dist/data/index.d.ts +0 -23
  59. package/dist/data/index.d.ts.map +0 -1
  60. package/dist/data/index.js +0 -63
  61. package/dist/data/index.js.map +0 -1
  62. package/dist/struct/index.d.ts +0 -14
  63. package/dist/struct/index.d.ts.map +0 -1
  64. package/dist/struct/index.js +0 -37
  65. package/dist/struct/index.js.map +0 -1
  66. package/src/data/dict.ts +0 -31
  67. package/src/data/index.ts +0 -3
  68. package/src/data/struct-family.ts +0 -53
  69. package/src/data/struct.ts +0 -54
  70. package/src/struct/index.ts +0 -1
  71. package/src/struct/micro.ts +0 -72
  72. /package/dist/{chunk-D8lmAICg.js → chunk-CKcAJnC7.js} +0 -0
@@ -1,8 +1,7 @@
1
1
  import type { Fn, Transceiver, TransceiverMode } from "atom.io/internal"
2
2
  import { Subject } from "atom.io/internal"
3
- import type { primitive } from "atom.io/json"
4
- import type { Enumeration } from "atom.io/struct"
5
- import { enumeration, packValue, unpackValue } from "atom.io/struct"
3
+ import type { Enumeration, packed, primitive } from "atom.io/json"
4
+ import { enumeration, packCanonical, unpackCanonical } from "atom.io/json"
6
5
 
7
6
  export type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>
8
7
  export type ArrayUpdate<P extends primitive> =
@@ -462,9 +461,9 @@ export class OList<P extends primitive>
462
461
  let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`
463
462
  switch (update.type) {
464
463
  case `set`:
465
- packed += update.index + `\u001E` + packValue(update.next)
464
+ packed += update.index + `\u001E` + packCanonical(update.next)
466
465
  if (update.prev !== undefined) {
467
- packed += `\u001E` + packValue(update.prev)
466
+ packed += `\u001E` + packCanonical(update.prev)
468
467
  }
469
468
  return packed
470
469
  case `truncate`:
@@ -472,35 +471,35 @@ export class OList<P extends primitive>
472
471
  packed +
473
472
  update.length +
474
473
  `\u001E` +
475
- update.items.map(packValue).join(`\u001E`)
474
+ update.items.map(packCanonical).join(`\u001E`)
476
475
  )
477
476
  case `extend`:
478
477
  return packed + update.next + `\u001E` + update.prev
479
478
  case `pop`:
480
479
  case `shift`:
481
480
  if (update.value !== undefined) {
482
- packed += packValue(update.value)
481
+ packed += packCanonical(update.value)
483
482
  }
484
483
  return packed
485
484
  case `push`:
486
485
  case `unshift`:
487
- return packed + update.items.map(packValue).join(`\u001E`)
486
+ return packed + update.items.map(packCanonical).join(`\u001E`)
488
487
  case `copyWithin`:
489
488
  packed += update.target + `\u001E` + update.start
490
489
  if (update.end !== undefined) {
491
490
  packed += `\u001E` + update.end
492
491
  }
493
- packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
492
+ packed += `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`)
494
493
  return packed
495
494
  case `fill`:
496
- packed += packValue(update.value)
495
+ packed += packCanonical(update.value)
497
496
  if (update.start !== undefined) {
498
497
  packed += `\u001E` + update.start
499
498
  }
500
499
  if (update.end !== undefined) {
501
500
  packed += `\u001E` + update.end
502
501
  }
503
- packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
502
+ packed += `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`)
504
503
  return packed
505
504
  case `splice`:
506
505
  return (
@@ -509,18 +508,18 @@ export class OList<P extends primitive>
509
508
  `\u001E\u001E` +
510
509
  update.deleteCount +
511
510
  `\u001E\u001E` +
512
- update.items.map(packValue).join(`\u001E`) +
511
+ update.items.map(packCanonical).join(`\u001E`) +
513
512
  `\u001E\u001E` +
514
- update.deleted.map(packValue).join(`\u001E`)
513
+ update.deleted.map(packCanonical).join(`\u001E`)
515
514
  )
516
515
  case `reverse`:
517
516
  return packed
518
517
  case `sort`:
519
518
  return (
520
519
  packed +
521
- update.next.map(packValue).join(`\u001E`) +
520
+ update.next.map(packCanonical).join(`\u001E`) +
522
521
  `\u001E\u001E` +
523
- update.prev.map(packValue).join(`\u001E`)
522
+ update.prev.map(packCanonical).join(`\u001E`)
524
523
  )
525
524
  }
526
525
  }
@@ -530,24 +529,24 @@ export class OList<P extends primitive>
530
529
  ): ArrayUpdate<P> {
531
530
  const [head, tail] = packed.split(`\u001F`) as [
532
531
  Extract<keyof typeof ARRAY_UPDATE_ENUM, number>,
533
- string,
532
+ packed<P>,
534
533
  ]
535
534
  const type = ARRAY_UPDATE_ENUM[head]
536
535
  switch (type) {
537
536
  case `set`: {
538
537
  const [i, n, p] = tail.split(`\u001E`)
539
538
  const index = +i
540
- const next = unpackValue(n) as P
539
+ const next = unpackCanonical<P>(n)
541
540
  if (p === undefined) {
542
541
  return { type, index, next }
543
542
  }
544
- const prev = unpackValue(p) as P
543
+ const prev = unpackCanonical<P>(p)
545
544
  return { type, index, next, prev }
546
545
  }
547
546
  case `truncate`: {
548
547
  const [l, ...i] = tail.split(`\u001E`)
549
548
  const length = +l
550
- const items = i.map(unpackValue) as P[]
549
+ const items = i.map<P>(unpackCanonical)
551
550
  return { type, length, items }
552
551
  }
553
552
  case `extend`: {
@@ -559,18 +558,18 @@ export class OList<P extends primitive>
559
558
  case `pop`:
560
559
  case `shift`:
561
560
  if (tail !== ``) {
562
- const value = unpackValue(tail) as P
561
+ const value = unpackCanonical(tail)
563
562
  return { type, value }
564
563
  }
565
564
  return { type }
566
565
  case `push`:
567
566
  case `unshift`: {
568
- const items = tail.split(`\u001E`).map(unpackValue) as P[]
567
+ const items = tail.split(`\u001E`).map<P>(unpackCanonical)
569
568
  return { type, items }
570
569
  }
571
570
  case `copyWithin`: {
572
571
  const [numbers, data] = tail.split(`\u001E\u001E`)
573
- const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
572
+ const prev = data ? data.split(`\u001E`).map<P>(unpackCanonical) : []
574
573
  const [t, s, e] = numbers.split(`\u001E`)
575
574
  const target = +t
576
575
  const start = +s
@@ -582,9 +581,9 @@ export class OList<P extends primitive>
582
581
  }
583
582
  case `fill`: {
584
583
  const [numbers, data] = tail.split(`\u001E\u001E`)
585
- const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
584
+ const prev = data ? data.split(`\u001E`).map<P>(unpackCanonical) : []
586
585
  const [v, s, e] = numbers.split(`\u001E`)
587
- const value = unpackValue(v) as P
586
+ const value = unpackCanonical<P>(v)
588
587
  if (s === undefined && e === undefined) {
589
588
  return { type, value, prev }
590
589
  }
@@ -600,16 +599,16 @@ export class OList<P extends primitive>
600
599
 
601
600
  const start = +s
602
601
  const deleteCount = +c
603
- const items = i ? (i.split(`\u001E`).map(unpackValue) as P[]) : []
604
- const deleted = d ? (d.split(`\u001E`).map(unpackValue) as P[]) : []
602
+ const items = i ? i.split(`\u001E`).map<P>(unpackCanonical) : []
603
+ const deleted = d ? d.split(`\u001E`).map<P>(unpackCanonical) : []
605
604
  return { type, start, deleteCount, items, deleted }
606
605
  }
607
606
  case `reverse`:
608
607
  return { type }
609
608
  case `sort`: {
610
609
  const [n, p] = tail.split(`\u001E\u001E`)
611
- const next = n ? (n.split(`\u001E`).map(unpackValue) as P[]) : []
612
- const prev = p ? (p.split(`\u001E`).map(unpackValue) as P[]) : []
610
+ const next = n ? n.split(`\u001E`).map<P>(unpackCanonical) : []
611
+ const prev = p ? p.split(`\u001E`).map<P>(unpackCanonical) : []
613
612
  return { type, next, prev }
614
613
  }
615
614
  }
@@ -1,8 +1,7 @@
1
1
  import type { Fn, Transceiver, TransceiverMode } from "atom.io/internal"
2
2
  import { Subject } from "atom.io/internal"
3
- import type { primitive } from "atom.io/json"
4
- import type { Enumeration } from "atom.io/struct"
5
- import { enumeration, packValue, unpackValue } from "atom.io/struct"
3
+ import type { Enumeration, packed, primitive } from "atom.io/json"
4
+ import { enumeration, packCanonical, unpackCanonical } from "atom.io/json"
6
5
 
7
6
  export type SetMutations = Exclude<
8
7
  keyof Set<any>,
@@ -139,19 +138,19 @@ export class UList<P extends primitive>
139
138
  ): PackedSetUpdate<P> {
140
139
  const head = SET_UPDATE_ENUM[update.type] + `\u001F`
141
140
  if (update.type === `clear`) {
142
- return head + update.values.map(packValue).join(`\u001E`)
141
+ return head + update.values.map(packCanonical).join(`\u001E`)
143
142
  }
144
- return head + packValue(update.value)
143
+ return head + packCanonical(update.value)
145
144
  }
146
145
  public static unpackUpdate<P extends primitive>(
147
146
  packed: PackedSetUpdate<P>,
148
147
  ): SetUpdate<P> {
149
- const [type, tail] = packed.split(`\u001F`) as [0 | 1 | 2, string]
148
+ const [type, tail] = packed.split(`\u001F`) as [0 | 1 | 2, packed<P>]
150
149
  const head = SET_UPDATE_ENUM[type]
151
150
  if (head === `clear`) {
152
- const values = tail.split(`\u001E`).map(unpackValue) as P[]
151
+ const values = tail.split(`\u001E`).map<P>(unpackCanonical)
153
152
  return { type: `clear`, values }
154
153
  }
155
- return { type: head, value: unpackValue(tail) as P }
154
+ return { type: head, value: unpackCanonical(tail) }
156
155
  }
157
156
  }
@@ -1,23 +0,0 @@
1
- import { Store } from "atom.io/internal";
2
- import * as AtomIO from "atom.io";
3
- import { Canonical, stringified } from "atom.io/json";
4
-
5
- //#region src/data/dict.d.ts
6
- declare function dict<State, Key extends Canonical>(family: AtomIO.ReadonlyPureSelectorFamilyToken<State, Key> | AtomIO.RegularAtomFamilyToken<State, Key> | AtomIO.WritablePureSelectorFamilyToken<State, Key>, index: AtomIO.ReadonlyPureSelectorToken<Key[]> | AtomIO.RegularAtomToken<Key[]> | AtomIO.WritablePureSelectorToken<Key[]>, store?: Store): AtomIO.ReadonlyPureSelectorToken<{ [K in stringified<Key>]: State }>;
7
- //#endregion
8
- //#region src/data/struct.d.ts
9
- declare function struct<Struct extends {
10
- [key: string]: unknown;
11
- }, Key extends string>(options: {
12
- key: Key;
13
- default: Struct;
14
- }, store?: Store): [{ [K in keyof Struct as `${Key}${Capitalize<K & string>}State`]: AtomIO.RegularAtomToken<Struct[K]> }, AtomIO.ReadonlyPureSelectorToken<Struct, any, never>];
15
- //#endregion
16
- //#region src/data/struct-family.d.ts
17
- declare function structFamily<Struct extends object, Key extends string>(options: {
18
- key: Key;
19
- default: Struct;
20
- }): [{ [K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<K & string>}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string> }, AtomIO.ReadonlyPureSelectorFamilyToken<Struct, string>];
21
- //#endregion
22
- export { dict, struct, structFamily };
23
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/data/dict.ts","../../src/data/struct.ts","../../src/data/struct-family.ts"],"sourcesContent":[],"mappings":";;;;;iBASgB,YAAhB,YAAwC,SAAxB,CAAwB,CAAA,MAAA,EAEpC,MAAA,CAAO,+BAF6B,CAEG,KAFH,EAEU,GAFV,CAAA,GAGpC,MAAA,CAAO,sBAH6B,CAGN,KAHM,EAGC,GAHD,CAAA,GAIpC,MAAA,CAAO,+BAJ6B,CAIG,KAJH,EAIU,GAJV,CAAA,EAAA,KAAA,EAMpC,MAAA,CAAO,yBAN6B,CAMH,GANG,EAAA,CAAA,GAOpC,MAAA,CAAO,gBAP6B,CAOZ,GAPY,EAAA,CAAA,GAQpC,MAAA,CAAO,yBAR6B,CAQH,GARG,EAAA,CAAA,EAAA,KAAA,CAAA,EAShC,KATgC,CAAA,EAUrC,MAAA,CAAO,yBAV8B,CAAA,QAUI,WAVJ,CAUgB,GAVhB,CAAA,GAUuB,KAVvB,EAAA,CAAA;;;iBCAxB;;ADAhB,CAAA,EAAwC,YAAA,MAAA,CAEG,CAAA,OAAA,EAAA;EAAO,GAAA,ECG3C,GDH2C;EAA9C,OAAO,ECIA,MDJA;CACuB,EAAA,KAAA,CAAA,ECK1B,KDL0B,CAAA,EAAA,CAAA,QAAA,MCQpB,MDRoB,IAAA,GCQP,GDRO,GCQD,UDRC,CCS/B,CDT+B,GAAA,MAAA,CAAA,OAAA,GCUrB,MAAA,CAAO,gBDVc,CCUG,MDVH,CCUU,CDVV,CAAA,CAAA,EAAA,ECYjC,MAAA,CAAO,yBDZ0B,CCYA,MDZA,EAAA,GAAA,EAAA,KAAA,CAAA,CAAA;;;iBEDlB;EFFhB,GAAgB,EEMV,GFNU;EAAwB,OAAA,EEO9B,MFP8B;CAEG,CAAA,EAAA,CAAA,QAAA,MEQ7B,MFR6B,IAAA,OEQZ,UFRY,CEQD,GFRC,GAAA,MAAA,CAAA,GEQe,UFRf,CESxC,CFTwC,GAAA,MAAA,CAAA,OAAA,GEU9B,MAAA,CAAO,sBFVuB,CEUA,MFVA,CEUO,CFVP,CAAA,EAAA,MAAA,CAAA,EAAA,EEY1C,MAAA,CAAO,+BFZmC,CEYH,MFZG,EAAA,MAAA,CAAA,CAAA"}
@@ -1,63 +0,0 @@
1
- import { IMPLICIT, capitalize, createRegularAtom, createRegularAtomFamily, createSelectorFamily, createStandaloneSelector, findInStore } from "atom.io/internal";
2
-
3
- //#region src/data/dict.ts
4
- function dict(family, index, store = IMPLICIT.STORE) {
5
- return createStandaloneSelector(store, {
6
- key: `${family.key}Dict`,
7
- get: ({ get }) => {
8
- return get(index).reduce((acc, key) => {
9
- acc[key] = get(findInStore(store, family, key));
10
- return acc;
11
- }, {});
12
- }
13
- });
14
- }
15
-
16
- //#endregion
17
- //#region src/data/struct.ts
18
- function struct(options, store = IMPLICIT.STORE) {
19
- const atoms = Object.keys(options.default).reduce((acc, key) => {
20
- const atomName = options.key + capitalize(key) + `State`;
21
- acc[atomName] = createRegularAtom(store, {
22
- key: `${options.key}.${key}`,
23
- default: options.default[key]
24
- }, void 0);
25
- return acc;
26
- }, {});
27
- return [atoms, createStandaloneSelector(store, {
28
- key: options.key,
29
- get: ({ get }) => {
30
- return Object.keys(options.default).reduce((acc, key) => {
31
- acc[key] = get(atoms[options.key + capitalize(key) + `State`]);
32
- return acc;
33
- }, {});
34
- }
35
- })];
36
- }
37
-
38
- //#endregion
39
- //#region src/data/struct-family.ts
40
- const nameFamily = (topKey, subKey) => `find` + capitalize(topKey) + capitalize(subKey) + `State`;
41
- function structFamily(options) {
42
- const atoms = Object.keys(options.default).reduce((acc, subKey) => {
43
- const atomFamilyName = nameFamily(options.key, subKey);
44
- acc[atomFamilyName] = createRegularAtomFamily(IMPLICIT.STORE, {
45
- key: `${options.key}.${subKey}`,
46
- default: options.default[subKey]
47
- });
48
- return acc;
49
- }, {});
50
- return [atoms, createSelectorFamily(IMPLICIT.STORE, {
51
- key: options.key,
52
- get: (id) => ({ find, get }) => {
53
- return Object.keys(options.default).reduce((acc, subKey) => {
54
- acc[subKey] = get(find(atoms[nameFamily(options.key, subKey)], id));
55
- return acc;
56
- }, {});
57
- }
58
- })];
59
- }
60
-
61
- //#endregion
62
- export { dict, struct, structFamily };
63
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomToken<Struct[K]>\n\t}","atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string>\n\t}"],"sources":["../../src/data/dict.ts","../../src/data/struct.ts","../../src/data/struct-family.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcreateStandaloneSelector,\n\tfindInStore,\n\tIMPLICIT,\n} from \"atom.io/internal\"\nimport type { Canonical, stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Canonical>(\n\tfamily:\n\t\t| AtomIO.ReadonlyPureSelectorFamilyToken<State, Key>\n\t\t| AtomIO.RegularAtomFamilyToken<State, Key>\n\t\t| AtomIO.WritablePureSelectorFamilyToken<State, Key>,\n\tindex:\n\t\t| AtomIO.ReadonlyPureSelectorToken<Key[]>\n\t\t| AtomIO.RegularAtomToken<Key[]>\n\t\t| AtomIO.WritablePureSelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlyPureSelectorToken<{ [K in stringified<Key>]: State }> {\n\treturn createStandaloneSelector(store, {\n\t\tkey: `${family.key}Dict`,\n\t\tget: ({ get }) => {\n\t\t\tconst keys = get(index)\n\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\tacc[key] = get(findInStore(store, family, key))\n\t\t\t\treturn acc\n\t\t\t}, {} as any)\n\t\t},\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcapitalize,\n\tcreateRegularAtom,\n\tcreateStandaloneSelector,\n\tIMPLICIT,\n} from \"atom.io/internal\"\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlyPureSelectorToken<Struct, any, never>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\tstore,\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createStandaloneSelector<Struct, never>(store, {\n\t\tkey: options.key,\n\t\tget: ({ get }) => {\n\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t// @ts-expect-error finicky\n\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\treturn acc\n\t\t\t}, {} as any)\n\t\t},\n\t})\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tcapitalize,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tIMPLICIT,\n} from \"atom.io/internal\"\n\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string>\n\t},\n\tAtomIO.ReadonlyPureSelectorFamilyToken<Struct, string>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(IMPLICIT.STORE, {\n\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\tdefault: (options.default as any)[subKey],\n\t\t})\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState: AtomIO.ReadonlyPureSelectorFamilyToken<Struct, string> =\n\t\tcreateSelectorFamily(IMPLICIT.STORE, {\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ find, get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\tfind((atoms as any)[nameFamily(options.key, subKey)], id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t})\n\treturn [atoms, findStructState]\n}\n"],"mappings":";;;AASA,SAAgB,KACf,QAIA,OAIA,QAAe,SAAS,OAC+C;AACvE,QAAO,yBAAyB,OAAO;EACtC,KAAK,GAAG,OAAO,IAAI;EACnB,MAAM,EAAE,UAAU;AAEjB,UADa,IAAI,MAAM,CACX,QAAQ,KAAK,QAAQ;AAChC,QAAI,OAAO,IAAI,YAAY,OAAO,QAAQ,IAAI,CAAC;AAC/C,WAAO;MACL,EAAE,CAAQ;;EAEd,CAAC;;;;;ACpBH,SAAgB,OAIf,SAIA,QAAe,SAAS,OAQvB;CACD,MAAMA,QAIF,OAAO,KAAK,QAAQ,QAAQ,CAAC,QAAQ,KAAK,QAAQ;EACrD,MAAM,WAAW,QAAQ,MAAM,WAAW,IAAI,GAAG;AACjD,MAAI,YAAY,kBACf,OACA;GACC,KAAK,GAAG,QAAQ,IAAI,GAAG;GACvB,SAAS,QAAQ,QAAQ;GACzB,EACD,OACA;AACD,SAAO;IACL,EAAE,CAAQ;AAWb,QAAO,CAAC,OAVY,yBAAwC,OAAO;EAClE,KAAK,QAAQ;EACb,MAAM,EAAE,UAAU;AACjB,UAAO,OAAO,KAAK,QAAQ,QAAQ,CAAC,QAAQ,KAAK,QAAQ;AAExD,QAAI,OAAO,IAAI,MAAM,QAAQ,MAAM,WAAW,IAAI,GAAG,SAAS;AAC9D,WAAO;MACL,EAAE,CAAQ;;EAEd,CAAC,CACyB;;;;;AC5C5B,MAAM,cAAc,QAAgB,WACnC,SAAS,WAAW,OAAO,GAAG,WAAW,OAAO,GAAG;AAEpD,SAAgB,aAGd,SAUA;CACD,MAAMC,QAIF,OAAO,KAAK,QAAQ,QAAQ,CAAC,QAAQ,KAAK,WAAW;EACxD,MAAM,iBAAiB,WAAW,QAAQ,KAAK,OAAO;AACtD,MAAI,kBAAkB,wBAAwB,SAAS,OAAO;GAC7D,KAAK,GAAG,QAAQ,IAAI,GAAG;GACvB,SAAU,QAAQ,QAAgB;GAClC,CAAC;AACF,SAAO;IACL,EAAE,CAAQ;AAeb,QAAO,CAAC,OAbP,qBAAqB,SAAS,OAAO;EACpC,KAAK,QAAQ;EACb,MACE,QACA,EAAE,MAAM,UAAU;AAClB,UAAO,OAAO,KAAK,QAAQ,QAAQ,CAAC,QAAQ,KAAK,WAAW;AAC3D,QAAI,UAAU,IACb,KAAM,MAAc,WAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,CACzD;AACD,WAAO;MACL,EAAE,CAAQ;;EAEf,CAAC,CAC4B"}
@@ -1,14 +0,0 @@
1
- import { Flat } from "atom.io/internal";
2
- import { Canonical } from "atom.io/json";
3
-
4
- //#region src/struct/micro.d.ts
5
- type IndexOf<T extends readonly unknown[], E, A extends unknown[] = []> = T extends readonly [infer Head, ...infer Tail] ? (<U>() => U extends Head ? 1 : 2) extends (<U>() => U extends E ? 1 : 2) ? A[`length`] : IndexOf<Tail, E, [...A, unknown]> : never;
6
- type Flip<T extends Record<string, number | string>> = { [K in keyof T as T[K]]: K };
7
- type TwoWay<T extends Record<string, number | string>> = Flip<T> & T;
8
- type Enumeration<T extends readonly string[]> = Flat<TwoWay<{ [K in T[number]]: IndexOf<T, K> }>>;
9
- declare function enumeration<T extends readonly string[]>(values: T): Enumeration<T>;
10
- declare const packValue: (value: Canonical) => string;
11
- declare const unpackValue: (value: string) => Canonical;
12
- //#endregion
13
- export { Enumeration, Flip, IndexOf, TwoWay, enumeration, packValue, unpackValue };
14
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/struct/micro.ts"],"sourcesContent":[],"mappings":";;;;KAGY,sCAAZ,CAAA,EAII,UAAA,OAAA,EAAA,GAAA,EAAA,CACS,GADT,CACS,SAAA,SAAA,CAAA,KAAA,KAAA,EAAA,GAAA,KAAA,KAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,GAAA,CAAA,SAAU,IAAV,GAAA,CAAA,GAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,GAAA,GAAyC,CAAzC,SAAmD,CAAnD,GAAA,CAAA,GAAA,CAAA,IACT,CADS,CAAA,QAAA,CAAA,GAET,OAFS,CAED,IAFC,EAEK,CAFL,EAAA,CAAA,GAEY,CAFZ,EAAA,OAAA,CAAA,CAAA,GAAA,KAAA;AAAU,KAKX,IALW,CAAA,UAKI,MALJ,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,CAAA,CAAA,GAAA,QAAA,MAMV,CANU,IAML,CANK,CAMH,CANG,CAAA,GAME,CANF,EAAA;AAA+B,KAS1C,MAT0C,CAAA,UASzB,MATyB,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,CAAA,CAAA,GASU,IATV,CASe,CATf,CAAA,GASoB,CATpB;AAAU,KAWpD,WAXoD,CAAA,UAAA,SAAA,MAAA,EAAA,CAAA,GAWT,IAXS,CAY/D,MAZ+D,CAAA,QAaxD,CAbwD,CAAA,MAAA,CAAA,GAa5C,OAb4C,CAapC,CAboC,EAajC,CAbiC,CAAA,EAAA,CAAA,CAAA;AAC5D,iBAgBY,WAhBZ,CAAA,UAAA,SAAA,MAAA,EAAA,CAAA,CAAA,MAAA,EAiBK,CAjBL,CAAA,EAkBD,WAlBC,CAkBW,CAlBX,CAAA;AACQ,cAgCC,SAhCD,EAAA,CAAA,KAAA,EAgCqB,SAhCrB,EAAA,GAAA,MAAA;AAAM,cA8CL,WA9CK,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GA8C0B,SA9C1B"}
@@ -1,37 +0,0 @@
1
- //#region src/struct/micro.ts
2
- function enumeration(values) {
3
- const result = {};
4
- let i = 0;
5
- for (const value of values) {
6
- result[value] = i;
7
- result[i] = value;
8
- ++i;
9
- }
10
- return result;
11
- }
12
- const BOOL = `\u0001`;
13
- const NULL = `\u0002`;
14
- const STRING = `\u0003`;
15
- const NUMBER = `\u0004`;
16
- const packValue = (value) => {
17
- if (value === null) return NULL;
18
- switch (typeof value) {
19
- case `string`: return STRING + value;
20
- case `number`: return NUMBER + value;
21
- case `boolean`: return BOOL + +value;
22
- case `object`: return JSON.stringify(value);
23
- }
24
- };
25
- const unpackValue = (value) => {
26
- switch (value[0]) {
27
- case STRING: return value.slice(1);
28
- case NUMBER: return +value.slice(1);
29
- case BOOL: return value.slice(1) === `1`;
30
- case NULL: return null;
31
- case `[`: return JSON.parse(value);
32
- }
33
- };
34
-
35
- //#endregion
36
- export { enumeration, packValue, unpackValue };
37
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["result: Record<any, any>"],"sources":["../../src/struct/micro.ts"],"sourcesContent":["import type { Flat } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport type IndexOf<\n\tT extends readonly unknown[],\n\tE,\n\tA extends unknown[] = [],\n> = T extends readonly [infer Head, ...infer Tail]\n\t? (<U>() => U extends Head ? 1 : 2) extends <U>() => U extends E ? 1 : 2\n\t\t? A[`length`]\n\t\t: IndexOf<Tail, E, [...A, unknown]>\n\t: never\n\nexport type Flip<T extends Record<string, number | string>> = {\n\t[K in keyof T as T[K]]: K\n}\n\nexport type TwoWay<T extends Record<string, number | string>> = Flip<T> & T\n\nexport type Enumeration<T extends readonly string[]> = Flat<\n\tTwoWay<{\n\t\t[K in T[number]]: IndexOf<T, K>\n\t}>\n>\n\nexport function enumeration<T extends readonly string[]>(\n\tvalues: T,\n): Enumeration<T> {\n\tconst result: Record<any, any> = {}\n\tlet i = 0\n\tfor (const value of values) {\n\t\tresult[value] = i\n\t\tresult[i] = value\n\t\t++i\n\t}\n\treturn result as Enumeration<T>\n}\n\nconst BOOL = `\\u0001`\nconst NULL = `\\u0002`\nconst STRING = `\\u0003`\nconst NUMBER = `\\u0004`\nexport const packValue = (value: Canonical): string => {\n\tif (value === null) return NULL\n\t// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n\tswitch (typeof value) {\n\t\tcase `string`:\n\t\t\treturn STRING + value\n\t\tcase `number`:\n\t\t\treturn NUMBER + value\n\t\tcase `boolean`:\n\t\t\treturn BOOL + +value\n\t\tcase `object`: // array\n\t\t\treturn JSON.stringify(value)\n\t}\n}\nexport const unpackValue = (value: string): Canonical => {\n\tconst type = value[0] as `[` | `\\u0001` | `\\u0002` | `\\u0003` | `\\u0004`\n\n\tswitch (type) {\n\t\tcase STRING:\n\t\t\treturn value.slice(1)\n\t\tcase NUMBER:\n\t\t\treturn +value.slice(1)\n\t\tcase BOOL:\n\t\t\treturn value.slice(1) === `1`\n\t\tcase NULL:\n\t\t\treturn null\n\t\tcase `[`:\n\t\t\treturn JSON.parse(value)\n\t}\n}\n"],"mappings":";AAyBA,SAAgB,YACf,QACiB;CACjB,MAAMA,SAA2B,EAAE;CACnC,IAAI,IAAI;AACR,MAAK,MAAM,SAAS,QAAQ;AAC3B,SAAO,SAAS;AAChB,SAAO,KAAK;AACZ,IAAE;;AAEH,QAAO;;AAGR,MAAM,OAAO;AACb,MAAM,OAAO;AACb,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAa,aAAa,UAA6B;AACtD,KAAI,UAAU,KAAM,QAAO;AAE3B,SAAQ,OAAO,OAAf;EACC,KAAK,SACJ,QAAO,SAAS;EACjB,KAAK,SACJ,QAAO,SAAS;EACjB,KAAK,UACJ,QAAO,OAAO,CAAC;EAChB,KAAK,SACJ,QAAO,KAAK,UAAU,MAAM;;;AAG/B,MAAa,eAAe,UAA6B;AAGxD,SAFa,MAAM,IAEnB;EACC,KAAK,OACJ,QAAO,MAAM,MAAM,EAAE;EACtB,KAAK,OACJ,QAAO,CAAC,MAAM,MAAM,EAAE;EACvB,KAAK,KACJ,QAAO,MAAM,MAAM,EAAE,KAAK;EAC3B,KAAK,KACJ,QAAO;EACR,KAAK,IACJ,QAAO,KAAK,MAAM,MAAM"}
package/src/data/dict.ts DELETED
@@ -1,31 +0,0 @@
1
- import type * as AtomIO from "atom.io"
2
- import type { Store } from "atom.io/internal"
3
- import {
4
- createStandaloneSelector,
5
- findInStore,
6
- IMPLICIT,
7
- } from "atom.io/internal"
8
- import type { Canonical, stringified } from "atom.io/json"
9
-
10
- export function dict<State, Key extends Canonical>(
11
- family:
12
- | AtomIO.ReadonlyPureSelectorFamilyToken<State, Key>
13
- | AtomIO.RegularAtomFamilyToken<State, Key>
14
- | AtomIO.WritablePureSelectorFamilyToken<State, Key>,
15
- index:
16
- | AtomIO.ReadonlyPureSelectorToken<Key[]>
17
- | AtomIO.RegularAtomToken<Key[]>
18
- | AtomIO.WritablePureSelectorToken<Key[]>,
19
- store: Store = IMPLICIT.STORE,
20
- ): AtomIO.ReadonlyPureSelectorToken<{ [K in stringified<Key>]: State }> {
21
- return createStandaloneSelector(store, {
22
- key: `${family.key}Dict`,
23
- get: ({ get }) => {
24
- const keys = get(index)
25
- return keys.reduce((acc, key) => {
26
- acc[key] = get(findInStore(store, family, key))
27
- return acc
28
- }, {} as any)
29
- },
30
- })
31
- }
package/src/data/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from "./dict"
2
- export * from "./struct"
3
- export * from "./struct-family"
@@ -1,53 +0,0 @@
1
- import type * as AtomIO from "atom.io"
2
- import {
3
- capitalize,
4
- createRegularAtomFamily,
5
- createSelectorFamily,
6
- IMPLICIT,
7
- } from "atom.io/internal"
8
-
9
- const nameFamily = (topKey: string, subKey: string) =>
10
- `find` + capitalize(topKey) + capitalize(subKey) + `State`
11
-
12
- export function structFamily<
13
- Struct extends object,
14
- Key extends string,
15
- >(options: {
16
- key: Key
17
- default: Struct
18
- }): [
19
- {
20
- [K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<
21
- K & string
22
- >}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string>
23
- },
24
- AtomIO.ReadonlyPureSelectorFamilyToken<Struct, string>,
25
- ] {
26
- const atoms: {
27
- [K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<
28
- K & string
29
- >}State`]: AtomIO.RegularAtomFamilyToken<Struct[K], string>
30
- } = Object.keys(options.default).reduce((acc, subKey) => {
31
- const atomFamilyName = nameFamily(options.key, subKey)
32
- acc[atomFamilyName] = createRegularAtomFamily(IMPLICIT.STORE, {
33
- key: `${options.key}.${subKey}`,
34
- default: (options.default as any)[subKey],
35
- })
36
- return acc
37
- }, {} as any)
38
- const findStructState: AtomIO.ReadonlyPureSelectorFamilyToken<Struct, string> =
39
- createSelectorFamily(IMPLICIT.STORE, {
40
- key: options.key,
41
- get:
42
- (id) =>
43
- ({ find, get }) => {
44
- return Object.keys(options.default).reduce((acc, subKey) => {
45
- acc[subKey] = get(
46
- find((atoms as any)[nameFamily(options.key, subKey)], id),
47
- )
48
- return acc
49
- }, {} as any)
50
- },
51
- })
52
- return [atoms, findStructState]
53
- }
@@ -1,54 +0,0 @@
1
- import type * as AtomIO from "atom.io"
2
- import type { Store } from "atom.io/internal"
3
- import {
4
- capitalize,
5
- createRegularAtom,
6
- createStandaloneSelector,
7
- IMPLICIT,
8
- } from "atom.io/internal"
9
-
10
- export function struct<
11
- Struct extends { [key: string]: unknown },
12
- Key extends string,
13
- >(
14
- options: {
15
- key: Key
16
- default: Struct
17
- },
18
- store: Store = IMPLICIT.STORE,
19
- ): [
20
- {
21
- [K in keyof Struct as `${Key}${Capitalize<
22
- K & string
23
- >}State`]: AtomIO.RegularAtomToken<Struct[K]>
24
- },
25
- AtomIO.ReadonlyPureSelectorToken<Struct, any, never>,
26
- ] {
27
- const atoms: {
28
- [K in keyof Struct as `${Key}${Capitalize<
29
- K & string
30
- >}State`]: AtomIO.RegularAtomToken<Struct[K]>
31
- } = Object.keys(options.default).reduce((acc, key) => {
32
- const atomName = options.key + capitalize(key) + `State`
33
- acc[atomName] = createRegularAtom(
34
- store,
35
- {
36
- key: `${options.key}.${key}`,
37
- default: options.default[key],
38
- },
39
- undefined,
40
- )
41
- return acc
42
- }, {} as any)
43
- const structState = createStandaloneSelector<Struct, never>(store, {
44
- key: options.key,
45
- get: ({ get }) => {
46
- return Object.keys(options.default).reduce((acc, key) => {
47
- // @ts-expect-error finicky
48
- acc[key] = get(atoms[options.key + capitalize(key) + `State`])
49
- return acc
50
- }, {} as any)
51
- },
52
- })
53
- return [atoms, structState]
54
- }
@@ -1 +0,0 @@
1
- export * from "./micro"
@@ -1,72 +0,0 @@
1
- import type { Flat } from "atom.io/internal"
2
- import type { Canonical } from "atom.io/json"
3
-
4
- export type IndexOf<
5
- T extends readonly unknown[],
6
- E,
7
- A extends unknown[] = [],
8
- > = T extends readonly [infer Head, ...infer Tail]
9
- ? (<U>() => U extends Head ? 1 : 2) extends <U>() => U extends E ? 1 : 2
10
- ? A[`length`]
11
- : IndexOf<Tail, E, [...A, unknown]>
12
- : never
13
-
14
- export type Flip<T extends Record<string, number | string>> = {
15
- [K in keyof T as T[K]]: K
16
- }
17
-
18
- export type TwoWay<T extends Record<string, number | string>> = Flip<T> & T
19
-
20
- export type Enumeration<T extends readonly string[]> = Flat<
21
- TwoWay<{
22
- [K in T[number]]: IndexOf<T, K>
23
- }>
24
- >
25
-
26
- export function enumeration<T extends readonly string[]>(
27
- values: T,
28
- ): Enumeration<T> {
29
- const result: Record<any, any> = {}
30
- let i = 0
31
- for (const value of values) {
32
- result[value] = i
33
- result[i] = value
34
- ++i
35
- }
36
- return result as Enumeration<T>
37
- }
38
-
39
- const BOOL = `\u0001`
40
- const NULL = `\u0002`
41
- const STRING = `\u0003`
42
- const NUMBER = `\u0004`
43
- export const packValue = (value: Canonical): string => {
44
- if (value === null) return NULL
45
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
46
- switch (typeof value) {
47
- case `string`:
48
- return STRING + value
49
- case `number`:
50
- return NUMBER + value
51
- case `boolean`:
52
- return BOOL + +value
53
- case `object`: // array
54
- return JSON.stringify(value)
55
- }
56
- }
57
- export const unpackValue = (value: string): Canonical => {
58
- const type = value[0] as `[` | `\u0001` | `\u0002` | `\u0003` | `\u0004`
59
-
60
- switch (type) {
61
- case STRING:
62
- return value.slice(1)
63
- case NUMBER:
64
- return +value.slice(1)
65
- case BOOL:
66
- return value.slice(1) === `1`
67
- case NULL:
68
- return null
69
- case `[`:
70
- return JSON.parse(value)
71
- }
72
- }
File without changes