atom.io 0.19.0 → 0.19.2

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 (110) hide show
  1. package/data/dist/index.cjs +99 -79
  2. package/data/dist/index.js +2 -2
  3. package/data/src/join.ts +91 -74
  4. package/dist/{chunk-YDOGCZ53.js → chunk-ATKDGVTV.js} +29 -29
  5. package/dist/{chunk-CVBEVTM5.js → chunk-CC7IF7QF.js} +5 -42
  6. package/dist/{chunk-WX2NCOZR.js → chunk-FTONNX2R.js} +8 -8
  7. package/dist/{chunk-7ZR244C2.js → chunk-MSCJWACE.js} +92 -72
  8. package/dist/index.cjs +15 -7
  9. package/dist/index.d.ts +24 -35
  10. package/dist/index.js +15 -7
  11. package/internal/dist/index.cjs +56 -44
  12. package/internal/dist/index.d.ts +21 -21
  13. package/internal/dist/index.js +49 -37
  14. package/internal/src/atom/create-regular-atom.ts +7 -5
  15. package/internal/src/atom/delete-atom.ts +2 -2
  16. package/internal/src/families/create-readonly-selector-family.ts +2 -2
  17. package/internal/src/families/create-regular-atom-family.ts +1 -1
  18. package/internal/src/families/create-writable-selector-family.ts +1 -1
  19. package/internal/src/future.ts +4 -2
  20. package/internal/src/lineage.ts +1 -0
  21. package/internal/src/mutable/create-mutable-atom-family.ts +1 -1
  22. package/internal/src/mutable/create-mutable-atom.ts +7 -5
  23. package/internal/src/mutable/tracker.ts +4 -4
  24. package/internal/src/mutable/transceiver.ts +2 -2
  25. package/internal/src/selector/delete-selector.ts +1 -1
  26. package/internal/src/set-state/become.ts +1 -1
  27. package/internal/src/set-state/copy-mutable-if-needed.ts +1 -1
  28. package/internal/src/store/deposit.ts +5 -5
  29. package/internal/src/store/store.ts +5 -5
  30. package/internal/src/store/withdraw.ts +4 -5
  31. package/internal/src/subject.ts +3 -1
  32. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  33. package/internal/src/subscribe/subscribe-to-transaction.ts +4 -4
  34. package/internal/src/timeline/add-atom-to-timeline.ts +16 -11
  35. package/internal/src/timeline/create-timeline.ts +3 -4
  36. package/internal/src/transaction/act-upon-store.ts +5 -5
  37. package/internal/src/transaction/apply-transaction.ts +4 -4
  38. package/internal/src/transaction/build-transaction.ts +10 -7
  39. package/internal/src/transaction/create-transaction.ts +10 -10
  40. package/internal/src/transaction/index.ts +3 -3
  41. package/internal/src/transaction/is-root-store.ts +2 -2
  42. package/introspection/dist/index.cjs +3 -2
  43. package/introspection/dist/index.d.ts +6 -6
  44. package/introspection/dist/index.js +3 -2
  45. package/introspection/src/attach-atom-index.ts +5 -4
  46. package/introspection/src/attach-introspection-states.ts +3 -3
  47. package/introspection/src/attach-transaction-index.ts +4 -4
  48. package/introspection/src/attach-transaction-logs.ts +8 -4
  49. package/introspection/src/index.ts +3 -3
  50. package/json/dist/index.cjs +6 -2
  51. package/json/dist/index.d.ts +1 -1
  52. package/json/dist/index.js +8 -4
  53. package/json/src/select-json-family.ts +3 -2
  54. package/json/src/select-json.ts +3 -1
  55. package/package.json +243 -242
  56. package/react/dist/index.cjs +9 -3
  57. package/react/dist/index.js +9 -3
  58. package/react/src/use-i.ts +3 -1
  59. package/react/src/use-tl.ts +6 -2
  60. package/react-devtools/dist/index.cjs +332 -978
  61. package/react-devtools/dist/index.css +0 -18
  62. package/react-devtools/dist/index.d.ts +7 -9
  63. package/react-devtools/dist/index.js +291 -881
  64. package/react-devtools/src/AtomIODevtools.tsx +5 -2
  65. package/react-devtools/src/Button.tsx +6 -2
  66. package/react-devtools/src/StateEditor.tsx +13 -16
  67. package/react-devtools/src/StateIndex.tsx +28 -21
  68. package/react-devtools/src/TimelineIndex.tsx +17 -6
  69. package/react-devtools/src/TransactionIndex.tsx +13 -6
  70. package/react-devtools/src/Updates.tsx +24 -9
  71. package/realtime/dist/index.cjs +1 -0
  72. package/realtime/dist/index.d.ts +2 -2
  73. package/realtime/dist/index.js +1 -0
  74. package/realtime/src/realtime-continuity.ts +4 -3
  75. package/realtime-client/dist/index.cjs +29 -29
  76. package/realtime-client/dist/index.d.ts +2 -2
  77. package/realtime-client/dist/index.js +1 -1
  78. package/realtime-client/src/server-action.ts +2 -2
  79. package/realtime-client/src/sync-continuity.ts +23 -23
  80. package/realtime-react/dist/index.cjs +30 -30
  81. package/realtime-react/dist/index.d.ts +2 -2
  82. package/realtime-react/dist/index.js +2 -2
  83. package/realtime-react/src/use-server-action.ts +3 -3
  84. package/realtime-react/src/use-single-effect.ts +1 -1
  85. package/realtime-server/dist/index.cjs +54 -44
  86. package/realtime-server/dist/index.d.ts +6 -6
  87. package/realtime-server/dist/index.js +34 -24
  88. package/realtime-server/src/ipc-sockets/child-socket.ts +7 -7
  89. package/realtime-server/src/ipc-sockets/custom-socket.ts +4 -8
  90. package/realtime-server/src/ipc-sockets/parent-socket.ts +13 -7
  91. package/realtime-server/src/realtime-action-receiver.ts +7 -5
  92. package/realtime-server/src/realtime-continuity-synchronizer.ts +3 -3
  93. package/realtime-server/src/realtime-server-stores/server-room-external-store.ts +2 -2
  94. package/realtime-server/src/realtime-state-receiver.ts +3 -1
  95. package/realtime-testing/dist/index.cjs +15 -13
  96. package/realtime-testing/dist/index.js +9 -7
  97. package/realtime-testing/src/setup-realtime-test.tsx +7 -5
  98. package/src/atom.ts +4 -8
  99. package/src/dispose.ts +1 -0
  100. package/src/index.ts +2 -9
  101. package/src/selector.ts +4 -8
  102. package/src/silo.ts +13 -3
  103. package/src/subscribe.ts +6 -6
  104. package/src/timeline.ts +4 -4
  105. package/src/transaction.ts +24 -24
  106. package/src/validators.ts +2 -2
  107. package/transceivers/set-rtx/dist/index.cjs +11 -12
  108. package/transceivers/set-rtx/dist/index.js +11 -12
  109. package/transceivers/set-rtx/src/set-rtx.ts +10 -10
  110. /package/dist/{chunk-VAE5OCKN.js → chunk-BF4MVQF6.js} +0 -0
@@ -2,31 +2,10 @@
2
2
 
3
3
  var atom_io = require('atom.io');
4
4
  var introspection = require('atom.io/introspection');
5
- var react = require('atom.io/react');
5
+ var react$1 = require('atom.io/react');
6
6
  var framerMotion = require('framer-motion');
7
- var React = require('react');
7
+ var react = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
- var react$1 = require('@floating-ui/react');
10
-
11
- function _interopNamespace(e) {
12
- if (e && e.__esModule) return e;
13
- var n = Object.create(null);
14
- if (e) {
15
- Object.keys(e).forEach(function (k) {
16
- if (k !== 'default') {
17
- var d = Object.getOwnPropertyDescriptor(e, k);
18
- Object.defineProperty(n, k, d.get ? d : {
19
- enumerable: true,
20
- get: function () { return e[k]; }
21
- });
22
- }
23
- });
24
- }
25
- n.default = e;
26
- return Object.freeze(n);
27
- }
28
-
29
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
9
 
31
10
  var __defProp = Object.defineProperty;
32
11
  var __defProps = Object.defineProperties;
@@ -97,18 +76,6 @@ var doNothing = () => void 0;
97
76
  var become = (nextVersionOfThing) => (originalThing) => nextVersionOfThing instanceof Function ? nextVersionOfThing(
98
77
  originalThing instanceof Function ? originalThing() : originalThing
99
78
  ) : nextVersionOfThing;
100
- var isModifier = (validate) => (sample) => {
101
- const sampleIsValid = validate(sample);
102
- if (!sampleIsValid) {
103
- throw new Error(`Invalid test case: JSON.stringify(${sample})`);
104
- }
105
- return (input) => {
106
- if (typeof input !== `function`)
107
- return false;
108
- const testResult = input(sample);
109
- return validate(testResult);
110
- };
111
- };
112
79
  var pass = (...params) => (fn) => fn(...params);
113
80
  var raiseError = (message) => {
114
81
  throw new Error(message);
@@ -121,24 +88,11 @@ var fallback = (fn, fallbackValue) => {
121
88
  }
122
89
  };
123
90
 
124
- // ../anvl/src/array/venn.ts
125
- var includesAll = (items) => (array) => {
126
- for (const item of items) {
127
- if (!array.includes(item))
128
- return false;
129
- }
130
- return true;
131
- };
132
- var comprises = (items) => (array) => includesAll(items)(array) && includesAll(array)(items);
133
-
134
91
  // ../anvl/src/array/index.ts
135
92
  var isArray = (isType) => (input) => Array.isArray(input) && input.every((item) => isType(item));
136
93
  var map = (f) => (a2) => a2.map(f);
137
94
  var every = (f = Boolean) => (a2) => a2.every(f);
138
95
  var allTrue = every((x) => x === true);
139
- var addTo = (a2) => (x) => a2.includes(x) ? a2 : [...a2, x];
140
- var isEmptyArray = (input) => Array.isArray(input) && input.length === 0;
141
- var isOneOf = (...args) => (input) => args.includes(input);
142
96
 
143
97
  // ../anvl/src/nullish/index.ts
144
98
  var isUndefined = (input) => input === void 0;
@@ -166,7 +120,6 @@ var mob = (fn) => (obj) => mapObject(obj, fn);
166
120
  // ../anvl/src/object/refinement.ts
167
121
  var isNonNullObject = (input) => typeof input === `object` && input !== null;
168
122
  var isPlainObject = (input) => isNonNullObject(input) && Object.getPrototypeOf(input) === Object.prototype;
169
- var isEmptyObject = (input) => isPlainObject(input) && Object.keys(input).length === 0;
170
123
  var isRecord = (isKey, isValue) => (input) => isPlainObject(input) && Object.entries(input).every(([k, v]) => isKey(k) && isValue(v));
171
124
  var hasProperties = (isValue, options = { allowExtraProperties: false }) => {
172
125
  const name = `{${recordToEntries(
@@ -195,20 +148,19 @@ var hasProperties = (isValue, options = { allowExtraProperties: false }) => {
195
148
  };
196
149
  var ALLOW_EXTENSION = { allowExtraProperties: true };
197
150
  var doesExtend = (isValue) => hasProperties(isValue, ALLOW_EXTENSION);
198
- var DO_NOT_ALLOW_EXTENSION = { allowExtraProperties: false };
199
- var hasExactProperties = (isValue) => hasProperties(isValue, DO_NOT_ALLOW_EXTENSION);
200
151
 
201
152
  // ../anvl/src/object/sprawl.ts
202
153
  var sprawl = (tree, inspector) => {
203
154
  const walk = (path, node) => {
204
- const inspect = (path2, node2) => {
205
- const result2 = inspector(path2, node2);
155
+ var _a2;
156
+ const inspect = (p, n) => {
157
+ const result2 = inspector(p, n);
206
158
  if (result2)
207
159
  return result2;
208
160
  return null;
209
161
  };
210
162
  const result = inspect(path, node);
211
- if ((result == null ? void 0 : result.jobComplete) || (result == null ? void 0 : result.pathComplete)) {
163
+ if ((_a2 = result == null ? void 0 : result.jobComplete) != null ? _a2 : result == null ? void 0 : result.pathComplete) {
212
164
  return result;
213
165
  }
214
166
  const childEntries = Array.isArray(node) ? node.map((v, i) => [i, v]) : isPlainObject(node) ? Object.entries(node) : [];
@@ -224,16 +176,6 @@ var sprawl = (tree, inspector) => {
224
176
  };
225
177
 
226
178
  // ../anvl/src/object/index.ts
227
- var treeShake = (shouldDiscard = isUndefined) => (obj) => {
228
- const newObj = {};
229
- const entries = Object.entries(obj);
230
- for (const [key, val] of entries) {
231
- if (!shouldDiscard(val, key)) {
232
- newObj[key] = val;
233
- }
234
- }
235
- return newObj;
236
- };
237
179
  var delve = (obj, path) => {
238
180
  const found = path.reduce((acc, key) => acc == null ? void 0 : acc[key], obj);
239
181
  return found === void 0 ? new Error(`Not found`) : { found };
@@ -258,7 +200,7 @@ var Refinery = class {
258
200
  if (input instanceof refiner) {
259
201
  return { type: key, data: input };
260
202
  }
261
- } catch (e2) {
203
+ } catch (_) {
262
204
  }
263
205
  }
264
206
  }
@@ -332,8 +274,8 @@ var isJson = (input) => {
332
274
  if (input === void 0)
333
275
  return false;
334
276
  const prototype = (_a2 = Object.getPrototypeOf(input)) == null ? void 0 : _a2.constructor.name;
335
- const isJson2 = JSON_PROTOTYPES.includes(prototype);
336
- return isJson2;
277
+ const refine = JSON_PROTOTYPES.includes(prototype);
278
+ return refine;
337
279
  };
338
280
 
339
281
  // ../anvl/src/refinement/can-exist.ts
@@ -526,13 +468,16 @@ var persistAtom = (storage) => ({ stringify, parse }) => (key) => ({ setSelf, on
526
468
  });
527
469
  };
528
470
  var lazyLocalStorageEffect = persistAtom(window.localStorage)(JSON);
529
- var OpenClose = ({ isOpen, setIsOpen, disabled }) => {
471
+ var OpenClose = ({ isOpen, setIsOpen, disabled, testid }) => {
530
472
  return /* @__PURE__ */ jsxRuntime.jsx(
531
473
  "button",
532
474
  {
533
475
  type: "button",
476
+ "data-testid": testid,
534
477
  className: `carat ${isOpen ? `open` : `closed`}`,
535
- onClick: () => setIsOpen((isOpen2) => !isOpen2),
478
+ onClick: () => {
479
+ setIsOpen((prev) => !prev);
480
+ },
536
481
  disabled,
537
482
  children: "\u25B6"
538
483
  }
@@ -541,307 +486,12 @@ var OpenClose = ({ isOpen, setIsOpen, disabled }) => {
541
486
  var button = {
542
487
  OpenClose
543
488
  };
544
-
545
- // ../anvl/src/join/core-relation-data.ts
546
- var RELATION_TYPES = [`1:1`, `1:n`, `n:n`];
547
- var isRelationType = (x) => RELATION_TYPES.includes(x);
548
- var EMPTY_RELATION_DATA = {
549
- contents: {},
550
- relations: {},
551
- relationType: `n:n`,
552
- a: `from`,
553
- b: `to`
554
- };
555
- var isRelationData = ({
556
- from: a2 = `from`,
557
- to: b2 = `to`,
558
- isContent
559
- } = {}) => (input) => {
560
- return hasExactProperties({
561
- contents: isContent ? isRecord(isString, isContent) : hasExactProperties({}),
562
- relations: isRecord(isString, isArray(isString)),
563
- relationType: isRelationType,
564
- a: isLiteral(a2),
565
- b: isLiteral(b2)
566
- })(input);
567
- };
568
-
569
- // ../anvl/src/join/get-related-ids.ts
570
- var getRelatedIds = (relationMap, id) => {
571
- var _a2;
572
- return (_a2 = relationMap.relations[id]) != null ? _a2 : [];
573
- };
574
- var getRelatedId = (relationMap, id) => {
575
- const relations = getRelatedIds(relationMap, id);
576
- if (relations.length > 1) {
577
- console.warn(
578
- `entry with id ${id} was not expected to have multiple relations`
579
- );
580
- }
581
- return relations[0];
582
- };
583
-
584
- // ../anvl/src/join/make-json-interface.ts
585
- var makeJsonInterface = (join, ...params) => {
586
- const isContent = params[0];
587
- const { a: a2, b: b2 } = join;
588
- const options = {
589
- from: a2,
590
- to: b2,
591
- isContent
592
- };
593
- return {
594
- toJson: (join2) => join2.toJSON(),
595
- fromJson: (json) => Join.fromJSON(json, options)
596
- };
597
- };
598
-
599
- // ../anvl/src/join/relation-record.ts
600
- var getRelationEntries = (relationMap, idA) => getRelatedIds(relationMap, idA).map((idB) => [
601
- idB,
602
- getContent(relationMap, idA, idB)
603
- ]);
604
- var getRelationRecord = (relationMap, id) => Object.fromEntries(getRelationEntries(relationMap, id));
605
-
606
- // ../anvl/src/string/split.ts
607
- var split = (separator) => (str) => str.split(separator);
608
-
609
- // ../anvl/src/join/remove-relation.ts
610
- var removeSpecific = (current, idA, idB) => {
611
- const isIdForRemoval = isOneOf(idA, idB);
612
- return __spreadProps(__spreadValues({}, current), {
613
- relations: pipe(
614
- current.relations,
615
- recordToEntries,
616
- map(([id, relations]) => [
617
- id,
618
- isIdForRemoval(id) ? relations.filter((relation) => !isIdForRemoval(relation)) : relations
619
- ]),
620
- entriesToRecord,
621
- treeShake(isEmptyArray)
622
- ),
623
- contents: pipe(
624
- current.contents,
625
- treeShake(
626
- (_, key) => isString(key) && pipe(key, split(`/`), comprises([idA, idB]))
627
- )
628
- )
629
- });
630
- };
631
- var removeAll = (current, idToRemove) => {
632
- const next = __spreadProps(__spreadValues({}, current), {
633
- relations: pipe(
634
- current.relations,
635
- recordToEntries,
636
- map(([id, relations]) => [
637
- id,
638
- relations.filter((relation) => relation !== idToRemove)
639
- ]),
640
- entriesToRecord,
641
- treeShake((val, key) => key === idToRemove || isEmptyArray(val))
642
- ),
643
- contents: pipe(
644
- current.contents,
645
- treeShake(
646
- (_, key) => isString(key) && key.split(`/`).includes(idToRemove)
647
- )
648
- )
649
- });
650
- return next;
651
- };
652
- var removeRelation = (current, relation) => {
653
- const idA = relation[current.a];
654
- const idB = relation[current.b];
655
- return idB ? removeSpecific(current, idA, idB) : removeAll(current, idA);
656
- };
657
-
658
- // ../anvl/src/join/set-relation.ts
659
- var setManyToMany = (map2, idA, idB, ...rest) => {
660
- var _a2, _b;
661
- const next = __spreadProps(__spreadValues({}, map2), {
662
- relations: __spreadProps(__spreadValues({}, map2.relations), {
663
- [idA]: addTo((_a2 = map2.relations[idA]) != null ? _a2 : [])(idB),
664
- [idB]: addTo((_b = map2.relations[idB]) != null ? _b : [])(idA)
665
- })
666
- });
667
- const content = rest[0];
668
- return content ? setContent(next, idA, idB, content) : next;
669
- };
670
- var removeEmpties = treeShake(isEmptyArray);
671
- var set1ToMany = (current, leaderId, followerId, ...rest) => {
672
- var _a2;
673
- const relations = __spreadValues({}, current.relations);
674
- const prevLeaderId = getRelatedId(current, followerId);
675
- const next = __spreadProps(__spreadValues({}, current), {
676
- relations: removeEmpties(__spreadProps(__spreadValues(__spreadValues({}, relations), prevLeaderId && prevLeaderId !== leaderId && {
677
- [prevLeaderId]: relations[prevLeaderId].filter(
678
- (id) => id !== followerId
679
- )
680
- }), {
681
- [followerId]: [leaderId],
682
- [leaderId]: addTo((_a2 = relations[leaderId]) != null ? _a2 : [])(followerId)
683
- }))
684
- });
685
- const content = rest[0];
686
- return content ? setContent(next, leaderId, followerId, content) : next;
687
- };
688
- var set1To1 = (current, wifeId, husbandId, ...rest) => {
689
- const prevWifeId = getRelatedId(current, husbandId);
690
- const prevHusbandId = getRelatedId(current, wifeId);
691
- const next = __spreadProps(__spreadValues({}, current), {
692
- relations: removeEmpties(__spreadProps(__spreadValues(__spreadValues(__spreadValues({}, current.relations), prevWifeId && { [prevWifeId]: [] }), prevHusbandId && { [prevHusbandId]: [] }), {
693
- [wifeId]: [husbandId],
694
- [husbandId]: [wifeId]
695
- }))
696
- });
697
- const content = rest[0];
698
- return content ? setContent(next, wifeId, husbandId, content) : next;
699
- };
700
- var setRelationWithContent = (current, relation, ...rest) => {
701
- const { [current.a]: idA, [current.b]: idB } = relation;
702
- switch (current.relationType) {
703
- case `1:1`:
704
- return set1To1(current, idA, idB, ...rest);
705
- case `1:n`:
706
- return set1ToMany(current, idA, idB, ...rest);
707
- case `n:n`:
708
- return setManyToMany(current, idA, idB, ...rest);
709
- }
710
- };
711
-
712
- // ../anvl/src/join/relation-contents.ts
713
- var makeContentId = (idA, idB) => [idA, idB].sort().join(`/`);
714
- var getContent = (relationMap, idA, idB) => relationMap.contents[makeContentId(idA, idB)];
715
- var setContent = (map2, idA, idB, content) => __spreadProps(__spreadValues({}, map2), {
716
- contents: __spreadProps(__spreadValues({}, map2.contents), {
717
- [makeContentId(idA, idB)]: content
718
- })
719
- });
720
- var getRelations = (relationMap, id) => getRelationEntries(relationMap, id).map(
721
- ([id2, content]) => __spreadValues({
722
- id: id2
723
- }, content)
724
- );
725
- var setRelations = (current, subject, relations) => {
726
- const idA = subject[current.a];
727
- const idB = subject[current.b];
728
- return pipe(
729
- current,
730
- (relationData) => {
731
- const relatedIds = getRelatedIds(current, idA);
732
- const removedIds = relatedIds.filter(
733
- (id) => !relations.some((r) => r.id === id)
734
- );
735
- let step = relationData;
736
- for (const id of removedIds) {
737
- const remove = {
738
- [current.a]: idA != null ? idA : id,
739
- [current.b]: idB != null ? idB : id
740
- };
741
- step = removeRelation(step, remove);
742
- }
743
- return step;
744
- },
745
- (relationData) => {
746
- let step = relationData;
747
- for (const _a2 of relations) {
748
- const _b = _a2, { id } = _b, rest = __objRest(_b, ["id"]);
749
- const content = isEmptyObject(rest) ? void 0 : rest;
750
- step = setRelationWithContent(
751
- step,
752
- { [current.a]: idA != null ? idA : id, [current.b]: idB != null ? idB : id },
753
- // @ts-expect-error hacky
754
- content
755
- );
756
- }
757
- return step;
758
- },
759
- (relationData) => {
760
- const newlyOrderedIds = relations.map((r) => r.id);
761
- return __spreadProps(__spreadValues({}, relationData), {
762
- relations: __spreadProps(__spreadValues({}, relationData.relations), {
763
- [idA != null ? idA : idB]: newlyOrderedIds
764
- })
765
- });
766
- }
767
- );
768
- };
769
-
770
- // ../anvl/src/join/index.ts
771
- var Join = class _Join {
772
- constructor(json) {
773
- this.a = `from`;
774
- this.b = `to`;
775
- this.makeJsonInterface = (...params) => {
776
- return makeJsonInterface(this, ...params);
777
- };
778
- Object.assign(this, __spreadProps(__spreadValues(__spreadValues({}, EMPTY_RELATION_DATA), json), {
779
- makeJsonInterface: this.makeJsonInterface
780
- }));
781
- }
782
- toJSON() {
783
- return {
784
- relationType: this.relationType,
785
- relations: this.relations,
786
- contents: this.contents,
787
- a: this.a,
788
- b: this.b
789
- };
790
- }
791
- static fromJSON(json, options) {
792
- const isValid = isRelationData(options)(json);
793
- if (isValid) {
794
- return new _Join(json);
795
- }
796
- throw new Error(
797
- `Saved JSON for this Join is invalid: ${JSON.stringify(json)}`
798
- );
799
- }
800
- from(newA) {
801
- return new _Join(__spreadProps(__spreadValues({}, this), { a: newA }));
802
- }
803
- to(newB) {
804
- return new _Join(__spreadProps(__spreadValues({}, this), { b: newB }));
805
- }
806
- getRelatedId(id) {
807
- return getRelatedId(this, id);
808
- }
809
- getRelatedIds(id) {
810
- return getRelatedIds(this, id);
811
- }
812
- getContent(idA, idB) {
813
- return getContent(this, idA, idB);
814
- }
815
- getRelationEntries(id) {
816
- return getRelationEntries(this, id);
817
- }
818
- getRelationRecord(id) {
819
- return getRelationRecord(this, id);
820
- }
821
- getRelation(id) {
822
- return getRelations(this, id)[0];
823
- }
824
- getRelations(id) {
825
- return getRelations(this, id);
826
- }
827
- setRelations(subject, relations) {
828
- return new _Join(setRelations(this, subject, relations));
829
- }
830
- set(relation, ...rest) {
831
- return new _Join(setRelationWithContent(this, relation, ...rest));
832
- }
833
- remove(relation) {
834
- return new _Join(
835
- removeRelation(this, relation)
836
- );
837
- }
838
- };
839
- var ElasticInput = React.forwardRef(function ElasticInputFC(props, ref) {
840
- var _a2, _b, _c, _d;
841
- const inputRef = React.useRef(null);
842
- const spanRef = React.useRef(null);
843
- const [inputWidth, setInputWidth] = React.useState(`auto`);
844
- React.useImperativeHandle(
489
+ var ElasticInput = react.forwardRef(function ElasticInputFC(props, ref) {
490
+ var _a2, _b, _c, _d, _e, _f;
491
+ const inputRef = react.useRef(null);
492
+ const spanRef = react.useRef(null);
493
+ const [inputWidth, setInputWidth] = react.useState(`auto`);
494
+ react.useImperativeHandle(
845
495
  ref,
846
496
  () => ({
847
497
  focus: () => {
@@ -851,7 +501,7 @@ var ElasticInput = React.forwardRef(function ElasticInputFC(props, ref) {
851
501
  })
852
502
  );
853
503
  const extraWidth = props.type === `number` ? 15 : 0;
854
- React.useLayoutEffect(() => {
504
+ react.useLayoutEffect(() => {
855
505
  if (spanRef.current) {
856
506
  setInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`);
857
507
  const interval = setInterval(() => {
@@ -859,7 +509,9 @@ var ElasticInput = React.forwardRef(function ElasticInputFC(props, ref) {
859
509
  setInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`);
860
510
  }
861
511
  }, 1e3);
862
- return () => clearInterval(interval);
512
+ return () => {
513
+ clearInterval(interval);
514
+ };
863
515
  }
864
516
  }, [(_a2 = inputRef.current) == null ? void 0 : _a2.value, props.value]);
865
517
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: `inline-block`, position: `relative` }, children: [
@@ -887,8 +539,8 @@ var ElasticInput = React.forwardRef(function ElasticInputFC(props, ref) {
887
539
  visibility: `hidden`,
888
540
  // color: `red`,
889
541
  whiteSpace: `pre`,
890
- fontFamily: ((_c = props.style) == null ? void 0 : _c.fontFamily) || `inherit`,
891
- fontSize: ((_d = props.style) == null ? void 0 : _d.fontSize) || `inherit`
542
+ fontFamily: (_d = (_c = props.style) == null ? void 0 : _c.fontFamily) != null ? _d : `inherit`,
543
+ fontSize: (_f = (_e = props.style) == null ? void 0 : _e.fontSize) != null ? _f : `inherit`
892
544
  },
893
545
  children: props.value
894
546
  }
@@ -898,9 +550,6 @@ var ElasticInput = React.forwardRef(function ElasticInputFC(props, ref) {
898
550
 
899
551
  // ../anvl/src/number/clamp.ts
900
552
  var clampInto = (min, max) => (value) => value < min ? min : value > max ? max : value;
901
-
902
- // ../anvl/src/number/wrap.ts
903
- var wrapInto = (min, max) => (value) => value < min ? max - (min - value) % (max - min) : min + (value - min) % (max - min);
904
553
  function round(value, decimalPlaces) {
905
554
  if (decimalPlaces === void 0)
906
555
  return value;
@@ -919,11 +568,11 @@ var isDecimalInProgress = (input) => input === `0` || !Number.isNaN(Number(input
919
568
  var textToValue = (input, allowDecimal) => {
920
569
  if (isValidNonNumber(input))
921
570
  return VALID_NON_NUMBER_INTERPRETATIONS[input];
922
- return allowDecimal ? parseFloat(input) : Math.round(parseFloat(input));
571
+ return allowDecimal ? Number.parseFloat(input) : Math.round(Number.parseFloat(input));
923
572
  };
924
573
  var DEFAULT_NUMBER_CONSTRAINTS = {
925
- max: Infinity,
926
- min: -Infinity,
574
+ max: Number.POSITIVE_INFINITY,
575
+ min: Number.NEGATIVE_INFINITY,
927
576
  decimalPlaces: 100,
928
577
  nullable: true
929
578
  };
@@ -960,9 +609,9 @@ var NumberInput = ({
960
609
  testId,
961
610
  value = null
962
611
  }) => {
963
- const id = React.useId();
964
- const [temporaryEntry, setTemporaryEntry] = React.useState(null);
965
- const userHasMadeDeliberateChange = React.useRef(false);
612
+ const id = react.useId();
613
+ const [temporaryEntry, setTemporaryEntry] = react.useState(null);
614
+ const userHasMadeDeliberateChange = react.useRef(false);
966
615
  const refine = initRefinery({ max, min, decimalPlaces, nullable: true });
967
616
  const allowDecimal = decimalPlaces === void 0 || decimalPlaces > 0;
968
617
  const handleBlur = () => {
@@ -1101,7 +750,9 @@ var JsonEditor_INTERNAL = ({
1101
750
  ElasticInput,
1102
751
  {
1103
752
  value: name,
1104
- onChange: disabled ? doNothing : (e) => rename(e.target.value),
753
+ onChange: disabled ? doNothing : (e) => {
754
+ rename(e.target.value);
755
+ },
1105
756
  disabled
1106
757
  }
1107
758
  ) }),
@@ -1122,7 +773,9 @@ var JsonEditor_INTERNAL = ({
1122
773
  recast && dataIsJson ? /* @__PURE__ */ jsxRuntime.jsx(
1123
774
  "select",
1124
775
  {
1125
- onChange: disabled ? doNothing : (e) => recast(e.target.value),
776
+ onChange: disabled ? doNothing : (e) => {
777
+ recast(e.target.value);
778
+ },
1126
779
  value: refined.type,
1127
780
  disabled,
1128
781
  children: Object.keys(SubEditors).map((type) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: type, children: type }, type))
@@ -1132,13 +785,13 @@ var JsonEditor_INTERNAL = ({
1132
785
  };
1133
786
 
1134
787
  // ../hamr/react-json-editor/src/editors-by-type/utilities/array-elements.ts
1135
- var makeElementSetters = (data, set) => data.map(
1136
- (value, index) => (newValue) => set(() => {
788
+ var makeElementSetters = (data, set) => data.map((value, index) => (newValue) => {
789
+ set(() => {
1137
790
  const newData = [...data];
1138
791
  newData[index] = become(newValue)(value);
1139
792
  return newData;
1140
- })
1141
- );
793
+ });
794
+ });
1142
795
  var ArrayEditor = ({
1143
796
  path = [],
1144
797
  isReadonly = () => false,
@@ -1194,7 +847,7 @@ var Int = Object.assign((input) => parseInteger(input), {
1194
847
  from: (input) => pipe(
1195
848
  input,
1196
849
  String,
1197
- parseFloat,
850
+ Number.parseFloat,
1198
851
  (num) => isInteger(num) ? {
1199
852
  value: num,
1200
853
  error: null,
@@ -1435,7 +1088,9 @@ var expandPathForSchema = (path) => {
1435
1088
  );
1436
1089
  default:
1437
1090
  throw new TypeError(
1438
- `The key ${key} is not a valid JSON key; expected string or number, got ${typeof key}`
1091
+ `The key ${JSON.stringify(
1092
+ key
1093
+ )} is not a valid JSON key; expected string or number, got ${typeof key}`
1439
1094
  );
1440
1095
  }
1441
1096
  });
@@ -1458,10 +1113,11 @@ var findSubSchema = (schema) => {
1458
1113
  if (typeof schema === `boolean`) {
1459
1114
  return new TypeError(`The schema is not a JsonSchema`);
1460
1115
  }
1461
- const { node, refMap } = pathIntoSchema.reduce(
1116
+ const reduction = pathIntoSchema.reduce(
1462
1117
  ({ node: node2, refMap: refMap2 = void 0 }, key) => (console.log({ node: node2, key }), isJsonSchemaRef(node2) ? retrieveRef({ refNode: node2, root: schema, refMap: refMap2 }) : { node: node2[key], refMap: refMap2 }),
1463
1118
  { node: schema, refMap: void 0 }
1464
1119
  );
1120
+ const { node, refMap } = reduction;
1465
1121
  if (node instanceof Error)
1466
1122
  throw node;
1467
1123
  let subSchema = node;
@@ -1616,35 +1272,44 @@ var castToJson = (input) => {
1616
1272
  // ../hamr/react-json-editor/src/editors-by-type/utilities/object-properties.ts
1617
1273
  var makePropertySetters = (data, set) => mapObject(
1618
1274
  data,
1619
- (value, key) => (newValue) => set(__spreadProps(__spreadValues({}, data), { [key]: become(newValue)(value[key]) }))
1275
+ (value, key) => (newValue) => {
1276
+ set(__spreadProps(__spreadValues({}, data), { [key]: become(newValue)(value[key]) }));
1277
+ }
1620
1278
  );
1621
1279
  var makePropertyRenamers = (data, set, stableKeyMapRef) => mapObject(
1622
1280
  data,
1623
- (value, key) => (newKey) => Object.hasOwn(data, newKey) ? null : set(() => {
1624
- const entries = Object.entries(data);
1625
- const index = entries.findIndex(([k]) => k === key);
1626
- entries[index] = [newKey, value];
1627
- const stableKeyMap = stableKeyMapRef.current;
1628
- stableKeyMapRef.current = __spreadProps(__spreadValues({}, stableKeyMap), {
1629
- [newKey]: stableKeyMap[key]
1630
- });
1631
- return Object.fromEntries(entries);
1632
- })
1281
+ (value, key) => (newKey) => {
1282
+ if (!Object.hasOwn(data, newKey)) {
1283
+ set(() => {
1284
+ const entries = Object.entries(data);
1285
+ const index = entries.findIndex(([k]) => k === key);
1286
+ entries[index] = [newKey, value];
1287
+ const stableKeyMap = stableKeyMapRef.current;
1288
+ stableKeyMapRef.current = __spreadProps(__spreadValues({}, stableKeyMap), {
1289
+ [newKey]: stableKeyMap[key]
1290
+ });
1291
+ return Object.fromEntries(entries);
1292
+ });
1293
+ }
1294
+ }
1633
1295
  );
1634
- var makePropertyRemovers = (data, set) => mapObject(
1635
- data,
1636
- (_, key) => () => set(() => {
1296
+ var makePropertyRemovers = (data, set) => mapObject(data, (_, key) => () => {
1297
+ set(() => {
1637
1298
  const _a2 = data, rest = __objRest(_a2, [__restKey(key)]);
1638
1299
  return rest;
1639
- })
1640
- );
1300
+ });
1301
+ });
1641
1302
  var makePropertyRecasters = (data, set) => mapObject(
1642
1303
  data,
1643
- (value, key) => (newType) => set(() => __spreadProps(__spreadValues({}, data), {
1644
- [key]: castToJson(value).to[newType]()
1645
- }))
1304
+ (value, key) => (newType) => {
1305
+ set(() => __spreadProps(__spreadValues({}, data), {
1306
+ [key]: castToJson(value).to[newType]()
1307
+ }));
1308
+ }
1646
1309
  );
1647
- var makePropertyCreationInterface = (data, set) => (key, type) => (value) => set(__spreadProps(__spreadValues({}, data), { [key]: value != null ? value : JSON_DEFAULTS[type] }));
1310
+ var makePropertyCreationInterface = (data, set) => (key, type) => (value) => {
1311
+ set(__spreadProps(__spreadValues({}, data), { [key]: value != null ? value : JSON_DEFAULTS[type] }));
1312
+ };
1648
1313
  var makePropertySorter = (data, set, sortFn) => () => {
1649
1314
  const sortedKeys = Object.keys(data).sort(sortFn);
1650
1315
  const sortedObj = {};
@@ -1662,7 +1327,16 @@ var PropertyAdder = ({
1662
1327
  /* @__PURE__ */ jsxRuntime.jsx(ElasticInput, { disabled: true, defaultValue: propertyKey }),
1663
1328
  ` `,
1664
1329
  /* @__PURE__ */ jsxRuntime.jsx(ElasticInput, { disabled: true, defaultValue: "is missing" }),
1665
- /* @__PURE__ */ jsxRuntime.jsx(Components.Button, { onClick: () => addProperty(), disabled, children: "+" })
1330
+ /* @__PURE__ */ jsxRuntime.jsx(
1331
+ Components.Button,
1332
+ {
1333
+ onClick: () => {
1334
+ addProperty();
1335
+ },
1336
+ disabled,
1337
+ children: "+"
1338
+ }
1339
+ )
1666
1340
  ] });
1667
1341
  var ObjectEditor = ({
1668
1342
  schema,
@@ -1675,7 +1349,7 @@ var ObjectEditor = ({
1675
1349
  }) => {
1676
1350
  var _a2;
1677
1351
  const disabled = isReadonly(path);
1678
- const stableKeyMap = React.useRef(
1352
+ const stableKeyMap = react.useRef(
1679
1353
  Object.keys(data).reduce(
1680
1354
  (acc, key) => {
1681
1355
  acc[key] = key;
@@ -1702,7 +1376,16 @@ var ObjectEditor = ({
1702
1376
  );
1703
1377
  const missingKeys = schemaKeys === true ? [] : schemaKeys.filter((key) => !dataKeys.includes(key));
1704
1378
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1705
- /* @__PURE__ */ jsxRuntime.jsx(Components.Button, { onClick: () => sortProperties(), disabled, children: "Sort" }),
1379
+ /* @__PURE__ */ jsxRuntime.jsx(
1380
+ Components.Button,
1381
+ {
1382
+ onClick: () => {
1383
+ sortProperties();
1384
+ },
1385
+ disabled,
1386
+ children: "Sort"
1387
+ }
1388
+ ),
1706
1389
  /* @__PURE__ */ jsxRuntime.jsxs(Components.ObjectWrapper, { children: [
1707
1390
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "json_editor_properties", children: [...missingKeys, ...officialKeys, ...unofficialKeys].map((key) => {
1708
1391
  const originalKey = stableKeyMap.current[key];
@@ -1741,7 +1424,9 @@ var ObjectEditor = ({
1741
1424
  /* @__PURE__ */ jsxRuntime.jsx(
1742
1425
  Components.Button,
1743
1426
  {
1744
- onClick: disabled ? doNothing : () => makePropertyAdder(`new_property`, `string`)(),
1427
+ onClick: disabled ? doNothing : () => {
1428
+ makePropertyAdder(`new_property`, `string`)();
1429
+ },
1745
1430
  disabled,
1746
1431
  children: "+"
1747
1432
  }
@@ -1758,7 +1443,9 @@ var BooleanEditor = ({
1758
1443
  {
1759
1444
  type: "checkbox",
1760
1445
  checked: data,
1761
- onChange: (event) => set(event.target.checked)
1446
+ onChange: (event) => {
1447
+ set(event.target.checked);
1448
+ }
1762
1449
  }
1763
1450
  ) });
1764
1451
  var NullEditor = ({
@@ -1774,7 +1461,9 @@ var NumberEditor = ({
1774
1461
  NumberInput,
1775
1462
  {
1776
1463
  value: data,
1777
- set: isReadonly(path) ? void 0 : (newValue) => set(Number(newValue)),
1464
+ set: isReadonly(path) ? void 0 : (newValue) => {
1465
+ set(Number(newValue));
1466
+ },
1778
1467
  autoSize: true
1779
1468
  }
1780
1469
  ) });
@@ -1841,7 +1530,7 @@ var DefaultFallback = ({ error, errorInfo }) => {
1841
1530
  }
1842
1531
  );
1843
1532
  };
1844
- var ErrorBoundary = class extends React.Component {
1533
+ var ErrorBoundary = class extends react.Component {
1845
1534
  constructor(props) {
1846
1535
  super(props);
1847
1536
  this.state = {};
@@ -1948,419 +1637,19 @@ var SubEditors = {
1948
1637
  object: ObjectEditor,
1949
1638
  string: StringEditor
1950
1639
  };
1951
-
1952
- // ../anvl/src/string/string-to-color.ts
1953
- function stringToColor(input) {
1954
- let hash = 0;
1955
- for (let i = 0; i < input.length; i++) {
1956
- const char = input.charCodeAt(i);
1957
- hash = (hash << 5) - hash + char;
1958
- hash |= 0;
1959
- }
1960
- let hexColor = (hash & 16777215).toString(16);
1961
- while (hexColor.length < 6) {
1962
- hexColor = `0` + hexColor;
1963
- }
1964
- return `#${hexColor}`;
1965
- }
1966
-
1967
- // ../luum/src/constants/index.ts
1968
- var CHANNEL_SPECIFIC_LUM = {
1969
- R: 0.3,
1970
- G: 0.5,
1971
- B: 0.2
1972
- };
1973
-
1974
- // ../luum/src/constants/filters.ts
1975
- var unfiltered = [
1976
- { sat: 255, hue: 0 },
1977
- { sat: 255, hue: 360 }
1978
- ];
1979
-
1980
- // ../luum/src/export/channelsToHex.ts
1981
- var channelsToHex = (channels) => `#${Object.values(channels).map((channel) => {
1982
- let channelHex = channel.toString(16);
1983
- if (channelHex.length === 1)
1984
- channelHex = 0 + channelHex;
1985
- return channelHex;
1986
- }).join(``)}`;
1987
- var channelsToHex_default = channelsToHex;
1988
-
1989
- // ../luum/src/import/hueToRelativeChannels.ts
1990
- var hueToRelativeChannels_default = (hue) => {
1991
- const hueWrapped = wrapInto(0, 360)(hue);
1992
- const hueReduced = hueWrapped / 60;
1993
- const hueInteger = Math.floor(hueReduced);
1994
- const hueDecimal = hueReduced - hueInteger;
1995
- const x = hueDecimal;
1996
- const y = 1 - hueDecimal;
1997
- switch (hueInteger) {
1998
- case 0:
1999
- return [1, x, 0];
2000
- case 1:
2001
- return [y, 1, 0];
2002
- case 2:
2003
- return [0, 1, x];
2004
- case 3:
2005
- return [0, y, 1];
2006
- case 4:
2007
- return [x, 0, 1];
2008
- case 5:
2009
- return [1, 0, y];
2010
- default:
2011
- throw new Error(`invalid hue served: ${hue}`);
2012
- }
2013
- };
2014
-
2015
- // ../luum/src/solveFor/hueFromChannels.ts
2016
- var hueFromChannels = ({ R, G, B }) => {
2017
- let hue = 0;
2018
- if (R > G && G >= B)
2019
- hue = 60 * (0 + (G - B) / (R - B));
2020
- if (G >= R && R > B)
2021
- hue = 60 * (2 - (R - B) / (G - B));
2022
- if (G > B && B >= R)
2023
- hue = 60 * (2 + (B - R) / (G - R));
2024
- if (B >= G && G > R)
2025
- hue = 60 * (4 - (G - R) / (B - R));
2026
- if (B > R && R >= G)
2027
- hue = 60 * (4 + (R - G) / (B - G));
2028
- if (R >= B && B > G)
2029
- hue = 60 * (6 - (B - G) / (R - G));
2030
- return hue;
2031
- };
2032
- var hueFromChannels_default = hueFromChannels;
2033
-
2034
- // ../luum/src/solveFor/lumFromChannels.ts
2035
- var lumFromChannels = ({ R, G, B }) => {
2036
- const lum = CHANNEL_SPECIFIC_LUM.R * R / 255 + CHANNEL_SPECIFIC_LUM.G * G / 255 + CHANNEL_SPECIFIC_LUM.B * B / 255;
2037
- return lum;
2038
- };
2039
- var lumFromChannels_default = lumFromChannels;
2040
-
2041
- // ../luum/src/solveFor/maxSatForHueInFilter.ts
2042
- var maxSatForHueInFilter_default = (hue, filter) => {
2043
- let maxSat = 255;
2044
- const hueWrapped = wrapInto(0, 360)(hue);
2045
- for (let a2 = -1, b2 = 0; b2 < filter.length; a2++, b2++) {
2046
- a2 = wrapInto(0, filter.length)(a2);
2047
- const hueDoubleWrapped = a2 > b2 ? wrapInto(-180, 180)(hueWrapped) : void 0;
2048
- const tuningPointA = filter[a2];
2049
- const tuningPointB = filter[b2];
2050
- const hueA = a2 > b2 ? wrapInto(-180, 180)(tuningPointA.hue) : tuningPointA.hue;
2051
- const hueB = tuningPointB.hue;
2052
- if ((hueDoubleWrapped || hueWrapped) >= hueA && (hueDoubleWrapped || hueWrapped) < hueB) {
2053
- let $ = hueDoubleWrapped || hueWrapped;
2054
- $ -= hueA;
2055
- $ /= hueB - hueA;
2056
- $ *= tuningPointB.sat - tuningPointA.sat;
2057
- $ += tuningPointA.sat;
2058
- maxSat = $;
2059
- }
2060
- }
2061
- return maxSat;
2062
- };
2063
-
2064
- // ../luum/src/solveFor/satFromChannels.ts
2065
- var satFromChannels = ({ R, G, B }) => {
2066
- const sat = Math.max(R, G, B) - Math.min(R, G, B);
2067
- return sat;
2068
- };
2069
- var satFromChannels_default = satFromChannels;
2070
-
2071
- // ../luum/src/solveFor/specificLumFromHue.ts
2072
- var specificLumFromHue_default = (hue) => {
2073
- const [factorR, factorG, factorB] = hueToRelativeChannels_default(hue);
2074
- const lumR = CHANNEL_SPECIFIC_LUM.R * factorR;
2075
- const lumG = CHANNEL_SPECIFIC_LUM.G * factorG;
2076
- const lumB = CHANNEL_SPECIFIC_LUM.B * factorB;
2077
- const specificLum = lumR + lumG + lumB;
2078
- return specificLum;
2079
- };
2080
-
2081
- // ../luum/src/export/specToChannelsFixLimit.ts
2082
- var minChannelsForSaturationFromHue = (hue) => {
2083
- const relativeChannels = hueToRelativeChannels_default(hue);
2084
- const channelSpreader = (trueSaturation) => {
2085
- const makeMinChannel = (idx) => Math.round(relativeChannels[idx] * trueSaturation);
2086
- return {
2087
- R: makeMinChannel(0),
2088
- G: makeMinChannel(1),
2089
- B: makeMinChannel(2)
2090
- };
2091
- };
2092
- return channelSpreader;
2093
- };
2094
- var channelsFromIlluminationObj = ({
2095
- minChannels,
2096
- trueLuminosity,
2097
- minLum
2098
- }) => {
2099
- const { max, round: round2 } = Math;
2100
- const maxWhite = 255 - max(...Object.values(minChannels));
2101
- const white = clampInto(0, maxWhite)(round2((trueLuminosity - minLum) * 255));
2102
- const channels = {
2103
- R: minChannels.R + white,
2104
- G: minChannels.G + white,
2105
- B: minChannels.B + white
2106
- };
2107
- return channels;
2108
- };
2109
- var specToChannelsFixLimit = ({ hue, sat, lum, prefer = `lum` }, filter = unfiltered) => {
2110
- const minChannelsForSaturation = minChannelsForSaturationFromHue(hue);
2111
- let trueSaturation;
2112
- let trueLuminosity;
2113
- let minChannels;
2114
- let maxChannels;
2115
- let specificLum;
2116
- let minLum = 0;
2117
- let maxLum = 1;
2118
- let maxSat = maxSatForHueInFilter_default(hue, filter);
2119
- switch (prefer) {
2120
- case `sat`:
2121
- trueSaturation = clampInto(0, 255)(Math.min(sat, maxSat));
2122
- minChannels = minChannelsForSaturation(trueSaturation);
2123
- maxChannels = {
2124
- R: minChannels.R + 255 - trueSaturation,
2125
- G: minChannels.G + 255 - trueSaturation,
2126
- B: minChannels.B + 255 - trueSaturation
2127
- };
2128
- minLum = lumFromChannels_default(minChannels);
2129
- maxLum = lumFromChannels_default(maxChannels);
2130
- trueLuminosity = clampInto(minLum, maxLum)(lum);
2131
- break;
2132
- case `lum`:
2133
- trueLuminosity = clampInto(0, 1)(lum);
2134
- specificLum = specificLumFromHue_default(hue);
2135
- maxSat = Math.min(
2136
- maxSat,
2137
- Math.round(
2138
- trueLuminosity <= specificLum ? 255 * (trueLuminosity / specificLum) : 255 * (1 - trueLuminosity) / (1 - specificLum)
2139
- )
2140
- );
2141
- trueSaturation = Math.min(sat, maxSat);
2142
- minChannels = minChannelsForSaturation(trueSaturation);
2143
- minLum = lumFromChannels_default(minChannels);
2144
- break;
2145
- }
2146
- const channels = channelsFromIlluminationObj({
2147
- minChannels,
2148
- trueLuminosity,
2149
- minLum
2150
- });
2151
- return {
2152
- channels,
2153
- fix: {
2154
- sat: trueSaturation,
2155
- lum: trueLuminosity
2156
- },
2157
- limit: {
2158
- sat: [0, maxSat],
2159
- lum: [prefer === `lum` ? 0 : minLum, maxLum]
2160
- }
2161
- };
2162
- };
2163
- var specToChannelsFixLimit_default = specToChannelsFixLimit;
2164
-
2165
- // ../luum/src/export/specToHexFixLimit.ts
2166
- var specToHexFixLimit = ({ hue, sat, lum, prefer }, filter) => {
2167
- const { channels, fix, limit } = specToChannelsFixLimit_default(
2168
- {
2169
- hue,
2170
- sat,
2171
- lum,
2172
- prefer
2173
- },
2174
- filter
2175
- );
2176
- const { R, G, B } = channels;
2177
- const hex = channelsToHex_default({ R, G, B });
2178
- return { hex, fix, limit };
2179
- };
2180
- var specToHexFixLimit_default = specToHexFixLimit;
2181
-
2182
- // ../luum/src/export/specToHex.ts
2183
- var specToHex = ({ hue, sat, lum, prefer }, filter) => {
2184
- const { hex } = specToHexFixLimit_default({ hue, sat, lum, prefer }, filter);
2185
- return hex;
2186
- };
2187
- var specToHex_default = specToHex;
2188
-
2189
- // ../luum/src/import/channelsToSpec.ts
2190
- var channelsToSpec = ({ R, G, B }) => {
2191
- const hue = hueFromChannels_default({ R, G, B });
2192
- const sat = satFromChannels_default({ R, G, B });
2193
- const lum = lumFromChannels_default({ R, G, B });
2194
- return { hue, sat, lum };
2195
- };
2196
- var channelsToSpec_default = channelsToSpec;
2197
-
2198
- // ../luum/src/import/normalizeHex.ts
2199
- var BASE_16_CHAR_SET = `[a-fA-F0-9]+`;
2200
- var miniHexToHex = (miniHex) => {
2201
- const miniHexArray = miniHex.split(``);
2202
- const hexTemplate = [0, 0, 1, 1, 2, 2];
2203
- return hexTemplate.map((idx) => miniHexArray[idx]).join(``);
2204
- };
2205
- var normalizeHex = (maybeHex) => {
2206
- const hex = maybeHex.replace(/^#/, ``);
2207
- const hexIsCorrectLength = hex.length === 6 || hex.length === 3;
2208
- const hexIsCorrectCharSet = hex.match(new RegExp(`^${BASE_16_CHAR_SET}$`)) !== null;
2209
- const hexIsValid = hexIsCorrectLength && hexIsCorrectCharSet;
2210
- if (!hexIsValid) {
2211
- throw new Error(`${maybeHex} is not a valid hex code`);
2212
- }
2213
- if (hex.length === 3) {
2214
- return miniHexToHex(hex);
2215
- }
2216
- return hex;
2217
- };
2218
- var normalizeHex_default = normalizeHex;
2219
-
2220
- // ../luum/src/import/hexToChannels.ts
2221
- var hexToChannels_default = (maybeHex) => {
2222
- const hex = normalizeHex_default(maybeHex);
2223
- return {
2224
- R: parseInt(hex.slice(0, 2), 16),
2225
- G: parseInt(hex.slice(2, 4), 16),
2226
- B: parseInt(hex.slice(4, 6), 16)
2227
- };
2228
- };
2229
-
2230
- // ../luum/src/import/hexToSpec.ts
2231
- var hexToSpec = (hex) => {
2232
- const { R, G, B } = hexToChannels_default(hex);
2233
- const { hue, sat, lum } = channelsToSpec_default({ R, G, B });
2234
- return { hue, sat, lum };
2235
- };
2236
- var hexToSpec_default = hexToSpec;
2237
-
2238
- // ../luum/src/mixers/contrast.ts
2239
- var contrastMax = (color) => __spreadProps(__spreadValues({}, color), {
2240
- lum: color.lum > 0.666 ? 0 : 1
2241
- });
2242
- var offset = (offsetAmount) => (color) => __spreadProps(__spreadValues({}, color), {
2243
- lum: color.lum > 0.666 ? color.lum - offsetAmount : color.lum + offsetAmount
2244
- });
2245
-
2246
- // ../luum/src/constants/luum-spec.ts
2247
- var defaultSpec = {
2248
- hue: 0,
2249
- lum: 0,
2250
- sat: 0,
2251
- prefer: `lum`
2252
- };
2253
-
2254
- // ../luum/src/scheme/index.ts
2255
- var isLuumSpec = (input) => typeof input === `object` && input !== null && typeof input.hue === `number` && typeof input.sat === `number` && typeof input.lum === `number` && [`sat`, `lum`].includes(input.prefer);
2256
- isModifier(isLuumSpec)(defaultSpec);
2257
- var WAYFORGE_CORE_COLOR_NAMES = [
2258
- `Red`,
2259
- `Orange`,
2260
- `Yellow`,
2261
- `Lime`,
2262
- `Green`,
2263
- `Teal`,
2264
- `Cyan`,
2265
- `Blue`,
2266
- `Indigo`,
2267
- `Violet`,
2268
- `Magenta`,
2269
- `Pink`
2270
- ];
2271
- WAYFORGE_CORE_COLOR_NAMES.reduce(
2272
- (acc, name, idx) => {
2273
- acc[name] = {
2274
- hue: idx * 30,
2275
- sat: 255,
2276
- lum: 0.5,
2277
- prefer: `sat`
2278
- };
2279
- return acc;
2280
- },
2281
- {}
2282
- );
2283
- var Id = ({ id }) => {
2284
- const [isOpen, setIsOpen] = React__namespace.useState(false);
2285
- const { refs, floatingStyles, context } = react$1.useFloating({
2286
- open: isOpen,
2287
- onOpenChange: setIsOpen,
2288
- placement: `bottom-start`
2289
- });
2290
- const click = react$1.useClick(context);
2291
- const { getReferenceProps, getFloatingProps } = react$1.useInteractions([click]);
2292
- const bgColor = stringToColor(id);
2293
- const contrastColor = pipe(bgColor, hexToSpec_default, contrastMax, specToHex_default);
2294
- const offsetColor = pipe(bgColor, hexToSpec_default, offset(0.25), specToHex_default);
2295
- const contrastOffsetColor = pipe(
2296
- offsetColor,
2297
- hexToSpec_default,
2298
- contrastMax,
2299
- specToHex_default
2300
- );
2301
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2302
- /* @__PURE__ */ jsxRuntime.jsx(
2303
- "span",
2304
- __spreadProps(__spreadValues({
2305
- ref: refs.setReference
2306
- }, getReferenceProps()), {
2307
- style: {
2308
- background: bgColor,
2309
- cursor: `pointer`,
2310
- padding: `0px 4px`,
2311
- color: contrastColor,
2312
- userSelect: `none`,
2313
- whiteSpace: `nowrap`
2314
- },
2315
- children: id.substring(0, 3)
2316
- })
2317
- ),
2318
- isOpen && /* @__PURE__ */ jsxRuntime.jsx(react$1.FloatingPortal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2319
- "span",
2320
- __spreadProps(__spreadValues({
2321
- ref: refs.setFloating
2322
- }, getFloatingProps()), {
2323
- style: __spreadProps(__spreadValues({}, floatingStyles), {
2324
- color: contrastOffsetColor,
2325
- background: offsetColor,
2326
- padding: `0px 4px`,
2327
- boxShadow: `0px 2px 10px rgba(0, 0, 0, 0.1)`
2328
- }),
2329
- children: id
2330
- })
2331
- ) })
2332
- ] });
2333
- };
2334
- var RelationEditor = (props) => {
2335
- const seen = /* @__PURE__ */ new Set();
2336
- const data = Object.entries(props.data.relations).sort(([_, a2], [__, b2]) => b2.length - a2.length).filter(([head, tail]) => {
2337
- if (seen.has(head))
2338
- return false;
2339
- seen.add(head);
2340
- for (const tailElement of tail) {
2341
- seen.add(tailElement);
2342
- }
2343
- return true;
2344
- });
2345
- return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "relation-editor-0123456789", children: data.map(([head, tail]) => /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2346
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: /* @__PURE__ */ jsxRuntime.jsx(Id, { id: head }) }),
2347
- ":",
2348
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: tail.map((child) => /* @__PURE__ */ jsxRuntime.jsx(Id, { id: child })) })
2349
- ] })) });
2350
- };
2351
1640
  var StateEditor = ({ token }) => {
2352
- const set = react.useI(token);
2353
- const data = react.useO(token);
2354
- return isJson(data) ? /* @__PURE__ */ jsxRuntime.jsx(JsonEditor, { data, set, schema: true }) : data instanceof Join ? /* @__PURE__ */ jsxRuntime.jsx(RelationEditor, { data, set }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "json_editor", children: /* @__PURE__ */ jsxRuntime.jsx(
1641
+ const set = react$1.useI(token);
1642
+ const data = react$1.useO(token);
1643
+ return isJson(data) ? /* @__PURE__ */ jsxRuntime.jsx(JsonEditor, { data, set, schema: true }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "json_editor", children: /* @__PURE__ */ jsxRuntime.jsx(
2355
1644
  ElasticInput,
2356
1645
  {
2357
- value: data instanceof Set ? `Set { ${JSON.stringify([...data]).slice(1, -1)} }` : data instanceof Map ? `Map ` + JSON.stringify([...data]) : Object.getPrototypeOf(data).constructor.name + ` ` + fallback(() => JSON.stringify(data), `?`),
1646
+ 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), `?`),
2358
1647
  disabled: true
2359
1648
  }
2360
1649
  ) });
2361
1650
  };
2362
1651
  var ReadonlySelectorViewer = ({ token }) => {
2363
- const data = react.useO(token);
1652
+ const data = react$1.useO(token);
2364
1653
  return isJson(data) ? /* @__PURE__ */ jsxRuntime.jsx(
2365
1654
  JsonEditor,
2366
1655
  {
@@ -2372,7 +1661,7 @@ var ReadonlySelectorViewer = ({ token }) => {
2372
1661
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "json_editor", children: /* @__PURE__ */ jsxRuntime.jsx(
2373
1662
  ElasticInput,
2374
1663
  {
2375
- value: data instanceof Set ? `Set ` + JSON.stringify([...data]) : data instanceof Map ? `Map ` + JSON.stringify([...data]) : Object.getPrototypeOf(data).constructor.name + ` ` + JSON.stringify(data),
1664
+ value: data instanceof Set ? `Set ` + JSON.stringify([...data]) : Object.getPrototypeOf(data).constructor.name + ` ` + JSON.stringify(data),
2376
1665
  disabled: true
2377
1666
  }
2378
1667
  ) });
@@ -2401,10 +1690,10 @@ var findStateTypeState = atom_io.selectorFamily({
2401
1690
  });
2402
1691
  var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
2403
1692
  var _a2, _b;
2404
- const setIsOpen = react.useI(isOpenState);
2405
- const isOpen = react.useO(isOpenState);
2406
- const state = react.useO(node);
2407
- const stateType = react.useO(typeState);
1693
+ const setIsOpen = react$1.useI(isOpenState);
1694
+ const isOpen = react$1.useO(isOpenState);
1695
+ const state = react$1.useO(node);
1696
+ const stateType = react$1.useO(typeState);
2408
1697
  const isPrimitive = Boolean(primitiveRefinery.refine(state));
2409
1698
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2410
1699
  /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
@@ -2412,6 +1701,7 @@ var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
2412
1701
  button.OpenClose,
2413
1702
  {
2414
1703
  isOpen: isOpen && !isPrimitive,
1704
+ testid: `open-close-state-${node.key}`,
2415
1705
  setIsOpen,
2416
1706
  disabled: isPrimitive
2417
1707
  }
@@ -2419,8 +1709,12 @@ var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
2419
1709
  /* @__PURE__ */ jsxRuntime.jsxs(
2420
1710
  "label",
2421
1711
  {
2422
- onClick: () => console.log(node, atom_io.getState(node)),
2423
- onKeyUp: () => console.log(node, atom_io.getState(node)),
1712
+ onClick: () => {
1713
+ console.log(node, atom_io.getState(node));
1714
+ },
1715
+ onKeyUp: () => {
1716
+ console.log(node, atom_io.getState(node));
1717
+ },
2424
1718
  children: [
2425
1719
  /* @__PURE__ */ jsxRuntime.jsx("h2", { children: (_b = (_a2 = node.family) == null ? void 0 : _a2.subKey) != null ? _b : node.key }),
2426
1720
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "type detail", children: [
@@ -2431,21 +1725,28 @@ var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
2431
1725
  ]
2432
1726
  }
2433
1727
  ),
2434
- isPrimitive ? /* @__PURE__ */ jsxRuntime.jsx(StoreEditor, { token: node }) : null
1728
+ /* @__PURE__ */ jsxRuntime.jsx(StoreEditor, { token: node })
2435
1729
  ] }),
2436
1730
  isOpen && !isPrimitive ? /* @__PURE__ */ jsxRuntime.jsx("main", { children: /* @__PURE__ */ jsxRuntime.jsx(StoreEditor, { token: node }) }) : null
2437
1731
  ] });
2438
1732
  };
2439
1733
  var StateIndexTreeNode = ({ node, isOpenState }) => {
2440
- const setIsOpen = react.useI(isOpenState);
2441
- const isOpen = react.useO(isOpenState);
1734
+ const setIsOpen = react$1.useI(isOpenState);
1735
+ const isOpen = react$1.useO(isOpenState);
2442
1736
  for (const [key, childNode] of recordToEntries(node.familyMembers)) {
2443
- findViewIsOpenState(key);
2444
- findStateTypeState(childNode);
1737
+ atom_io.findState(findViewIsOpenState, key);
1738
+ atom_io.findState(findStateTypeState, childNode);
2445
1739
  }
2446
1740
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2447
1741
  /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
2448
- /* @__PURE__ */ jsxRuntime.jsx(button.OpenClose, { isOpen, setIsOpen }),
1742
+ /* @__PURE__ */ jsxRuntime.jsx(
1743
+ button.OpenClose,
1744
+ {
1745
+ isOpen,
1746
+ testid: `open-close-state-family-${node.key}`,
1747
+ setIsOpen
1748
+ }
1749
+ ),
2449
1750
  /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
2450
1751
  /* @__PURE__ */ jsxRuntime.jsx("h2", { children: node.key }),
2451
1752
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "type detail", children: " (family)" })
@@ -2455,18 +1756,15 @@ var StateIndexTreeNode = ({ node, isOpenState }) => {
2455
1756
  StateIndexNode,
2456
1757
  {
2457
1758
  node: childNode,
2458
- isOpenState: findViewIsOpenState(childNode.key),
2459
- typeState: findStateTypeState(childNode)
1759
+ isOpenState: atom_io.findState(findViewIsOpenState, childNode.key),
1760
+ typeState: atom_io.findState(findStateTypeState, childNode)
2460
1761
  },
2461
1762
  key
2462
1763
  )) : null
2463
1764
  ] });
2464
1765
  };
2465
1766
  var StateIndexNode = ({ node, isOpenState, typeState }) => {
2466
- if (node.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)) {
2467
- return null;
2468
- }
2469
- return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "node state", children: `type` in node ? /* @__PURE__ */ jsxRuntime.jsx(
1767
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "node state", "data-testid": `state-${node.key}`, children: `type` in node ? /* @__PURE__ */ jsxRuntime.jsx(
2470
1768
  StateIndexLeafNode,
2471
1769
  {
2472
1770
  node,
@@ -2476,14 +1774,14 @@ var StateIndexNode = ({ node, isOpenState, typeState }) => {
2476
1774
  ) : /* @__PURE__ */ jsxRuntime.jsx(StateIndexTreeNode, { node, isOpenState }) });
2477
1775
  };
2478
1776
  var StateIndex = ({ tokenIndex }) => {
2479
- const tokenIds = react.useO(tokenIndex);
2480
- return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index state_index", children: Object.entries(tokenIds).filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
1777
+ const tokenIds = react$1.useO(tokenIndex);
1778
+ return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index state_index", "data-testid": "state-index", children: Object.entries(tokenIds).filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
2481
1779
  return /* @__PURE__ */ jsxRuntime.jsx(
2482
1780
  StateIndexNode,
2483
1781
  {
2484
1782
  node,
2485
- isOpenState: findViewIsOpenState(node.key),
2486
- typeState: findStateTypeState(node)
1783
+ isOpenState: atom_io.findState(findViewIsOpenState, node.key),
1784
+ typeState: atom_io.findState(findStateTypeState, node)
2487
1785
  },
2488
1786
  key
2489
1787
  );
@@ -2494,8 +1792,12 @@ var AtomUpdateFC = ({ atomUpdate }) => {
2494
1792
  "article",
2495
1793
  {
2496
1794
  className: "node atom_update",
2497
- onClick: () => console.log(atomUpdate),
2498
- onKeyUp: () => console.log(atomUpdate),
1795
+ onClick: () => {
1796
+ console.log(atomUpdate);
1797
+ },
1798
+ onKeyUp: () => {
1799
+ console.log(atomUpdate);
1800
+ },
2499
1801
  children: [
2500
1802
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail", children: [
2501
1803
  atomUpdate.key,
@@ -2508,104 +1810,122 @@ var AtomUpdateFC = ({ atomUpdate }) => {
2508
1810
  );
2509
1811
  };
2510
1812
  var TransactionUpdateFC = ({ serialNumber, transactionUpdate }) => {
2511
- return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "node transaction_update", children: [
2512
- /* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsx("h4", { children: serialNumber }) }),
2513
- /* @__PURE__ */ jsxRuntime.jsxs("main", { children: [
2514
- /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "transaction_params", children: [
2515
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "params: " }),
2516
- transactionUpdate.params.map((param, index) => {
2517
- return /* @__PURE__ */ jsxRuntime.jsxs(
2518
- "article",
2519
- {
2520
- className: "node transaction_param",
2521
- onClick: () => console.log(transactionUpdate),
2522
- onKeyUp: () => console.log(transactionUpdate),
2523
- children: [
2524
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail", children: [
2525
- discoverType(param),
2526
- ": "
2527
- ] }),
2528
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "summary", children: typeof param === `object` && param !== null && `type` in param && `target` in param ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: JSON.stringify(param.type) }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: JSON.stringify(param) }) })
2529
- ]
2530
- },
2531
- `param` + index
2532
- );
2533
- })
2534
- ] }),
2535
- /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "node transaction_output", children: [
2536
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "output: " }),
2537
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: discoverType(transactionUpdate.output) }),
2538
- transactionUpdate.output ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "summary", children: [
1813
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1814
+ "article",
1815
+ {
1816
+ className: "node transaction_update",
1817
+ "data-testid": `transaction-update-${transactionUpdate.key}-${serialNumber}`,
1818
+ children: [
1819
+ /* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsx("h4", { children: serialNumber }) }),
1820
+ /* @__PURE__ */ jsxRuntime.jsxs("main", { children: [
1821
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "transaction_params", children: [
1822
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "params: " }),
1823
+ transactionUpdate.params.map((param, index) => {
1824
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1825
+ "article",
1826
+ {
1827
+ className: "node transaction_param",
1828
+ onClick: () => {
1829
+ console.log(transactionUpdate);
1830
+ },
1831
+ onKeyUp: () => {
1832
+ console.log(transactionUpdate);
1833
+ },
1834
+ children: [
1835
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail", children: [
1836
+ discoverType(param),
1837
+ ": "
1838
+ ] }),
1839
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "summary", children: typeof param === `object` && param !== null && `type` in param && `target` in param ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: JSON.stringify(param.type) }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: JSON.stringify(param) }) })
1840
+ ]
1841
+ },
1842
+ `param` + index
1843
+ );
1844
+ })
1845
+ ] }),
1846
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "node transaction_output", children: [
1847
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "output: " }),
1848
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: discoverType(transactionUpdate.output) }),
1849
+ transactionUpdate.output ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "summary", children: [
1850
+ ": ",
1851
+ JSON.stringify(transactionUpdate.output)
1852
+ ] }) : null
1853
+ ] }),
1854
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "transaction_impact", children: [
1855
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "impact: " }),
1856
+ transactionUpdate.updates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((update, index) => {
1857
+ return `newValue` in update ? /* @__PURE__ */ jsxRuntime.jsx(
1858
+ article.AtomUpdate,
1859
+ {
1860
+ serialNumber: index,
1861
+ atomUpdate: update
1862
+ },
1863
+ `${transactionUpdate.key}:${index}:${update.key}`
1864
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1865
+ TransactionUpdateFC,
1866
+ {
1867
+ serialNumber: index,
1868
+ transactionUpdate: update
1869
+ },
1870
+ `${transactionUpdate.key}:${index}:${update.key}`
1871
+ );
1872
+ })
1873
+ ] })
1874
+ ] })
1875
+ ]
1876
+ }
1877
+ );
1878
+ };
1879
+ var TimelineUpdateFC = ({ timelineUpdate, serialNumber }) => {
1880
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1881
+ "article",
1882
+ {
1883
+ className: "node timeline_update",
1884
+ "data-testid": `timeline-update-${timelineUpdate.key}-${serialNumber}`,
1885
+ children: [
1886
+ /* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsxs("h4", { children: [
1887
+ timelineUpdate.timestamp,
2539
1888
  ": ",
2540
- JSON.stringify(transactionUpdate.output)
2541
- ] }) : null
2542
- ] }),
2543
- /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "transaction_impact", children: [
2544
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "detail", children: "impact: " }),
2545
- transactionUpdate.updates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((update, index) => {
1889
+ timelineUpdate.type,
1890
+ " (",
1891
+ timelineUpdate.key,
1892
+ ")"
1893
+ ] }) }),
1894
+ /* @__PURE__ */ jsxRuntime.jsx("main", { children: timelineUpdate.type === `transaction_update` ? timelineUpdate.updates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((update, index) => {
2546
1895
  return `newValue` in update ? /* @__PURE__ */ jsxRuntime.jsx(
2547
1896
  article.AtomUpdate,
2548
1897
  {
2549
1898
  serialNumber: index,
2550
1899
  atomUpdate: update
2551
1900
  },
2552
- `${transactionUpdate.key}:${index}:${update.key}`
1901
+ `${timelineUpdate.key}:${index}:${update.key}`
2553
1902
  ) : /* @__PURE__ */ jsxRuntime.jsx(
2554
1903
  TransactionUpdateFC,
2555
1904
  {
2556
1905
  serialNumber: index,
2557
1906
  transactionUpdate: update
2558
1907
  },
2559
- `${transactionUpdate.key}:${index}:${update.key}`
1908
+ `${timelineUpdate.key}:${index}:${update.key}`
2560
1909
  );
2561
- })
2562
- ] })
2563
- ] })
2564
- ] });
2565
- };
2566
- var TimelineUpdateFC = ({ timelineUpdate }) => {
2567
- return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "node timeline_update", children: [
2568
- /* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsxs("h4", { children: [
2569
- timelineUpdate.timestamp,
2570
- ": ",
2571
- timelineUpdate.type,
2572
- " (",
2573
- timelineUpdate.key,
2574
- ")"
2575
- ] }) }),
2576
- /* @__PURE__ */ jsxRuntime.jsx("main", { children: timelineUpdate.type === `transaction_update` ? timelineUpdate.updates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((update, index) => {
2577
- return `newValue` in update ? /* @__PURE__ */ jsxRuntime.jsx(
2578
- article.AtomUpdate,
2579
- {
2580
- serialNumber: index,
2581
- atomUpdate: update
2582
- },
2583
- `${timelineUpdate.key}:${index}:${update.key}`
2584
- ) : /* @__PURE__ */ jsxRuntime.jsx(
2585
- TransactionUpdateFC,
2586
- {
2587
- serialNumber: index,
2588
- transactionUpdate: update
2589
- },
2590
- `${timelineUpdate.key}:${index}:${update.key}`
2591
- );
2592
- }) : timelineUpdate.type === `selector_update` ? timelineUpdate.atomUpdates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((atomUpdate, index) => {
2593
- return /* @__PURE__ */ jsxRuntime.jsx(
2594
- article.AtomUpdate,
2595
- {
2596
- serialNumber: index,
2597
- atomUpdate
2598
- },
2599
- `${timelineUpdate.key}:${index}:${atomUpdate.key}`
2600
- );
2601
- }) : timelineUpdate.type === `atom_update` ? /* @__PURE__ */ jsxRuntime.jsx(
2602
- article.AtomUpdate,
2603
- {
2604
- serialNumber: timelineUpdate.timestamp,
2605
- atomUpdate: timelineUpdate
2606
- }
2607
- ) : null })
2608
- ] });
1910
+ }) : timelineUpdate.type === `selector_update` ? timelineUpdate.atomUpdates.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((atomUpdate, index) => {
1911
+ return /* @__PURE__ */ jsxRuntime.jsx(
1912
+ article.AtomUpdate,
1913
+ {
1914
+ serialNumber: index,
1915
+ atomUpdate
1916
+ },
1917
+ `${timelineUpdate.key}:${index}:${atomUpdate.key}`
1918
+ );
1919
+ }) : timelineUpdate.type === `atom_update` ? /* @__PURE__ */ jsxRuntime.jsx(
1920
+ article.AtomUpdate,
1921
+ {
1922
+ serialNumber: timelineUpdate.timestamp,
1923
+ atomUpdate: timelineUpdate
1924
+ }
1925
+ ) : null })
1926
+ ]
1927
+ }
1928
+ );
2609
1929
  };
2610
1930
  var article = {
2611
1931
  AtomUpdate: AtomUpdateFC,
@@ -2616,12 +1936,19 @@ var YouAreHere = () => {
2616
1936
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "you_are_here", children: "you are here" });
2617
1937
  };
2618
1938
  var TimelineLog = ({ token, isOpenState, timelineState }) => {
2619
- const timeline = react.useO(timelineState);
2620
- const isOpen = react.useO(isOpenState);
2621
- const setIsOpen = react.useI(isOpenState);
2622
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "node timeline_log", children: [
1939
+ const timeline = react$1.useO(timelineState);
1940
+ const isOpen = react$1.useO(isOpenState);
1941
+ const setIsOpen = react$1.useI(isOpenState);
1942
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "node timeline_log", "data-testid": `timeline-${token.key}`, children: [
2623
1943
  /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
2624
- /* @__PURE__ */ jsxRuntime.jsx(button.OpenClose, { isOpen, setIsOpen }),
1944
+ /* @__PURE__ */ jsxRuntime.jsx(
1945
+ button.OpenClose,
1946
+ {
1947
+ isOpen,
1948
+ testid: `open-close-timeline-${token.key}`,
1949
+ setIsOpen
1950
+ }
1951
+ ),
2625
1952
  /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
2626
1953
  /* @__PURE__ */ jsxRuntime.jsx("h2", { children: token.key }),
2627
1954
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail length", children: [
@@ -2637,7 +1964,9 @@ var TimelineLog = ({ token, isOpenState, timelineState }) => {
2637
1964
  "button",
2638
1965
  {
2639
1966
  type: "button",
2640
- onClick: () => atom_io.undo(token),
1967
+ onClick: () => {
1968
+ atom_io.undo(token);
1969
+ },
2641
1970
  disabled: timeline.at === 0,
2642
1971
  children: "undo"
2643
1972
  }
@@ -2646,7 +1975,9 @@ var TimelineLog = ({ token, isOpenState, timelineState }) => {
2646
1975
  "button",
2647
1976
  {
2648
1977
  type: "button",
2649
- onClick: () => atom_io.redo(token),
1978
+ onClick: () => {
1979
+ atom_io.redo(token);
1980
+ },
2650
1981
  disabled: timeline.at === timeline.history.length,
2651
1982
  children: "redo"
2652
1983
  }
@@ -2654,16 +1985,22 @@ var TimelineLog = ({ token, isOpenState, timelineState }) => {
2654
1985
  ] })
2655
1986
  ] })
2656
1987
  ] }),
2657
- isOpen ? /* @__PURE__ */ jsxRuntime.jsx("main", { children: timeline.history.map((update, index) => /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
1988
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsx("main", { children: timeline.history.map((update, index) => /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
2658
1989
  index === timeline.at ? /* @__PURE__ */ jsxRuntime.jsx(YouAreHere, {}) : null,
2659
- /* @__PURE__ */ jsxRuntime.jsx(article.TimelineUpdate, { timelineUpdate: update }),
1990
+ /* @__PURE__ */ jsxRuntime.jsx(
1991
+ article.TimelineUpdate,
1992
+ {
1993
+ timelineUpdate: update,
1994
+ serialNumber: index
1995
+ }
1996
+ ),
2660
1997
  index === timeline.history.length - 1 && timeline.at === timeline.history.length ? /* @__PURE__ */ jsxRuntime.jsx(YouAreHere, {}) : null
2661
1998
  ] }, update.key + index + timeline.at)) }) : null
2662
1999
  ] });
2663
2000
  };
2664
2001
  var TimelineIndex = () => {
2665
- const tokenIds = react.useO(timelineIndex);
2666
- return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index timeline_index", children: tokenIds.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((token) => {
2002
+ const tokenIds = react$1.useO(timelineIndex);
2003
+ return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index timeline_index", "data-testid": "timeline-index", children: tokenIds.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((token) => {
2667
2004
  return /* @__PURE__ */ jsxRuntime.jsx(
2668
2005
  TimelineLog,
2669
2006
  {
@@ -2676,34 +2013,48 @@ var TimelineIndex = () => {
2676
2013
  }) });
2677
2014
  };
2678
2015
  var TransactionLog = ({ token, isOpenState, logState }) => {
2679
- const log = react.useO(logState);
2680
- const isOpen = react.useO(isOpenState);
2681
- const setIsOpen = react.useI(isOpenState);
2682
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "node transaction_log", children: [
2683
- /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
2684
- /* @__PURE__ */ jsxRuntime.jsx(button.OpenClose, { isOpen, setIsOpen }),
2685
- /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
2686
- /* @__PURE__ */ jsxRuntime.jsx("h2", { children: token.key }),
2687
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail length", children: [
2688
- "(",
2689
- log.length,
2690
- ")"
2691
- ] })
2692
- ] })
2693
- ] }),
2694
- isOpen ? /* @__PURE__ */ jsxRuntime.jsx("main", { children: log.map((update, index) => /* @__PURE__ */ jsxRuntime.jsx(
2695
- article.TransactionUpdate,
2696
- {
2697
- serialNumber: index,
2698
- transactionUpdate: update
2699
- },
2700
- update.key + index
2701
- )) }) : null
2702
- ] });
2016
+ const log = react$1.useO(logState);
2017
+ const isOpen = react$1.useO(isOpenState);
2018
+ const setIsOpen = react$1.useI(isOpenState);
2019
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2020
+ "section",
2021
+ {
2022
+ className: "node transaction_log",
2023
+ "data-testid": `transaction-${token.key}`,
2024
+ children: [
2025
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
2026
+ /* @__PURE__ */ jsxRuntime.jsx(
2027
+ button.OpenClose,
2028
+ {
2029
+ isOpen,
2030
+ testid: `open-close-transaction-${token.key}`,
2031
+ setIsOpen
2032
+ }
2033
+ ),
2034
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
2035
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { children: token.key }),
2036
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "detail length", children: [
2037
+ "(",
2038
+ log.length,
2039
+ ")"
2040
+ ] })
2041
+ ] })
2042
+ ] }),
2043
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsx("main", { children: log.map((update, index) => /* @__PURE__ */ jsxRuntime.jsx(
2044
+ article.TransactionUpdate,
2045
+ {
2046
+ serialNumber: index,
2047
+ transactionUpdate: update
2048
+ },
2049
+ update.key + index
2050
+ )) }) : null
2051
+ ]
2052
+ }
2053
+ );
2703
2054
  };
2704
2055
  var TransactionIndex = () => {
2705
- const tokenIds = react.useO(transactionIndex);
2706
- return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index transaction_index", children: tokenIds.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((token) => {
2056
+ const tokenIds = react$1.useO(transactionIndex);
2057
+ return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index transaction_index", "data-testid": "transaction-index", children: tokenIds.filter((token) => !token.key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).map((token) => {
2707
2058
  return /* @__PURE__ */ jsxRuntime.jsx(
2708
2059
  TransactionLog,
2709
2060
  {
@@ -2716,13 +2067,13 @@ var TransactionIndex = () => {
2716
2067
  }) });
2717
2068
  };
2718
2069
  var AtomIODevtools = () => {
2719
- const constraintsRef = React.useRef(null);
2720
- const setDevtoolsAreOpen = react.useI(devtoolsAreOpenState);
2721
- const devtoolsAreOpen = react.useO(devtoolsAreOpenState);
2722
- const setDevtoolsView = react.useI(devtoolsViewSelectionState);
2723
- const devtoolsView = react.useO(devtoolsViewSelectionState);
2724
- const devtoolsViewOptions = react.useO(devtoolsViewOptionsState);
2725
- const mouseHasMoved = React.useRef(false);
2070
+ const constraintsRef = react.useRef(null);
2071
+ const setDevtoolsAreOpen = react$1.useI(devtoolsAreOpenState);
2072
+ const devtoolsAreOpen = react$1.useO(devtoolsAreOpenState);
2073
+ const setDevtoolsView = react$1.useI(devtoolsViewSelectionState);
2074
+ const devtoolsView = react$1.useO(devtoolsViewSelectionState);
2075
+ const devtoolsViewOptions = react$1.useO(devtoolsViewOptionsState);
2076
+ const mouseHasMoved = react.useRef(false);
2726
2077
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2727
2078
  /* @__PURE__ */ jsxRuntime.jsx(
2728
2079
  framerMotion.motion.span,
@@ -2760,8 +2111,11 @@ var AtomIODevtools = () => {
2760
2111
  "button",
2761
2112
  {
2762
2113
  type: "button",
2114
+ "data-testid": `view-${viewOption}`,
2763
2115
  className: viewOption === devtoolsView ? `active` : ``,
2764
- onClick: () => setDevtoolsView(viewOption),
2116
+ onClick: () => {
2117
+ setDevtoolsView(viewOption);
2118
+ },
2765
2119
  disabled: viewOption === devtoolsView,
2766
2120
  children: viewOption
2767
2121
  },