atom.io 0.27.5 → 0.28.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 (67) hide show
  1. package/data/dist/index.d.ts +31 -29
  2. package/data/dist/index.js +16 -17
  3. package/data/src/join.ts +17 -19
  4. package/dist/{chunk-6ABWLAGY.js → chunk-BX3MTH2Z.js} +320 -249
  5. package/dist/chunk-D52JNVER.js +721 -0
  6. package/dist/chunk-EUVKUTW3.js +89 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +3 -1
  9. package/internal/dist/index.d.ts +72 -36
  10. package/internal/dist/index.js +1 -1
  11. package/internal/src/atom/dispose-atom.ts +2 -9
  12. package/internal/src/families/dispose-from-store.ts +35 -18
  13. package/internal/src/families/find-in-store.ts +17 -7
  14. package/internal/src/get-state/get-from-store.ts +41 -32
  15. package/internal/src/ingest-updates/ingest-creation-disposal.ts +10 -1
  16. package/internal/src/molecule/dispose-molecule.ts +6 -17
  17. package/internal/src/pretty-print.ts +1 -16
  18. package/internal/src/selector/dispose-selector.ts +2 -9
  19. package/internal/src/set-state/set-into-store.ts +17 -19
  20. package/internal/src/store/circular-buffer.ts +34 -0
  21. package/internal/src/store/counterfeit.ts +109 -0
  22. package/internal/src/store/deposit.ts +14 -0
  23. package/internal/src/store/index.ts +1 -0
  24. package/internal/src/store/store.ts +3 -0
  25. package/internal/src/store/withdraw.ts +15 -10
  26. package/internal/src/transaction/build-transaction.ts +1 -0
  27. package/introspection/dist/index.d.ts +84 -4
  28. package/introspection/dist/index.js +1 -392
  29. package/introspection/src/attach-introspection-states.ts +7 -4
  30. package/introspection/src/attach-type-selectors.ts +26 -0
  31. package/introspection/src/differ.ts +167 -0
  32. package/introspection/src/index.ts +2 -0
  33. package/introspection/src/refinery.ts +100 -0
  34. package/json/dist/index.d.ts +31 -30
  35. package/json/dist/index.js +2 -77
  36. package/json/src/entries.ts +6 -0
  37. package/json/src/index.ts +47 -6
  38. package/package.json +17 -8
  39. package/react-devtools/dist/index.d.ts +1 -91
  40. package/react-devtools/dist/index.js +285 -414
  41. package/react-devtools/src/AtomIODevtools.tsx +2 -2
  42. package/react-devtools/src/StateEditor.tsx +20 -12
  43. package/react-devtools/src/StateIndex.tsx +8 -26
  44. package/react-devtools/src/TimelineIndex.tsx +3 -3
  45. package/react-devtools/src/TransactionIndex.tsx +6 -6
  46. package/react-devtools/src/Updates.tsx +1 -4
  47. package/react-devtools/src/index.ts +0 -71
  48. package/react-devtools/src/store.ts +51 -0
  49. package/realtime/dist/index.d.ts +7 -7
  50. package/realtime/dist/index.js +18 -22
  51. package/realtime/src/realtime-continuity.ts +27 -35
  52. package/realtime-client/dist/index.js +24 -10
  53. package/realtime-client/src/realtime-client-stores/client-main-store.ts +6 -6
  54. package/realtime-client/src/sync-continuity.ts +28 -6
  55. package/realtime-server/dist/index.js +41 -5
  56. package/realtime-server/src/realtime-continuity-synchronizer.ts +42 -78
  57. package/realtime-testing/dist/index.d.ts +2 -0
  58. package/realtime-testing/dist/index.js +50 -8
  59. package/realtime-testing/src/setup-realtime-test.tsx +59 -9
  60. package/src/silo.ts +7 -3
  61. package/web/dist/index.d.ts +9 -0
  62. package/{dist/chunk-H6EDLPKH.js → web/dist/index.js} +5 -4
  63. package/web/package.json +13 -0
  64. package/web/src/index.ts +1 -0
  65. package/web/src/persist-sync.ts +25 -0
  66. package/dist/chunk-AK23DRMD.js +0 -21
  67. package/dist/chunk-IW6WYRS7.js +0 -140
@@ -1,266 +1,18 @@
1
- import { lazyLocalStorageEffect } from '../../dist/chunk-H6EDLPKH.js';
2
- import { pipe, ifDefined, isArray, isRecord, doesExtend, isPlainObject, raiseError, sprawl, fallback, doNothing, become, mapObject, delve } from '../../dist/chunk-IW6WYRS7.js';
3
- import { JSON_TYPE_NAMES, stringifyJson, JSON_DEFAULTS } from '../../dist/chunk-AK23DRMD.js';
1
+ import { pipe, ifDefined, isArray, isRecord, doesExtend, jsonRefinery, doNothing, isPlainObject, become, mapObject, delve } from '../../dist/chunk-D52JNVER.js';
2
+ import { isJson as isJson$1 } from '../../dist/chunk-EUVKUTW3.js';
3
+ import '../../dist/chunk-BX3MTH2Z.js';
4
+ import '../../dist/chunk-IBTHB2PI.js';
4
5
  import '../../dist/chunk-XWL6SNVU.js';
5
- import { selectorFamily, atom, atomFamily, undo, redo, getState } from 'atom.io';
6
- import { attachIntrospectionStates } from 'atom.io/introspection';
7
6
  import { useI, useO } from 'atom.io/react';
8
7
  import { motion, spring, LayoutGroup } from 'framer-motion';
9
8
  import { forwardRef, useRef, useState, useImperativeHandle, useLayoutEffect, Fragment as Fragment$1, Component, useId } from 'react';
9
+ import { atom, atomFamily, undo, redo, getState } from 'atom.io';
10
10
  import { findState } from 'atom.io/ephemeral';
11
+ import { attachIntrospectionStates, primitiveRefinery, prettyJson, discoverType } from 'atom.io/introspection';
11
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
+ import { isJson } from 'atom.io/json';
14
+ import { persistSync } from 'atom.io/web';
12
15
 
13
- // ../anvl/src/refinement/can-exist.ts
14
- var canExist = (_) => true;
15
-
16
- // ../anvl/src/refinement/cannot-exist.ts
17
- var cannotExist = (_) => false;
18
-
19
- // ../anvl/src/refinement/is-intersection.ts
20
- function mustSatisfyAllOfTheFollowing(isTypeA, logging = false, refinements = [isTypeA]) {
21
- const name = `(${refinements.map((r) => r?.name || `anon`).join(` & `)})`;
22
- const _ = {
23
- [name]: (input) => refinements.every(
24
- (refinement) => (logging && console.log(
25
- refinements.map((r) => r.name || `anon`).join(` & `),
26
- `>`,
27
- refinement.name || `anon`,
28
- `:`,
29
- refinement(input)
30
- ), refinement(input))
31
- )
32
- };
33
- const checkTypes = Object.assign(_[name], {
34
- and: (isTypeB) => mustSatisfyAllOfTheFollowing(isTypeB, logging, [
35
- ...refinements,
36
- isTypeB
37
- ])
38
- });
39
- return checkTypes;
40
- }
41
- var isIntersection = mustSatisfyAllOfTheFollowing(canExist);
42
-
43
- // ../anvl/src/refinement/is-union.ts
44
- var mustSatisfyOneOfTheFollowing = (isTypeA, logging = false, refinements = [isTypeA]) => {
45
- const name = `(${refinements.map((r) => r?.name || `anon`).join(` | `)})`;
46
- const _ = {
47
- [name]: (input) => refinements.some(
48
- (refinement) => (logging && console.log(
49
- refinements.map((r) => r.name || `anon`).join(` | `),
50
- `>`,
51
- refinement.name ?? `anon`,
52
- `:`,
53
- refinement(input)
54
- ), refinement(input))
55
- )
56
- };
57
- const checkTypes = Object.assign(_[name], {
58
- or: (isTypeB) => mustSatisfyOneOfTheFollowing(isTypeB, logging, [...refinements, isTypeB])
59
- });
60
- return checkTypes;
61
- };
62
- var isUnion = mustSatisfyOneOfTheFollowing(cannotExist);
63
-
64
- // ../anvl/src/primitive/index.ts
65
- var isString = (input) => {
66
- return typeof input === `string`;
67
- };
68
- var isNumber = (input) => {
69
- return typeof input === `number`;
70
- };
71
- var isBoolean = (input) => {
72
- return typeof input === `boolean`;
73
- };
74
-
75
- // ../anvl/src/refinement/refine-json.ts
76
- var JSON_PROTOTYPES = [
77
- `Array`,
78
- `Boolean`,
79
- `Number`,
80
- `Object`,
81
- `String`
82
- ];
83
- var refineJsonType = (data) => data === null ? { type: `null`, data: null } : isBoolean(data) ? { type: `boolean`, data } : isNumber(data) ? { type: `number`, data } : isString(data) ? { type: `string`, data } : Array.isArray(data) ? { type: `array`, data } : isPlainObject(data) ? { type: `object`, data } : raiseError(
84
- data === void 0 ? `undefined passed to refineJsonType. This is not valid JSON.` : `${stringifyJson(data)} with prototype "${Object.getPrototypeOf(data).constructor.name}" passed to refineJsonType. This is not valid JSON.`
85
- );
86
- var isJson = (input) => {
87
- if (input === null) return true;
88
- if (input === void 0) return false;
89
- const prototype = Object.getPrototypeOf(input)?.constructor.name;
90
- const refine = JSON_PROTOTYPES.includes(prototype);
91
- return refine;
92
- };
93
-
94
- // ../anvl/src/refinement/refinery.ts
95
- var Refinery = class {
96
- supported;
97
- constructor(supported) {
98
- this.supported = supported;
99
- }
100
- refine(input) {
101
- for (const [key, refiner] of Object.entries(this.supported)) {
102
- try {
103
- if (
104
- // @ts-expect-error that's the point
105
- refiner(input) === true && refiner !== Boolean
106
- ) {
107
- return { type: key, data: input };
108
- }
109
- } catch (e) {
110
- try {
111
- if (input instanceof refiner) {
112
- return { type: key, data: input };
113
- }
114
- } catch (_) {
115
- }
116
- }
117
- }
118
- return null;
119
- }
120
- };
121
- var jsonRefinery = new Refinery({
122
- number: (input) => typeof input === `number`,
123
- string: (input) => typeof input === `string`,
124
- boolean: (input) => typeof input === `boolean`,
125
- object: isPlainObject,
126
- array: (input) => Array.isArray(input),
127
- null: (input) => input === null
128
- });
129
- var discoverType = (input) => {
130
- if (input === void 0) {
131
- return `undefined`;
132
- }
133
- const refined = jsonRefinery.refine(input);
134
- if (refined) {
135
- return refined.type;
136
- }
137
- return Object.getPrototypeOf(input).constructor.name;
138
- };
139
-
140
- // ../anvl/src/refinement/index.ts
141
- var isLiteral = (value) => (input) => input === value;
142
- var isWithin = (args) => (input) => args.includes(input);
143
-
144
- // ../anvl/src/tree/differ.ts
145
- function diffNumber(a, b) {
146
- const sign = a < b ? `+` : `-`;
147
- return {
148
- summary: `${sign}${Math.abs(a - b)} (${a} \u2192 ${b})`
149
- };
150
- }
151
- function diffString(a, b) {
152
- const sign = a.length < b.length ? `+` : `-`;
153
- return {
154
- summary: `${sign}${Math.abs(a.length - b.length)} ("${a}" \u2192 "${b}")`
155
- };
156
- }
157
- function diffBoolean(a, b) {
158
- return {
159
- summary: `${a} \u2192 ${b}`
160
- };
161
- }
162
- function diffObject(a, b, recurse) {
163
- let summary = ``;
164
- const added = [];
165
- const removed = [];
166
- const changed = [];
167
- sprawl(a, (path, nodeA) => {
168
- let key;
169
- for (key of path) {
170
- const nodeB = b[key];
171
- if (nodeB === void 0) {
172
- removed.push([key, JSON.stringify(nodeA)]);
173
- } else {
174
- const delta = recurse(nodeA, nodeB);
175
- if (delta.summary !== `No Change`) {
176
- changed.push([key, delta]);
177
- }
178
- }
179
- }
180
- });
181
- sprawl(b, (path, nodeB) => {
182
- let key;
183
- for (key of path) {
184
- const nodeA = a[key];
185
- if (nodeA === void 0) {
186
- added.push([key, JSON.stringify(nodeB)]);
187
- }
188
- }
189
- });
190
- summary = `\uFF5E${changed.length} \uFF0B${added.length} \uFF0D${removed.length}`;
191
- return {
192
- summary,
193
- added,
194
- removed,
195
- changed
196
- };
197
- }
198
- function diffArray(a, b, recurse) {
199
- return diffObject(a, b, recurse);
200
- }
201
- var Differ = class {
202
- leafRefinery;
203
- treeRefinery;
204
- leafDiffers;
205
- treeDiffers;
206
- constructor(leafRefinery, treeRefinery, diffFunctions) {
207
- this.leafRefinery = leafRefinery;
208
- this.treeRefinery = treeRefinery;
209
- this.leafDiffers = {};
210
- this.treeDiffers = {};
211
- for (const key of Object.keys(leafRefinery.supported)) {
212
- const diffFunction = diffFunctions[key];
213
- this.leafDiffers[key] = diffFunction;
214
- }
215
- for (const key of Object.keys(treeRefinery.supported)) {
216
- const diffFunction = diffFunctions[key];
217
- this.treeDiffers[key] = diffFunction;
218
- }
219
- }
220
- diff(a, b) {
221
- if (a === b) {
222
- return { summary: `No Change` };
223
- }
224
- try {
225
- if (JSON.stringify(a) === JSON.stringify(b)) {
226
- return { summary: `No Change` };
227
- }
228
- } catch (thrown) {
229
- console.error(`Error stringifying`, a, b);
230
- }
231
- const aRefined = this.leafRefinery.refine(a) ?? this.treeRefinery.refine(a);
232
- const bRefined = this.leafRefinery.refine(b) ?? this.treeRefinery.refine(b);
233
- if (aRefined !== null && bRefined !== null) {
234
- if (aRefined.type === bRefined.type) {
235
- if (aRefined.type in this.leafDiffers) {
236
- const delta = this.leafDiffers[aRefined.type](
237
- aRefined.data,
238
- bRefined.data
239
- );
240
- return delta;
241
- }
242
- if (aRefined.type in this.treeDiffers) {
243
- const delta = this.treeDiffers[aRefined.type](
244
- aRefined.data,
245
- bRefined.data,
246
- (x, y) => this.diff(x, y)
247
- );
248
- return delta;
249
- }
250
- }
251
- }
252
- const typeA = discoverType(a);
253
- const typeB = discoverType(b);
254
- if (typeA === typeB) {
255
- return {
256
- summary: `${typeA} \u2192 ${typeB}`
257
- };
258
- }
259
- return {
260
- summary: `Type change: ${typeA} \u2192 ${typeB}`
261
- };
262
- }
263
- };
264
16
  var OpenClose = ({ isOpen, setIsOpen, disabled, testid }) => {
265
17
  return /* @__PURE__ */ jsx(
266
18
  "button",
@@ -523,8 +275,11 @@ var JsonEditor_INTERNAL = ({
523
275
  Header: HeaderDisplay,
524
276
  Components
525
277
  }) => {
526
- const dataIsJson = isJson(data);
527
- const refined = dataIsJson ? refineJsonType(data) : { type: `non-json`, data };
278
+ const dataIsJson = isJson$1(data);
279
+ const refined = jsonRefinery.refine(data) ?? {
280
+ type: `non-json`,
281
+ data
282
+ };
528
283
  const SubEditor = dataIsJson ? SubEditors[refined.type] : NonJsonEditor;
529
284
  const disabled = isReadonly(path);
530
285
  return isHidden(path) ? null : /* @__PURE__ */ jsx(Components.ErrorBoundary, { children: /* @__PURE__ */ jsxs(Components.EditorWrapper, { className, style, children: [
@@ -609,6 +364,90 @@ var ArrayEditor = ({
609
364
  }) });
610
365
  };
611
366
 
367
+ // ../anvl/src/json/index.ts
368
+ var JSON_TYPE_NAMES = [
369
+ `array`,
370
+ `boolean`,
371
+ `null`,
372
+ `number`,
373
+ `object`,
374
+ `string`
375
+ ];
376
+ var JSON_DEFAULTS = {
377
+ array: [],
378
+ boolean: false,
379
+ null: null,
380
+ number: 0,
381
+ object: {},
382
+ string: ``
383
+ };
384
+
385
+ // ../anvl/src/primitive/index.ts
386
+ var isString = (input) => {
387
+ return typeof input === `string`;
388
+ };
389
+ var isNumber = (input) => {
390
+ return typeof input === `number`;
391
+ };
392
+ var isBoolean = (input) => {
393
+ return typeof input === `boolean`;
394
+ };
395
+
396
+ // ../anvl/src/refinement/can-exist.ts
397
+ var canExist = (_) => true;
398
+
399
+ // ../anvl/src/refinement/cannot-exist.ts
400
+ var cannotExist = (_) => false;
401
+
402
+ // ../anvl/src/refinement/is-intersection.ts
403
+ function mustSatisfyAllOfTheFollowing(isTypeA, logging = false, refinements = [isTypeA]) {
404
+ const name = `(${refinements.map((r) => r?.name || `anon`).join(` & `)})`;
405
+ const _ = {
406
+ [name]: (input) => refinements.every(
407
+ (refinement) => (logging && console.log(
408
+ refinements.map((r) => r.name || `anon`).join(` & `),
409
+ `>`,
410
+ refinement.name || `anon`,
411
+ `:`,
412
+ refinement(input)
413
+ ), refinement(input))
414
+ )
415
+ };
416
+ const checkTypes = Object.assign(_[name], {
417
+ and: (isTypeB) => mustSatisfyAllOfTheFollowing(isTypeB, logging, [
418
+ ...refinements,
419
+ isTypeB
420
+ ])
421
+ });
422
+ return checkTypes;
423
+ }
424
+ var isIntersection = mustSatisfyAllOfTheFollowing(canExist);
425
+
426
+ // ../anvl/src/refinement/is-union.ts
427
+ var mustSatisfyOneOfTheFollowing = (isTypeA, logging = false, refinements = [isTypeA]) => {
428
+ const name = `(${refinements.map((r) => r?.name || `anon`).join(` | `)})`;
429
+ const _ = {
430
+ [name]: (input) => refinements.some(
431
+ (refinement) => (logging && console.log(
432
+ refinements.map((r) => r.name || `anon`).join(` | `),
433
+ `>`,
434
+ refinement.name ?? `anon`,
435
+ `:`,
436
+ refinement(input)
437
+ ), refinement(input))
438
+ )
439
+ };
440
+ const checkTypes = Object.assign(_[name], {
441
+ or: (isTypeB) => mustSatisfyOneOfTheFollowing(isTypeB, logging, [...refinements, isTypeB])
442
+ });
443
+ return checkTypes;
444
+ };
445
+ var isUnion = mustSatisfyOneOfTheFollowing(cannotExist);
446
+
447
+ // ../anvl/src/refinement/index.ts
448
+ var isLiteral = (value) => (input) => input === value;
449
+ var isWithin = (args) => (input) => args.includes(input);
450
+
612
451
  // ../anvl/src/json-schema/integer.ts
613
452
  var isInteger = (input) => Number.isInteger(input);
614
453
  var parseInteger = (input) => {
@@ -951,92 +790,150 @@ var nullToObject = () => ({});
951
790
 
952
791
  // ../anvl/src/refinement/smart-cast-json.ts
953
792
  var castToJson = (input) => {
954
- const json = refineJsonType(input);
955
- return {
956
- to: {
957
- array: () => {
958
- switch (json.type) {
959
- case `array`:
960
- return json.data;
961
- case `object`:
962
- return objectToArray(json.data);
963
- case `string`:
964
- return stringToArray(json.data);
965
- case `boolean`:
966
- return booleanToArray(json.data);
967
- case `number`:
968
- return numberToArray(json.data);
969
- case `null`:
970
- return nullToArray();
793
+ const refined = jsonRefinery.refine(input);
794
+ switch (refined?.type) {
795
+ case `array`: {
796
+ const data = refined.data;
797
+ return {
798
+ get array() {
799
+ return data;
800
+ },
801
+ get boolean() {
802
+ return arrayToBoolean(data);
803
+ },
804
+ get number() {
805
+ return arrayToNumber(data);
806
+ },
807
+ get object() {
808
+ return arrayToObject(data);
809
+ },
810
+ get string() {
811
+ return arrayToString(data);
812
+ },
813
+ get null() {
814
+ return null;
971
815
  }
972
- },
973
- boolean: () => {
974
- switch (json.type) {
975
- case `array`:
976
- return arrayToBoolean(json.data);
977
- case `object`:
978
- return objectToBoolean(json.data);
979
- case `string`:
980
- return stringToBoolean(json.data);
981
- case `boolean`:
982
- return json.data;
983
- case `number`:
984
- return numberToBoolean(json.data);
985
- case `null`:
986
- return nullToBoolean();
816
+ };
817
+ }
818
+ case `boolean`: {
819
+ const data = refined.data;
820
+ return {
821
+ get array() {
822
+ return booleanToArray(data);
823
+ },
824
+ get boolean() {
825
+ return data;
826
+ },
827
+ get number() {
828
+ return booleanToNumber(data);
829
+ },
830
+ get object() {
831
+ return booleanToObject(data);
832
+ },
833
+ get string() {
834
+ return booleanToString(data);
835
+ },
836
+ get null() {
837
+ return null;
987
838
  }
988
- },
989
- number: () => {
990
- switch (json.type) {
991
- case `array`:
992
- return arrayToNumber(json.data);
993
- case `object`:
994
- return objectToNumber(json.data);
995
- case `string`:
996
- return stringToNumber(json.data);
997
- case `boolean`:
998
- return booleanToNumber(json.data);
999
- case `number`:
1000
- return json.data;
1001
- case `null`:
1002
- return nullToNumber();
839
+ };
840
+ }
841
+ case `number`: {
842
+ const data = refined.data;
843
+ return {
844
+ get array() {
845
+ return numberToArray(data);
846
+ },
847
+ get boolean() {
848
+ return numberToBoolean(data);
849
+ },
850
+ get number() {
851
+ return data;
852
+ },
853
+ get object() {
854
+ return numberToObject(data);
855
+ },
856
+ get string() {
857
+ return numberToString(data);
858
+ },
859
+ get null() {
860
+ return null;
1003
861
  }
1004
- },
1005
- object: () => {
1006
- switch (json.type) {
1007
- case `array`:
1008
- return arrayToObject(json.data);
1009
- case `object`:
1010
- return json.data;
1011
- case `string`:
1012
- return stringToObject(json.data);
1013
- case `boolean`:
1014
- return booleanToObject(json.data);
1015
- case `number`:
1016
- return numberToObject(json.data);
1017
- case `null`:
1018
- return nullToObject();
862
+ };
863
+ }
864
+ case `object`: {
865
+ const data = refined.data;
866
+ return {
867
+ get array() {
868
+ return objectToArray(data);
869
+ },
870
+ get boolean() {
871
+ return objectToBoolean(data);
872
+ },
873
+ get number() {
874
+ return objectToNumber(data);
875
+ },
876
+ get object() {
877
+ return data;
878
+ },
879
+ get string() {
880
+ return objectToString(data);
881
+ },
882
+ get null() {
883
+ return null;
1019
884
  }
1020
- },
1021
- string: () => {
1022
- switch (json.type) {
1023
- case `array`:
1024
- return arrayToString(json.data);
1025
- case `object`:
1026
- return objectToString(json.data);
1027
- case `string`:
1028
- return json.data;
1029
- case `boolean`:
1030
- return booleanToString(json.data);
1031
- case `number`:
1032
- return numberToString(json.data);
1033
- case `null`:
1034
- return nullToString();
885
+ };
886
+ }
887
+ case `string`: {
888
+ const data = refined.data;
889
+ return {
890
+ get array() {
891
+ return stringToArray(data);
892
+ },
893
+ get boolean() {
894
+ return stringToBoolean(data);
895
+ },
896
+ get number() {
897
+ return stringToNumber(data);
898
+ },
899
+ get object() {
900
+ return stringToObject(data);
901
+ },
902
+ get string() {
903
+ return data;
904
+ },
905
+ get null() {
906
+ return null;
1035
907
  }
1036
- },
1037
- null: () => null
908
+ };
1038
909
  }
1039
- };
910
+ case `null`: {
911
+ refined.data;
912
+ return {
913
+ get array() {
914
+ return nullToArray();
915
+ },
916
+ get boolean() {
917
+ return nullToBoolean();
918
+ },
919
+ get number() {
920
+ return nullToNumber();
921
+ },
922
+ get object() {
923
+ return nullToObject();
924
+ },
925
+ get string() {
926
+ return nullToString();
927
+ },
928
+ get null() {
929
+ return null;
930
+ }
931
+ };
932
+ }
933
+ default:
934
+ console.error(`Could not handle input given to castToJson`);
935
+ throw new Error(`Could not handle input given to castToJson`);
936
+ }
1040
937
  };
1041
938
 
1042
939
  // ../hamr/react-json-editor/src/editors-by-type/utilities/object-properties.ts
@@ -1075,7 +972,7 @@ var makePropertyRecasters = (data, set) => mapObject(
1075
972
  (value, key) => (newType) => {
1076
973
  set(() => ({
1077
974
  ...data,
1078
- [key]: castToJson(value).to[newType]()
975
+ [key]: castToJson(value)[newType]
1079
976
  }));
1080
977
  }
1081
978
  );
@@ -1224,7 +1121,7 @@ var BooleanEditor = ({
1224
1121
  ) });
1225
1122
  var NullEditor = ({
1226
1123
  Components
1227
- }) => /* @__PURE__ */ jsx(Components.NullWrapper, { children: '" "' });
1124
+ }) => /* @__PURE__ */ jsx(Components.NullWrapper, { children: " " });
1228
1125
  var NumberEditor = ({
1229
1126
  path = [],
1230
1127
  isReadonly = () => false,
@@ -1333,7 +1230,7 @@ var DEFAULT_JSON_EDITOR_COMPONENTS = {
1333
1230
  children
1334
1231
  }
1335
1232
  ),
1336
- EditorWrapper: ({ children, className }) => /* @__PURE__ */ jsx("div", { className: `json_editor ` + className, children }),
1233
+ EditorWrapper: ({ children, className }) => /* @__PURE__ */ jsx("div", { className: `json_editor` + (className ? ` ${className}` : ``), children }),
1337
1234
  EditorLayout: ({
1338
1235
  DeleteButton,
1339
1236
  Header,
@@ -1412,13 +1309,20 @@ var SubEditors = {
1412
1309
  object: ObjectEditor,
1413
1310
  string: StringEditor
1414
1311
  };
1312
+ var fallback = (fn, fallbackValue) => {
1313
+ try {
1314
+ return fn();
1315
+ } catch (_) {
1316
+ return fallbackValue;
1317
+ }
1318
+ };
1415
1319
  var StateEditor = ({ token }) => {
1416
1320
  const set = useI(token);
1417
1321
  const data = useO(token);
1418
1322
  return isJson(data) ? /* @__PURE__ */ jsx(JsonEditor, { data, set, schema: true }) : /* @__PURE__ */ jsx("div", { className: "json_editor", children: /* @__PURE__ */ jsx(
1419
1323
  ElasticInput,
1420
1324
  {
1421
- value: data !== null && typeof data === `object` && `toJson` in data && typeof data.toJson === `function` ? JSON.stringify(data.toJson()) : data instanceof Set ? `Set { ${JSON.stringify([...data]).slice(1, -1)} }` : Object.getPrototypeOf(data).constructor.name + ` ` + fallback(() => JSON.stringify(data), `?`),
1325
+ value: data === void 0 || data === null ? `` : typeof data === `object` && `toJson` in data && typeof data.toJson === `function` ? JSON.stringify(data.toJson()) : data instanceof Set ? `Set { ${JSON.stringify([...data]).slice(1, -1)} }` : Object.getPrototypeOf(data).constructor.name + ` ` + fallback(() => JSON.stringify(data), `?`),
1422
1326
  disabled: true
1423
1327
  }
1424
1328
  ) });
@@ -1447,19 +1351,34 @@ var StoreEditor = ({ token }) => {
1447
1351
  }
1448
1352
  return /* @__PURE__ */ jsx(StateEditor, { token });
1449
1353
  };
1450
- var findStateTypeState = selectorFamily({
1451
- key: `\u{1F441}\u200D\u{1F5E8} State Type`,
1452
- get: (token) => ({ get }) => {
1453
- let state;
1454
- try {
1455
- state = get(token);
1456
- } catch (error) {
1457
- return `error`;
1458
- }
1459
- if (state === void 0) return `undefined`;
1460
- if (isJson(state)) return refineJsonType(state).type;
1461
- return Object.getPrototypeOf(state).constructor.name;
1462
- }
1354
+ var {
1355
+ atomIndex,
1356
+ selectorIndex,
1357
+ transactionIndex,
1358
+ transactionLogSelectors,
1359
+ timelineIndex,
1360
+ timelineSelectors,
1361
+ typeSelectors
1362
+ } = attachIntrospectionStates();
1363
+ var devtoolsAreOpenState = atom({
1364
+ key: `\u{1F441}\u200D\u{1F5E8} Devtools Are Open`,
1365
+ default: true,
1366
+ effects: typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, `\u{1F441}\u200D\u{1F5E8} Devtools Are Open`)]
1367
+ });
1368
+ var devtoolsViewSelectionState = atom({
1369
+ key: `\u{1F441}\u200D\u{1F5E8} Devtools View Selection`,
1370
+ default: `atoms`,
1371
+ effects: typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, `\u{1F441}\u200D\u{1F5E8} Devtools View`)]
1372
+ });
1373
+ var devtoolsViewOptionsState = atom({
1374
+ key: `\u{1F441}\u200D\u{1F5E8} Devtools View Options`,
1375
+ default: [`atoms`, `selectors`, `transactions`, `timelines`],
1376
+ effects: typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, `\u{1F441}\u200D\u{1F5E8} Devtools View Options`)]
1377
+ });
1378
+ var viewIsOpenAtoms = atomFamily({
1379
+ key: `\u{1F441}\u200D\u{1F5E8} Devtools View Is Open`,
1380
+ default: false,
1381
+ effects: (key) => typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, key + `:view-is-open`)]
1463
1382
  });
1464
1383
  var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
1465
1384
  const setIsOpen = useI(isOpenState);
@@ -1506,8 +1425,8 @@ var StateIndexTreeNode = ({ node, isOpenState }) => {
1506
1425
  const setIsOpen = useI(isOpenState);
1507
1426
  const isOpen = useO(isOpenState);
1508
1427
  for (const [key, childNode] of node.familyMembers) {
1509
- findState(findViewIsOpenState, key);
1510
- findState(findStateTypeState, childNode.key);
1428
+ findState(viewIsOpenAtoms, key);
1429
+ findState(typeSelectors, childNode.key);
1511
1430
  }
1512
1431
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1513
1432
  /* @__PURE__ */ jsxs("header", { children: [
@@ -1528,8 +1447,8 @@ var StateIndexTreeNode = ({ node, isOpenState }) => {
1528
1447
  StateIndexNode,
1529
1448
  {
1530
1449
  node: childNode,
1531
- isOpenState: findState(findViewIsOpenState, childNode.key),
1532
- typeState: findState(findStateTypeState, childNode.key)
1450
+ isOpenState: findState(viewIsOpenAtoms, childNode.key),
1451
+ typeState: findState(typeSelectors, childNode.key)
1533
1452
  },
1534
1453
  key
1535
1454
  )) : null
@@ -1552,8 +1471,8 @@ var StateIndex = ({ tokenIndex }) => {
1552
1471
  StateIndexNode,
1553
1472
  {
1554
1473
  node,
1555
- isOpenState: findState(findViewIsOpenState, node.key),
1556
- typeState: findState(findStateTypeState, node.key)
1474
+ isOpenState: findState(viewIsOpenAtoms, node.key),
1475
+ typeState: findState(typeSelectors, node.key)
1557
1476
  },
1558
1477
  key
1559
1478
  );
@@ -1791,8 +1710,8 @@ var TimelineIndex = () => {
1791
1710
  TimelineLog,
1792
1711
  {
1793
1712
  token,
1794
- isOpenState: findState(findViewIsOpenState, token.key),
1795
- timelineState: findState(findTimelineState, token.key)
1713
+ isOpenState: findState(viewIsOpenAtoms, token.key),
1714
+ timelineState: findState(timelineSelectors, token.key)
1796
1715
  },
1797
1716
  token.key
1798
1717
  );
@@ -1845,8 +1764,8 @@ var TransactionIndex = () => {
1845
1764
  TransactionLog,
1846
1765
  {
1847
1766
  token,
1848
- isOpenState: findState(findViewIsOpenState, token.key),
1849
- logState: findState(findTransactionLogState, token.key)
1767
+ isOpenState: findState(viewIsOpenAtoms, token.key),
1768
+ logState: findState(transactionLogSelectors, token.key)
1850
1769
  },
1851
1770
  token.key
1852
1771
  );
@@ -1930,52 +1849,4 @@ var AtomIODevtools = () => {
1930
1849
  ] });
1931
1850
  };
1932
1851
 
1933
- // react-devtools/src/index.ts
1934
- var {
1935
- atomIndex,
1936
- selectorIndex,
1937
- transactionIndex,
1938
- findTransactionLogState,
1939
- timelineIndex,
1940
- findTimelineState
1941
- } = attachIntrospectionStates();
1942
- var devtoolsAreOpenState = atom({
1943
- key: `\u{1F441}\u200D\u{1F5E8} Devtools Are Open`,
1944
- default: true,
1945
- effects: [lazyLocalStorageEffect(`\u{1F441}\u200D\u{1F5E8} Devtools Are Open`)]
1946
- });
1947
- var devtoolsViewSelectionState = atom({
1948
- key: `\u{1F441}\u200D\u{1F5E8} Devtools View Selection`,
1949
- default: `atoms`,
1950
- effects: [lazyLocalStorageEffect(`\u{1F441}\u200D\u{1F5E8} Devtools View`)]
1951
- });
1952
- var devtoolsViewOptionsState = atom({
1953
- key: `\u{1F441}\u200D\u{1F5E8} Devtools View Options`,
1954
- default: [`atoms`, `selectors`, `transactions`, `timelines`],
1955
- effects: [lazyLocalStorageEffect(`\u{1F441}\u200D\u{1F5E8} Devtools View Options`)]
1956
- });
1957
- var findViewIsOpenState = atomFamily({
1958
- key: `\u{1F441}\u200D\u{1F5E8} Devtools View Is Open`,
1959
- default: false,
1960
- effects: (key) => [lazyLocalStorageEffect(key + `:view-is-open`)]
1961
- });
1962
- var primitiveRefinery = new Refinery({
1963
- number: (input) => typeof input === `number`,
1964
- string: (input) => typeof input === `string`,
1965
- boolean: (input) => typeof input === `boolean`,
1966
- null: (input) => input === null
1967
- });
1968
- var jsonTreeRefinery = new Refinery({
1969
- object: isPlainObject,
1970
- array: (input) => Array.isArray(input)
1971
- });
1972
- var prettyJson = new Differ(primitiveRefinery, jsonTreeRefinery, {
1973
- number: diffNumber,
1974
- string: diffString,
1975
- boolean: diffBoolean,
1976
- null: () => ({ summary: `No Change` }),
1977
- object: diffObject,
1978
- array: diffArray
1979
- });
1980
-
1981
- export { AtomIODevtools, atomIndex, devtoolsAreOpenState, devtoolsViewOptionsState, devtoolsViewSelectionState, findTimelineState, findTransactionLogState, findViewIsOpenState, jsonTreeRefinery, prettyJson, primitiveRefinery, selectorIndex, timelineIndex, transactionIndex };
1852
+ export { AtomIODevtools };