cx 26.1.0 → 26.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/build/ui/Widget.js +0 -5
  2. package/build/util/Component.js +5 -0
  3. package/build/util/test/createTestRenderer.d.ts +3 -1
  4. package/build/util/test/createTestRenderer.js +8 -2
  5. package/build/widgets/icons/calendar.js +4 -3
  6. package/build/widgets/icons/check.js +2 -2
  7. package/build/widgets/icons/clear.js +2 -2
  8. package/build/widgets/icons/close.js +2 -2
  9. package/build/widgets/icons/cx.js +2 -2
  10. package/build/widgets/icons/drop-down.js +2 -2
  11. package/build/widgets/icons/file.js +2 -2
  12. package/build/widgets/icons/folder-open.js +2 -2
  13. package/build/widgets/icons/folder.js +2 -2
  14. package/build/widgets/icons/forward.js +2 -2
  15. package/build/widgets/icons/loading.js +2 -2
  16. package/build/widgets/icons/menu.js +2 -2
  17. package/build/widgets/icons/pixel-picker.js +2 -2
  18. package/build/widgets/icons/search.js +2 -2
  19. package/build/widgets/icons/sort-asc.js +2 -2
  20. package/build/widgets/icons/square.js +2 -2
  21. package/dist/manifest.js +896 -896
  22. package/dist/ui.js +1 -8
  23. package/dist/util.js +4 -0
  24. package/dist/widgets.js +377 -313
  25. package/package.json +3 -1
  26. package/src/core.d.ts +182 -182
  27. package/src/data/ArrayElementView.ts +90 -90
  28. package/src/data/AugmentedViewBase.ts +88 -88
  29. package/src/data/Binding.ts +104 -104
  30. package/src/data/ExposedRecordView.ts +95 -95
  31. package/src/data/ExposedValueView.ts +89 -89
  32. package/src/data/Grouper.spec.ts +57 -57
  33. package/src/data/NestedDataView.ts +43 -43
  34. package/src/data/ReadOnlyDataView.ts +39 -39
  35. package/src/data/Ref.ts +104 -104
  36. package/src/data/Store.ts +52 -52
  37. package/src/data/StoreProxy.ts +19 -19
  38. package/src/data/StoreRef.ts +66 -66
  39. package/src/data/StringTemplate.ts +93 -93
  40. package/src/data/StructuredSelector.spec.ts +113 -113
  41. package/src/data/SubscribableView.ts +63 -63
  42. package/src/data/ZoomIntoPropertyView.ts +45 -45
  43. package/src/data/comparer.ts +78 -78
  44. package/src/data/ops/updateArray.ts +31 -31
  45. package/src/hooks/invokeCallback.spec.tsx +4 -4
  46. package/src/hooks/resolveCallback.spec.tsx +4 -4
  47. package/src/hooks/store.spec.tsx +15 -15
  48. package/src/hooks/useTrigger.spec.tsx +16 -10
  49. package/src/jsx-dev-runtime.ts +4 -4
  50. package/src/jsx-runtime.ts +79 -79
  51. package/src/ui/CSS.ts +87 -87
  52. package/src/ui/ContentResolver.spec.tsx +31 -29
  53. package/src/ui/Controller.spec.tsx +47 -39
  54. package/src/ui/Cx.spec.tsx +10 -8
  55. package/src/ui/DataProxy.spec.tsx +18 -18
  56. package/src/ui/DataProxy.ts +55 -55
  57. package/src/ui/FocusManager.ts +171 -171
  58. package/src/ui/IsolatedScope.spec.tsx +16 -9
  59. package/src/ui/PureContainer.spec.tsx +20 -18
  60. package/src/ui/Repeater.spec.tsx +8 -6
  61. package/src/ui/Rescope.spec.tsx +13 -13
  62. package/src/ui/Rescope.ts +49 -49
  63. package/src/ui/Restate.spec.tsx +31 -27
  64. package/src/ui/VDOM.ts +1 -1
  65. package/src/ui/Widget.tsx +0 -7
  66. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  67. package/src/ui/createFunctionalComponent.spec.tsx +20 -18
  68. package/src/ui/layout/Content.ts +30 -30
  69. package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
  70. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
  71. package/src/ui/selection/PropertySelection.ts +87 -87
  72. package/src/util/Component.spec.ts +30 -0
  73. package/src/util/Component.ts +301 -296
  74. package/src/util/DOM.ts +88 -88
  75. package/src/util/Format.spec.ts +69 -69
  76. package/src/util/Format.ts +267 -267
  77. package/src/util/addEventListenerWithOptions.ts +41 -41
  78. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  79. package/src/util/color/rgbToHsl.ts +35 -35
  80. package/src/util/getActiveElement.ts +4 -4
  81. package/src/util/innerTextTrim.ts +10 -10
  82. package/src/util/isDataRecord.ts +5 -5
  83. package/src/util/test/createTestRenderer.tsx +9 -2
  84. package/src/widgets/AccessorBindings.spec.tsx +4 -4
  85. package/src/widgets/HtmlElement.spec.tsx +6 -6
  86. package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
  87. package/src/widgets/Sandbox.ts +103 -103
  88. package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
  89. package/src/widgets/grid/GridCell.ts +143 -143
  90. package/src/widgets/icons/calendar.tsx +22 -17
  91. package/src/widgets/icons/check.tsx +14 -13
  92. package/src/widgets/icons/clear.tsx +16 -15
  93. package/src/widgets/icons/close.tsx +20 -20
  94. package/src/widgets/icons/cx.tsx +39 -38
  95. package/src/widgets/icons/drop-down.tsx +16 -15
  96. package/src/widgets/icons/file.tsx +14 -13
  97. package/src/widgets/icons/folder-open.tsx +16 -15
  98. package/src/widgets/icons/folder.tsx +14 -13
  99. package/src/widgets/icons/forward.tsx +23 -22
  100. package/src/widgets/icons/loading.tsx +25 -24
  101. package/src/widgets/icons/menu.tsx +18 -17
  102. package/src/widgets/icons/pixel-picker.tsx +18 -18
  103. package/src/widgets/icons/search.tsx +14 -13
  104. package/src/widgets/icons/sort-asc.tsx +15 -14
  105. package/src/widgets/icons/square.tsx +19 -18
  106. package/src/widgets/nav/Route.spec.tsx +2 -2
  107. package/src/widgets/nav/Route.ts +142 -142
  108. package/src/widgets/overlay/Dropdown.tsx +762 -762
  109. package/src/widgets/overlay/MsgBox.tsx +141 -141
  110. package/src/widgets/overlay/Toast.ts +111 -111
  111. package/src/widgets/overlay/Window.tsx +299 -299
  112. package/src/widgets/overlay/alerts.ts +46 -46
  113. package/src/widgets/overlay/index.ts +11 -11
@@ -1,6 +1,6 @@
1
1
  import { ContentResolver } from "./ContentResolver";
2
2
  import { Store } from "../data/Store";
3
- import { createTestRenderer } from "../util/test/createTestRenderer";
3
+ import { createTestRenderer, act } from "../util/test/createTestRenderer";
4
4
  import assert from "assert";
5
5
  import { bind } from "./bind";
6
6
  import { createAccessorModelProxy } from "../data/createAccessorModelProxy";
@@ -16,7 +16,7 @@ interface TestModel {
16
16
  }
17
17
 
18
18
  describe("ContentResolver", () => {
19
- it("resolves content based on params", () => {
19
+ it("resolves content based on params", async () => {
20
20
  let widget = (
21
21
  <cx>
22
22
  <div>
@@ -31,7 +31,7 @@ describe("ContentResolver", () => {
31
31
  },
32
32
  });
33
33
 
34
- const component = createTestRenderer(store, widget);
34
+ const component = await createTestRenderer(store, widget);
35
35
 
36
36
  let tree = component.toJSON();
37
37
  assert.deepEqual(tree, {
@@ -47,7 +47,7 @@ describe("ContentResolver", () => {
47
47
  });
48
48
  });
49
49
 
50
- it("re-resolves when params change", () => {
50
+ it("re-resolves when params change", async () => {
51
51
  let resolveCount = 0;
52
52
 
53
53
  let widget = (
@@ -70,7 +70,7 @@ describe("ContentResolver", () => {
70
70
  },
71
71
  });
72
72
 
73
- const component = createTestRenderer(store, widget);
73
+ const component = await createTestRenderer(store, widget);
74
74
 
75
75
  let tree = component.toJSON();
76
76
  assert.deepEqual(tree, {
@@ -86,7 +86,9 @@ describe("ContentResolver", () => {
86
86
  });
87
87
  assert.equal(resolveCount, 1);
88
88
 
89
- store.set("value", 2);
89
+ await act(async () => {
90
+ store.set("value", 2);
91
+ });
90
92
  tree = component.toJSON();
91
93
  assert.deepEqual(tree, {
92
94
  type: "div",
@@ -102,7 +104,7 @@ describe("ContentResolver", () => {
102
104
  assert.equal(resolveCount, 2);
103
105
  });
104
106
 
105
- it("does not re-resolve if params are unchanged", () => {
107
+ it("does not re-resolve if params are unchanged", async () => {
106
108
  let resolveCount = 0;
107
109
 
108
110
  let widget = (
@@ -126,7 +128,7 @@ describe("ContentResolver", () => {
126
128
  },
127
129
  });
128
130
 
129
- const component = createTestRenderer(store, widget);
131
+ const component = await createTestRenderer(store, widget);
130
132
  assert.equal(resolveCount, 1);
131
133
 
132
134
  // Change unrelated data
@@ -135,7 +137,7 @@ describe("ContentResolver", () => {
135
137
  assert.equal(resolveCount, 1);
136
138
  });
137
139
 
138
- it("supports literal values in params", () => {
140
+ it("supports literal values in params", async () => {
139
141
  let receivedParams: any = null;
140
142
 
141
143
  let widget = (
@@ -154,7 +156,7 @@ describe("ContentResolver", () => {
154
156
 
155
157
  let store = new Store();
156
158
 
157
- const component = createTestRenderer(store, widget);
159
+ const component = await createTestRenderer(store, widget);
158
160
 
159
161
  let tree = component.toJSON();
160
162
  assert.deepEqual(tree, {
@@ -172,7 +174,7 @@ describe("ContentResolver", () => {
172
174
  assert.equal(receivedParams.name, "test");
173
175
  });
174
176
 
175
- it("supports mode=prepend", () => {
177
+ it("supports mode=prepend", async () => {
176
178
  let widget = (
177
179
  <cx>
178
180
  <div>
@@ -185,7 +187,7 @@ describe("ContentResolver", () => {
185
187
 
186
188
  let store = new Store();
187
189
 
188
- const component = createTestRenderer(store, widget);
190
+ const component = await createTestRenderer(store, widget);
189
191
 
190
192
  let tree = component.toJSON();
191
193
  assert.deepEqual(tree, {
@@ -206,7 +208,7 @@ describe("ContentResolver", () => {
206
208
  });
207
209
  });
208
210
 
209
- it("supports mode=append", () => {
211
+ it("supports mode=append", async () => {
210
212
  let widget = (
211
213
  <cx>
212
214
  <div>
@@ -219,7 +221,7 @@ describe("ContentResolver", () => {
219
221
 
220
222
  let store = new Store();
221
223
 
222
- const component = createTestRenderer(store, widget);
224
+ const component = await createTestRenderer(store, widget);
223
225
 
224
226
  let tree = component.toJSON();
225
227
  assert.deepEqual(tree, {
@@ -240,7 +242,7 @@ describe("ContentResolver", () => {
240
242
  });
241
243
  });
242
244
 
243
- it("supports mode=replace (default)", () => {
245
+ it("supports mode=replace (default)", async () => {
244
246
  let widget = (
245
247
  <cx>
246
248
  <div>
@@ -253,7 +255,7 @@ describe("ContentResolver", () => {
253
255
 
254
256
  let store = new Store();
255
257
 
256
- const component = createTestRenderer(store, widget);
258
+ const component = await createTestRenderer(store, widget);
257
259
 
258
260
  let tree = component.toJSON();
259
261
  assert.deepEqual(tree, {
@@ -295,7 +297,7 @@ describe("ContentResolver", () => {
295
297
  },
296
298
  });
297
299
 
298
- const component = createTestRenderer(store, widget);
300
+ const component = await createTestRenderer(store, widget);
299
301
 
300
302
  // Initially loading should be true
301
303
  assert.equal(store.get("loading"), true);
@@ -323,7 +325,7 @@ describe("ContentResolver", () => {
323
325
  });
324
326
  });
325
327
 
326
- it("supports typed params with accessor chains", () => {
328
+ it("supports typed params with accessor chains", async () => {
327
329
  const model = createAccessorModelProxy<TestModel>();
328
330
 
329
331
  // This test verifies type inference works correctly.
@@ -362,7 +364,7 @@ describe("ContentResolver", () => {
362
364
  },
363
365
  });
364
366
 
365
- const component = createTestRenderer(store, widget);
367
+ const component = await createTestRenderer(store, widget);
366
368
 
367
369
  let tree = component.toJSON();
368
370
  assert.deepEqual(tree, {
@@ -378,7 +380,7 @@ describe("ContentResolver", () => {
378
380
  });
379
381
  });
380
382
 
381
- it("infers types from literal params", () => {
383
+ it("infers types from literal params", async () => {
382
384
  // When using literal values, TypeScript can infer their types
383
385
  let widget = (
384
386
  <cx>
@@ -399,7 +401,7 @@ describe("ContentResolver", () => {
399
401
 
400
402
  let store = new Store();
401
403
 
402
- const component = createTestRenderer(store, widget);
404
+ const component = await createTestRenderer(store, widget);
403
405
 
404
406
  let tree = component.toJSON();
405
407
  assert.deepEqual(tree, {
@@ -415,7 +417,7 @@ describe("ContentResolver", () => {
415
417
  });
416
418
  });
417
419
 
418
- it("supports simple Prop params (non-structured)", () => {
420
+ it("supports simple Prop params (non-structured)", async () => {
419
421
  const model = createAccessorModelProxy<TestModel>();
420
422
 
421
423
  // Test using a single AccessorChain as params instead of an object
@@ -444,7 +446,7 @@ describe("ContentResolver", () => {
444
446
  },
445
447
  });
446
448
 
447
- const component = createTestRenderer(store, widget);
449
+ const component = await createTestRenderer(store, widget);
448
450
 
449
451
  let tree = component.toJSON();
450
452
  assert.deepEqual(tree, {
@@ -460,7 +462,7 @@ describe("ContentResolver", () => {
460
462
  });
461
463
  });
462
464
 
463
- it("supports simple bind() as params", () => {
465
+ it("supports simple bind() as params", async () => {
464
466
  let widget = (
465
467
  <cx>
466
468
  <div>
@@ -480,7 +482,7 @@ describe("ContentResolver", () => {
480
482
  },
481
483
  });
482
484
 
483
- const component = createTestRenderer(store, widget);
485
+ const component = await createTestRenderer(store, widget);
484
486
 
485
487
  let tree = component.toJSON();
486
488
  assert.deepEqual(tree, {
@@ -496,7 +498,7 @@ describe("ContentResolver", () => {
496
498
  });
497
499
  });
498
500
 
499
- it("resolves Selector<string> | null to string | null", () => {
501
+ it("resolves Selector<string> | null to string | null", async () => {
500
502
  const text: string | null = "Hello {user.name}";
501
503
 
502
504
  let widget = (
@@ -524,7 +526,7 @@ describe("ContentResolver", () => {
524
526
  },
525
527
  });
526
528
 
527
- const component = createTestRenderer(store, widget);
529
+ const component = await createTestRenderer(store, widget);
528
530
  let tree = component.toJSON();
529
531
  assert.deepEqual(tree, {
530
532
  type: "div",
@@ -533,7 +535,7 @@ describe("ContentResolver", () => {
533
535
  });
534
536
  });
535
537
 
536
- it("resolves Prop<string> to string (not any)", () => {
538
+ it("resolves Prop<string> to string (not any)", async () => {
537
539
  const model = createAccessorModelProxy<TestModel>();
538
540
 
539
541
  // When params is typed as Prop<string>, onResolve should receive string (not any)
@@ -565,7 +567,7 @@ describe("ContentResolver", () => {
565
567
  },
566
568
  });
567
569
 
568
- const component = createTestRenderer(store, widget);
570
+ const component = await createTestRenderer(store, widget);
569
571
 
570
572
  let tree = component.toJSON();
571
573
  assert.deepEqual(tree, {
@@ -1,6 +1,6 @@
1
1
  import { Store } from "../data/Store";
2
2
  import { Controller, ControllerConfig } from "./Controller";
3
- import { createTestRenderer } from "../util/test/createTestRenderer";
3
+ import { createTestRenderer, act } from "../util/test/createTestRenderer";
4
4
  import { VDOM, Widget, WidgetConfig } from "./Widget";
5
5
  import { Instance } from "./Instance";
6
6
  import { bind } from "./bind";
@@ -8,7 +8,7 @@ import assert from "assert";
8
8
  import { RenderingContext } from "./RenderingContext";
9
9
 
10
10
  describe("Controller", () => {
11
- it("invokes lifetime methods", () => {
11
+ it("invokes lifetime methods", async () => {
12
12
  let init = 0,
13
13
  prepare = 0,
14
14
  explore = 0,
@@ -34,7 +34,7 @@ describe("Controller", () => {
34
34
 
35
35
  let store = new Store();
36
36
 
37
- const component = createTestRenderer(
37
+ const component = await createTestRenderer(
38
38
  store,
39
39
  <cx>
40
40
  <div controller={TestController} />
@@ -48,7 +48,7 @@ describe("Controller", () => {
48
48
  assert.equal(cleanup, 1);
49
49
  });
50
50
 
51
- it("widgets invoke controller methods specified as strings", () => {
51
+ it("widgets invoke controller methods specified as strings", async () => {
52
52
  let callback = 0;
53
53
 
54
54
  class TestController extends Controller {
@@ -70,7 +70,7 @@ describe("Controller", () => {
70
70
 
71
71
  let store = new Store();
72
72
 
73
- const component = createTestRenderer(
73
+ const component = await createTestRenderer(
74
74
  store,
75
75
  <cx>
76
76
  <Cmp controller={TestController} onTest="callback" />
@@ -81,7 +81,7 @@ describe("Controller", () => {
81
81
  assert.equal(callback, 1);
82
82
  });
83
83
 
84
- it("widgets can access controller methods specified in ancestor controllers", () => {
84
+ it("widgets can access controller methods specified in ancestor controllers", async () => {
85
85
  let callback1 = 0;
86
86
  let callback2 = 0;
87
87
 
@@ -110,7 +110,7 @@ describe("Controller", () => {
110
110
 
111
111
  let store = new Store();
112
112
 
113
- const component = createTestRenderer(
113
+ const component = await createTestRenderer(
114
114
  store,
115
115
  <cx>
116
116
  <div controller={TestController1}>
@@ -124,7 +124,7 @@ describe("Controller", () => {
124
124
  assert.equal(callback2, 0);
125
125
  });
126
126
 
127
- it("ancestor controllers are initialized first", () => {
127
+ it("ancestor controllers are initialized first", async () => {
128
128
  let order: string[] = [];
129
129
 
130
130
  class TestController1 extends Controller {
@@ -141,7 +141,7 @@ describe("Controller", () => {
141
141
 
142
142
  let store = new Store();
143
143
 
144
- const component = createTestRenderer(
144
+ const component = await createTestRenderer(
145
145
  store,
146
146
  <cx>
147
147
  <div controller={TestController1}>
@@ -154,7 +154,7 @@ describe("Controller", () => {
154
154
  assert.deepEqual(order, ["1", "2"]);
155
155
  });
156
156
 
157
- it("controllers on invisible elements are not initialized", () => {
157
+ it("controllers on invisible elements are not initialized", async () => {
158
158
  let order: string[] = [];
159
159
 
160
160
  class TestController1 extends Controller {
@@ -171,7 +171,7 @@ describe("Controller", () => {
171
171
 
172
172
  let store = new Store();
173
173
 
174
- const component = createTestRenderer(
174
+ const component = await createTestRenderer(
175
175
  store,
176
176
  <cx>
177
177
  <div controller={TestController1}>
@@ -184,7 +184,7 @@ describe("Controller", () => {
184
184
  assert.deepEqual(order, ["1"]);
185
185
  });
186
186
 
187
- it("invokes triggers and computables in order of definition", () => {
187
+ it("invokes triggers and computables in order of definition", async () => {
188
188
  let log: string[] = [];
189
189
 
190
190
  class TestController extends Controller {
@@ -216,7 +216,7 @@ describe("Controller", () => {
216
216
 
217
217
  let store = new Store();
218
218
 
219
- const component = createTestRenderer(
219
+ const component = await createTestRenderer(
220
220
  store,
221
221
  <cx>
222
222
  <div controller={TestController} />
@@ -227,7 +227,7 @@ describe("Controller", () => {
227
227
  assert.deepEqual(log, ["t1", "c1", "t2"]);
228
228
  });
229
229
 
230
- it("is recreated if a component is hidden and shown", () => {
230
+ it("is recreated if a component is hidden and shown", async () => {
231
231
  let initCount = 0;
232
232
 
233
233
  class TestController extends Controller {
@@ -239,7 +239,7 @@ describe("Controller", () => {
239
239
  let store = new Store();
240
240
  store.set("visible", true);
241
241
 
242
- const component = createTestRenderer(
242
+ const component = await createTestRenderer(
243
243
  store,
244
244
  <cx>
245
245
  <div visible={bind("visible")} controller={TestController} />
@@ -249,11 +249,15 @@ describe("Controller", () => {
249
249
  let tree1 = component.toJSON();
250
250
  assert.equal(initCount, 1);
251
251
 
252
- store.set("visible", false);
252
+ await act(async () => {
253
+ store.set("visible", false);
254
+ });
253
255
  let tree2 = component.toJSON();
254
256
  assert.equal(tree2, null);
255
257
 
256
- store.set("visible", true);
258
+ await act(async () => {
259
+ store.set("visible", true);
260
+ });
257
261
  let tree3 = component.toJSON();
258
262
  assert.equal(initCount, 2);
259
263
  });
@@ -275,7 +279,7 @@ describe("Controller", () => {
275
279
  assert.equal(store.get("x"), 1);
276
280
  });
277
281
 
278
- it("lifetime methods of a functional controller are properly invoked", () => {
282
+ it("lifetime methods of a functional controller are properly invoked", async () => {
279
283
  let initCount = 0,
280
284
  destroyCount = 0;
281
285
 
@@ -292,7 +296,7 @@ describe("Controller", () => {
292
296
  let store = new Store();
293
297
  store.set("visible", true);
294
298
 
295
- const component = createTestRenderer(
299
+ const component = await createTestRenderer(
296
300
  store,
297
301
  <cx>
298
302
  <div visible={bind("visible")} controller={testController} />
@@ -302,19 +306,23 @@ describe("Controller", () => {
302
306
  let tree1 = component.toJSON();
303
307
  assert.equal(initCount, 1);
304
308
 
305
- store.set("visible", false);
309
+ await act(async () => {
310
+ store.set("visible", false);
311
+ });
306
312
  let tree2 = component.toJSON();
307
313
  assert.equal(destroyCount, 1);
308
314
 
309
- store.set("visible", true);
315
+ await act(async () => {
316
+ store.set("visible", true);
317
+ });
310
318
  let tree3 = component.toJSON();
311
319
  assert.equal(initCount, 2);
312
320
  });
313
321
 
314
- it("widgets can easily define controller methods", () => {
322
+ it("widgets can easily define controller methods", async () => {
315
323
  let store = new Store({ data: { x: 0 } });
316
324
 
317
- const component = createTestRenderer(
325
+ const component = await createTestRenderer(
318
326
  store,
319
327
  <cx>
320
328
  <div
@@ -339,10 +347,10 @@ describe("Controller", () => {
339
347
  assert.equal(store.get("x"), 1);
340
348
  });
341
349
 
342
- it("functional controllers get store methods through configuration", () => {
350
+ it("functional controllers get store methods through configuration", async () => {
343
351
  let store = new Store({ data: { x: 0 } });
344
352
 
345
- const component = createTestRenderer(
353
+ const component = await createTestRenderer(
346
354
  store,
347
355
  <cx>
348
356
  <div
@@ -367,10 +375,10 @@ describe("Controller", () => {
367
375
  assert.equal(store.get("x"), 1);
368
376
  });
369
377
 
370
- it("addComputable accepts refs", () => {
378
+ it("addComputable accepts refs", async () => {
371
379
  let store = new Store({ data: { x: 0 } });
372
380
 
373
- const component = createTestRenderer(
381
+ const component = await createTestRenderer(
374
382
  store,
375
383
  <cx>
376
384
  <div
@@ -390,7 +398,7 @@ describe("Controller", () => {
390
398
  assert.equal(store.get("y"), 1);
391
399
  });
392
400
 
393
- it("invokeParentMethod is invoked on parent instance", () => {
401
+ it("invokeParentMethod is invoked on parent instance", async () => {
394
402
  let testValid: number[] = [];
395
403
 
396
404
  class TestController1 extends Controller {
@@ -411,7 +419,7 @@ describe("Controller", () => {
411
419
 
412
420
  let store = new Store();
413
421
 
414
- const component = createTestRenderer(
422
+ const component = await createTestRenderer(
415
423
  store,
416
424
  <cx>
417
425
  <div controller={TestController2}>
@@ -446,10 +454,10 @@ describe("Controller types", () => {
446
454
  }
447
455
  }
448
456
 
449
- it("accepts Controller class directly", () => {
457
+ it("accepts Controller class directly", async () => {
450
458
  let store = new Store();
451
459
 
452
- const component = createTestRenderer(
460
+ const component = await createTestRenderer(
453
461
  store,
454
462
  <cx>
455
463
  <div controller={MyController} />
@@ -460,7 +468,7 @@ describe("Controller types", () => {
460
468
  assert.ok(tree);
461
469
  });
462
470
 
463
- it("accepts config with type property", () => {
471
+ it("accepts config with type property", async () => {
464
472
  let store = new Store();
465
473
  let initCalled = false;
466
474
 
@@ -477,7 +485,7 @@ describe("Controller types", () => {
477
485
  }
478
486
  }
479
487
 
480
- const component = createTestRenderer(
488
+ const component = await createTestRenderer(
481
489
  store,
482
490
  <cx>
483
491
  <div controller={{ type: TypedController, customValue: 42 }} />
@@ -489,10 +497,10 @@ describe("Controller types", () => {
489
497
  assert.equal(initCalled, true);
490
498
  });
491
499
 
492
- it("accepts inline config object with ThisType", () => {
500
+ it("accepts inline config object with ThisType", async () => {
493
501
  let store = new Store({ data: { count: 0 } });
494
502
 
495
- const component = createTestRenderer(
503
+ const component = await createTestRenderer(
496
504
  store,
497
505
  <cx>
498
506
  <div
@@ -510,10 +518,10 @@ describe("Controller types", () => {
510
518
  assert.equal(store.get("count"), 1);
511
519
  });
512
520
 
513
- it("accepts factory function", () => {
521
+ it("accepts factory function", async () => {
514
522
  let store = new Store({ data: { count: 0 } });
515
523
 
516
- const component = createTestRenderer(
524
+ const component = await createTestRenderer(
517
525
  store,
518
526
  <cx>
519
527
  <div
@@ -530,7 +538,7 @@ describe("Controller types", () => {
530
538
  assert.equal(store.get("count"), 5);
531
539
  });
532
540
 
533
- it("accepts CreateConfig with type and required properties", () => {
541
+ it("accepts CreateConfig with type and required properties", async () => {
534
542
  let store = new Store({ data: { result: 0 } });
535
543
 
536
544
  interface RequiredPropControllerConfig extends ControllerConfig {
@@ -549,7 +557,7 @@ describe("Controller types", () => {
549
557
  }
550
558
  }
551
559
 
552
- const component = createTestRenderer(
560
+ const component = await createTestRenderer(
553
561
  store,
554
562
  <cx>
555
563
  <div
@@ -3,12 +3,12 @@ import { VDOM } from "./VDOM";
3
3
  import { Container, ContainerBase, ContainerConfig } from "./Container";
4
4
  import { Store } from "../data/Store";
5
5
  import { bind } from "./bind";
6
- import { createTestRenderer, createTestWidget } from "../util/test/createTestRenderer";
6
+ import { createTestRenderer, createTestWidget, act } from "../util/test/createTestRenderer";
7
7
  import assert from "assert";
8
8
  import { HtmlElement } from "../widgets/HtmlElement";
9
9
 
10
10
  describe("Cx", () => {
11
- it("can render cx content", () => {
11
+ it("can render cx content", async () => {
12
12
  let widget = (
13
13
  <cx>
14
14
  <div>Test</div>
@@ -17,7 +17,7 @@ describe("Cx", () => {
17
17
 
18
18
  let store = new Store();
19
19
 
20
- const component = createTestRenderer(store, widget);
20
+ const component = await createTestRenderer(store, widget);
21
21
 
22
22
  let tree = component.toJSON();
23
23
  assert.deepEqual(tree, {
@@ -27,7 +27,7 @@ describe("Cx", () => {
27
27
  });
28
28
  });
29
29
 
30
- it("store changes preserve the instance", () => {
30
+ it("store changes preserve the instance", async () => {
31
31
  let instanceLog: any[] = [];
32
32
  let storeLog: any[] = [];
33
33
 
@@ -46,7 +46,7 @@ describe("Cx", () => {
46
46
  let store1 = new Store({ data: { text: "Test1" } });
47
47
  let store2 = new Store({ data: { text: "Test2" } });
48
48
 
49
- const component = createTestRenderer(store1, widget);
49
+ const component = await createTestRenderer(store1, widget);
50
50
 
51
51
  let tree1 = component.toJSON();
52
52
  assert.deepEqual(tree1, {
@@ -55,7 +55,9 @@ describe("Cx", () => {
55
55
  children: ["Test1"],
56
56
  });
57
57
 
58
- component.update(createTestWidget(store2, widget));
58
+ await act(async () => {
59
+ component.update(createTestWidget(store2, widget));
60
+ });
59
61
 
60
62
  let tree2 = component.toJSON();
61
63
  assert.deepEqual(tree2, {
@@ -70,7 +72,7 @@ describe("Cx", () => {
70
72
  assert(storeLog[1] === store2);
71
73
  });
72
74
 
73
- it("invokes lifetime methods in the right order", () => {
75
+ it("invokes lifetime methods in the right order", async () => {
74
76
  let events: any[] = [];
75
77
 
76
78
  interface TestWidgetConfig extends ContainerConfig {
@@ -123,7 +125,7 @@ describe("Cx", () => {
123
125
 
124
126
  let store = new Store();
125
127
 
126
- const component = createTestRenderer(store, widget);
128
+ const component = await createTestRenderer(store, widget);
127
129
 
128
130
  let tree = component.toJSON();
129
131
  assert.deepEqual(tree, {