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.
- package/build/ui/Widget.js +0 -5
- package/build/util/Component.js +5 -0
- package/build/util/test/createTestRenderer.d.ts +3 -1
- package/build/util/test/createTestRenderer.js +8 -2
- package/build/widgets/icons/calendar.js +4 -3
- package/build/widgets/icons/check.js +2 -2
- package/build/widgets/icons/clear.js +2 -2
- package/build/widgets/icons/close.js +2 -2
- package/build/widgets/icons/cx.js +2 -2
- package/build/widgets/icons/drop-down.js +2 -2
- package/build/widgets/icons/file.js +2 -2
- package/build/widgets/icons/folder-open.js +2 -2
- package/build/widgets/icons/folder.js +2 -2
- package/build/widgets/icons/forward.js +2 -2
- package/build/widgets/icons/loading.js +2 -2
- package/build/widgets/icons/menu.js +2 -2
- package/build/widgets/icons/pixel-picker.js +2 -2
- package/build/widgets/icons/search.js +2 -2
- package/build/widgets/icons/sort-asc.js +2 -2
- package/build/widgets/icons/square.js +2 -2
- package/dist/manifest.js +896 -896
- package/dist/ui.js +1 -8
- package/dist/util.js +4 -0
- package/dist/widgets.js +377 -313
- package/package.json +3 -1
- package/src/core.d.ts +182 -182
- package/src/data/ArrayElementView.ts +90 -90
- package/src/data/AugmentedViewBase.ts +88 -88
- package/src/data/Binding.ts +104 -104
- package/src/data/ExposedRecordView.ts +95 -95
- package/src/data/ExposedValueView.ts +89 -89
- package/src/data/Grouper.spec.ts +57 -57
- package/src/data/NestedDataView.ts +43 -43
- package/src/data/ReadOnlyDataView.ts +39 -39
- package/src/data/Ref.ts +104 -104
- package/src/data/Store.ts +52 -52
- package/src/data/StoreProxy.ts +19 -19
- package/src/data/StoreRef.ts +66 -66
- package/src/data/StringTemplate.ts +93 -93
- package/src/data/StructuredSelector.spec.ts +113 -113
- package/src/data/SubscribableView.ts +63 -63
- package/src/data/ZoomIntoPropertyView.ts +45 -45
- package/src/data/comparer.ts +78 -78
- package/src/data/ops/updateArray.ts +31 -31
- package/src/hooks/invokeCallback.spec.tsx +4 -4
- package/src/hooks/resolveCallback.spec.tsx +4 -4
- package/src/hooks/store.spec.tsx +15 -15
- package/src/hooks/useTrigger.spec.tsx +16 -10
- package/src/jsx-dev-runtime.ts +4 -4
- package/src/jsx-runtime.ts +79 -79
- package/src/ui/CSS.ts +87 -87
- package/src/ui/ContentResolver.spec.tsx +31 -29
- package/src/ui/Controller.spec.tsx +47 -39
- package/src/ui/Cx.spec.tsx +10 -8
- package/src/ui/DataProxy.spec.tsx +18 -18
- package/src/ui/DataProxy.ts +55 -55
- package/src/ui/FocusManager.ts +171 -171
- package/src/ui/IsolatedScope.spec.tsx +16 -9
- package/src/ui/PureContainer.spec.tsx +20 -18
- package/src/ui/Repeater.spec.tsx +8 -6
- package/src/ui/Rescope.spec.tsx +13 -13
- package/src/ui/Rescope.ts +49 -49
- package/src/ui/Restate.spec.tsx +31 -27
- package/src/ui/VDOM.ts +1 -1
- package/src/ui/Widget.tsx +0 -7
- package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
- package/src/ui/createFunctionalComponent.spec.tsx +20 -18
- package/src/ui/layout/Content.ts +30 -30
- package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
- package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
- package/src/ui/selection/PropertySelection.ts +87 -87
- package/src/util/Component.spec.ts +30 -0
- package/src/util/Component.ts +301 -296
- package/src/util/DOM.ts +88 -88
- package/src/util/Format.spec.ts +69 -69
- package/src/util/Format.ts +267 -267
- package/src/util/addEventListenerWithOptions.ts +41 -41
- package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
- package/src/util/color/rgbToHsl.ts +35 -35
- package/src/util/getActiveElement.ts +4 -4
- package/src/util/innerTextTrim.ts +10 -10
- package/src/util/isDataRecord.ts +5 -5
- package/src/util/test/createTestRenderer.tsx +9 -2
- package/src/widgets/AccessorBindings.spec.tsx +4 -4
- package/src/widgets/HtmlElement.spec.tsx +6 -6
- package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
- package/src/widgets/Sandbox.ts +103 -103
- package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
- package/src/widgets/grid/GridCell.ts +143 -143
- package/src/widgets/icons/calendar.tsx +22 -17
- package/src/widgets/icons/check.tsx +14 -13
- package/src/widgets/icons/clear.tsx +16 -15
- package/src/widgets/icons/close.tsx +20 -20
- package/src/widgets/icons/cx.tsx +39 -38
- package/src/widgets/icons/drop-down.tsx +16 -15
- package/src/widgets/icons/file.tsx +14 -13
- package/src/widgets/icons/folder-open.tsx +16 -15
- package/src/widgets/icons/folder.tsx +14 -13
- package/src/widgets/icons/forward.tsx +23 -22
- package/src/widgets/icons/loading.tsx +25 -24
- package/src/widgets/icons/menu.tsx +18 -17
- package/src/widgets/icons/pixel-picker.tsx +18 -18
- package/src/widgets/icons/search.tsx +14 -13
- package/src/widgets/icons/sort-asc.tsx +15 -14
- package/src/widgets/icons/square.tsx +19 -18
- package/src/widgets/nav/Route.spec.tsx +2 -2
- package/src/widgets/nav/Route.ts +142 -142
- package/src/widgets/overlay/Dropdown.tsx +762 -762
- package/src/widgets/overlay/MsgBox.tsx +141 -141
- package/src/widgets/overlay/Toast.ts +111 -111
- package/src/widgets/overlay/Window.tsx +299 -299
- package/src/widgets/overlay/alerts.ts +46 -46
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/src/ui/Cx.spec.tsx
CHANGED
|
@@ -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
|
-
|
|
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, {
|