atom.io 0.44.15 → 0.45.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.
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/introspection/index.d.ts +3 -2
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.d.ts +34 -20
- package/dist/json/index.d.ts.map +1 -1
- package/dist/json/index.js +40 -2
- package/dist/json/index.js.map +1 -1
- package/dist/main/index.d.ts +1 -1
- package/dist/main/index.d.ts.map +1 -1
- package/dist/react/index.d.ts +4 -4
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +13 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +1 -1
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-testing/index.js +1 -1
- package/dist/transceivers/o-list/index.d.ts +1 -2
- package/dist/transceivers/o-list/index.d.ts.map +1 -1
- package/dist/transceivers/o-list/index.js +23 -24
- package/dist/transceivers/o-list/index.js.map +1 -1
- package/dist/transceivers/u-list/index.d.ts +1 -2
- package/dist/transceivers/u-list/index.d.ts.map +1 -1
- package/dist/transceivers/u-list/index.js +5 -6
- package/dist/transceivers/u-list/index.js.map +1 -1
- package/package.json +4 -12
- package/src/introspection/attach-introspection-states.ts +1 -1
- package/src/introspection/attach-transaction-logs.ts +2 -2
- package/src/introspection/index.ts +3 -0
- package/src/json/canonical.ts +42 -0
- package/src/json/enumeration.ts +36 -0
- package/src/json/index.ts +3 -132
- package/src/json/json.ts +128 -0
- package/src/main/index.ts +9 -2
- package/src/react/use-loadable.ts +10 -5
- package/src/react/use-o.ts +33 -1
- package/src/react-devtools/TransactionIndex.tsx +1 -1
- package/src/react-devtools/store.ts +3 -3
- package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +2 -2
- package/src/realtime-react/use-pull-selector-family-member.ts +0 -1
- package/src/transceivers/o-list/o-list.ts +27 -28
- package/src/transceivers/u-list/u-list.ts +7 -8
- package/dist/data/index.d.ts +0 -23
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js +0 -63
- package/dist/data/index.js.map +0 -1
- package/dist/struct/index.d.ts +0 -14
- package/dist/struct/index.d.ts.map +0 -1
- package/dist/struct/index.js +0 -37
- package/dist/struct/index.js.map +0 -1
- package/src/data/dict.ts +0 -31
- package/src/data/index.ts +0 -3
- package/src/data/struct-family.ts +0 -53
- package/src/data/struct.ts +0 -54
- package/src/struct/index.ts +0 -1
- package/src/struct/micro.ts +0 -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
|
|
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` +
|
|
464
|
+
packed += update.index + `\u001E` + packCanonical(update.next)
|
|
466
465
|
if (update.prev !== undefined) {
|
|
467
|
-
packed += `\u001E` +
|
|
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(
|
|
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 +=
|
|
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(
|
|
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(
|
|
492
|
+
packed += `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`)
|
|
494
493
|
return packed
|
|
495
494
|
case `fill`:
|
|
496
|
-
packed +=
|
|
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(
|
|
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(
|
|
511
|
+
update.items.map(packCanonical).join(`\u001E`) +
|
|
513
512
|
`\u001E\u001E` +
|
|
514
|
-
update.deleted.map(
|
|
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(
|
|
520
|
+
update.next.map(packCanonical).join(`\u001E`) +
|
|
522
521
|
`\u001E\u001E` +
|
|
523
|
-
update.prev.map(
|
|
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
|
-
|
|
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 =
|
|
539
|
+
const next = unpackCanonical<P>(n)
|
|
541
540
|
if (p === undefined) {
|
|
542
541
|
return { type, index, next }
|
|
543
542
|
}
|
|
544
|
-
const prev =
|
|
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(
|
|
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 =
|
|
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(
|
|
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 ?
|
|
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 ?
|
|
584
|
+
const prev = data ? data.split(`\u001E`).map<P>(unpackCanonical) : []
|
|
586
585
|
const [v, s, e] = numbers.split(`\u001E`)
|
|
587
|
-
const value =
|
|
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 ?
|
|
604
|
-
const deleted = d ?
|
|
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 ?
|
|
612
|
-
const prev = 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
|
|
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(
|
|
141
|
+
return head + update.values.map(packCanonical).join(`\u001E`)
|
|
143
142
|
}
|
|
144
|
-
return head +
|
|
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,
|
|
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(
|
|
151
|
+
const values = tail.split(`\u001E`).map<P>(unpackCanonical)
|
|
153
152
|
return { type: `clear`, values }
|
|
154
153
|
}
|
|
155
|
-
return { type: head, value:
|
|
154
|
+
return { type: head, value: unpackCanonical(tail) }
|
|
156
155
|
}
|
|
157
156
|
}
|
package/dist/data/index.d.ts
DELETED
|
@@ -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
|
package/dist/data/index.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/data/index.js
DELETED
|
@@ -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
|
package/dist/data/index.js.map
DELETED
|
@@ -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"}
|
package/dist/struct/index.d.ts
DELETED
|
@@ -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"}
|
package/dist/struct/index.js
DELETED
|
@@ -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
|
package/dist/struct/index.js.map
DELETED
|
@@ -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,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
|
-
}
|
package/src/data/struct.ts
DELETED
|
@@ -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
|
-
}
|
package/src/struct/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./micro"
|
package/src/struct/micro.ts
DELETED
|
@@ -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
|