cx 26.0.14 → 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 (263) hide show
  1. package/build/ui/VDOM.d.ts +1 -20
  2. package/build/ui/VDOM.js +1 -3
  3. package/build/ui/Widget.d.ts +1 -1
  4. package/build/ui/Widget.js +0 -5
  5. package/build/ui/app/startAppLoop.js +2 -10
  6. package/build/util/Component.js +5 -0
  7. package/build/util/test/createTestRenderer.d.ts +3 -1
  8. package/build/util/test/createTestRenderer.js +8 -2
  9. package/build/widgets/form/Checkbox.d.ts +0 -1
  10. package/build/widgets/form/Checkbox.js +1 -0
  11. package/build/widgets/form/ColorField.d.ts +0 -1
  12. package/build/widgets/form/ColorField.js +2 -2
  13. package/build/widgets/form/DateTimeField.d.ts +0 -2
  14. package/build/widgets/form/DateTimeField.js +1 -0
  15. package/build/widgets/form/DateTimePicker.d.ts +0 -2
  16. package/build/widgets/form/DateTimePicker.js +1 -0
  17. package/build/widgets/form/Radio.d.ts +0 -1
  18. package/build/widgets/form/Slider.js +9 -1
  19. package/build/widgets/form/Switch.d.ts +0 -1
  20. package/build/widgets/form/Switch.js +1 -1
  21. package/build/widgets/form/Wheel.d.ts +0 -1
  22. package/build/widgets/grid/Grid.d.ts +0 -2
  23. package/build/widgets/grid/GridCellEditor.js +3 -1
  24. package/build/widgets/icons/calendar.js +4 -3
  25. package/build/widgets/icons/check.js +2 -2
  26. package/build/widgets/icons/clear.js +2 -2
  27. package/build/widgets/icons/close.js +2 -2
  28. package/build/widgets/icons/cx.js +2 -2
  29. package/build/widgets/icons/drop-down.js +2 -2
  30. package/build/widgets/icons/file.js +2 -2
  31. package/build/widgets/icons/folder-open.js +2 -2
  32. package/build/widgets/icons/folder.js +2 -2
  33. package/build/widgets/icons/forward.js +2 -2
  34. package/build/widgets/icons/loading.js +2 -2
  35. package/build/widgets/icons/menu.js +2 -2
  36. package/build/widgets/icons/pixel-picker.js +2 -2
  37. package/build/widgets/icons/search.js +2 -2
  38. package/build/widgets/icons/sort-asc.js +2 -2
  39. package/build/widgets/icons/square.js +2 -2
  40. package/build/widgets/overlay/Overlay.d.ts +3 -0
  41. package/build/widgets/overlay/Overlay.js +3 -2
  42. package/dist/manifest.js +867 -867
  43. package/dist/ui.js +4 -18
  44. package/dist/util.js +4 -0
  45. package/dist/widgets.js +395 -319
  46. package/package.json +11 -8
  47. package/src/charts/Chart.ts +108 -108
  48. package/src/core.d.ts +182 -182
  49. package/src/data/Expression.spec.ts +229 -229
  50. package/src/data/Expression.ts +233 -233
  51. package/src/data/Grouper.ts +158 -158
  52. package/src/data/Selector.ts +10 -10
  53. package/src/data/StringTemplate.spec.ts +132 -132
  54. package/src/data/StructuredSelector.ts +146 -146
  55. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  56. package/src/data/comparer.ts +78 -78
  57. package/src/data/computable.spec.ts +87 -87
  58. package/src/data/createStructuredSelector.ts +62 -62
  59. package/src/data/getAccessor.spec.ts +11 -11
  60. package/src/data/getAccessor.ts +74 -74
  61. package/src/data/getSelector.spec.ts +43 -43
  62. package/src/data/getSelector.ts +66 -66
  63. package/src/data/ops/filter.spec.ts +35 -35
  64. package/src/data/ops/filter.ts +9 -9
  65. package/src/data/ops/merge.ts +13 -13
  66. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  67. package/src/data/ops/updateArray.spec.ts +69 -69
  68. package/src/data/ops/updateArray.ts +31 -31
  69. package/src/data/test-types.ts +7 -7
  70. package/src/hooks/invokeCallback.spec.tsx +4 -4
  71. package/src/hooks/resolveCallback.spec.tsx +4 -4
  72. package/src/hooks/store.spec.tsx +15 -15
  73. package/src/hooks/useTrigger.spec.tsx +16 -10
  74. package/src/hooks/useTrigger.ts +26 -26
  75. package/src/index.scss +6 -6
  76. package/src/jsx-runtime.ts +79 -79
  77. package/src/svg/BoundedObject.ts +101 -101
  78. package/src/svg/util/Rect.ts +105 -105
  79. package/src/ui/CSS.ts +87 -87
  80. package/src/ui/CSSHelper.ts +17 -17
  81. package/src/ui/ContentResolver.spec.tsx +31 -29
  82. package/src/ui/Controller.spec.tsx +47 -39
  83. package/src/ui/Culture.ts +159 -159
  84. package/src/ui/Cx.spec.tsx +10 -8
  85. package/src/ui/DataProxy.spec.tsx +18 -18
  86. package/src/ui/Instance.ts +866 -866
  87. package/src/ui/IsolatedScope.spec.tsx +16 -9
  88. package/src/ui/Prop.ts +140 -140
  89. package/src/ui/PureContainer.spec.tsx +20 -18
  90. package/src/ui/RenderingContext.ts +99 -99
  91. package/src/ui/Repeater.spec.tsx +8 -6
  92. package/src/ui/Rescope.spec.tsx +13 -13
  93. package/src/ui/Restate.spec.tsx +31 -27
  94. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  95. package/src/ui/VDOM.ts +1 -34
  96. package/src/ui/Widget.tsx +0 -7
  97. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  98. package/src/ui/adapter/TreeAdapter.ts +185 -185
  99. package/src/ui/app/History.ts +133 -133
  100. package/src/ui/app/Url.spec.ts +50 -50
  101. package/src/ui/app/startAppLoop.tsx +5 -9
  102. package/src/ui/app/startHotAppLoop.ts +41 -41
  103. package/src/ui/createFunctionalComponent.spec.tsx +20 -18
  104. package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
  105. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
  106. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  107. package/src/ui/selection/PropertySelection.ts +87 -87
  108. package/src/util/Component.spec.ts +30 -0
  109. package/src/util/Component.ts +301 -296
  110. package/src/util/Console.ts +13 -13
  111. package/src/util/DOM.ts +88 -88
  112. package/src/util/hasKey.ts +18 -18
  113. package/src/util/index.ts +55 -55
  114. package/src/util/isArray.ts +3 -3
  115. package/src/util/isDefined.ts +3 -3
  116. package/src/util/isString.ts +3 -3
  117. package/src/util/test/createTestRenderer.tsx +9 -2
  118. package/src/widgets/AccessorBindings.spec.tsx +4 -4
  119. package/src/widgets/DocumentTitle.ts +95 -95
  120. package/src/widgets/HtmlElement.spec.tsx +6 -6
  121. package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
  122. package/src/widgets/autoFocus.ts +9 -9
  123. package/src/widgets/cx.ts +63 -63
  124. package/src/widgets/form/Checkbox.tsx +0 -1
  125. package/src/widgets/form/ColorField.tsx +15 -12
  126. package/src/widgets/form/DateTimeField.tsx +0 -2
  127. package/src/widgets/form/DateTimePicker.tsx +0 -2
  128. package/src/widgets/form/Radio.tsx +0 -1
  129. package/src/widgets/form/Slider.tsx +12 -4
  130. package/src/widgets/form/Switch.tsx +2 -3
  131. package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
  132. package/src/widgets/form/Wheel.tsx +0 -1
  133. package/src/widgets/grid/Grid.tsx +0 -1
  134. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  135. package/src/widgets/icons/calendar.tsx +20 -15
  136. package/src/widgets/icons/check.tsx +2 -1
  137. package/src/widgets/icons/clear.tsx +2 -1
  138. package/src/widgets/icons/close.tsx +2 -2
  139. package/src/widgets/icons/cx.tsx +2 -1
  140. package/src/widgets/icons/drop-down.tsx +2 -1
  141. package/src/widgets/icons/file.tsx +2 -1
  142. package/src/widgets/icons/folder-open.tsx +2 -1
  143. package/src/widgets/icons/folder.tsx +2 -1
  144. package/src/widgets/icons/forward.tsx +2 -1
  145. package/src/widgets/icons/loading.tsx +2 -1
  146. package/src/widgets/icons/menu.tsx +2 -1
  147. package/src/widgets/icons/pixel-picker.tsx +2 -2
  148. package/src/widgets/icons/search.tsx +2 -1
  149. package/src/widgets/icons/sort-asc.tsx +2 -1
  150. package/src/widgets/icons/square.tsx +2 -1
  151. package/src/widgets/nav/Route.spec.tsx +2 -2
  152. package/src/widgets/overlay/Overlay.tsx +5 -1
  153. package/src/widgets/overlay/captureMouse.ts +195 -195
  154. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  155. package/src/widgets/overlay/index.d.ts +11 -11
  156. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  157. package/build/data/ArrayElementView.spec.d.ts +0 -1
  158. package/build/data/ArrayElementView.spec.js +0 -81
  159. package/build/data/Binding.spec.d.ts +0 -1
  160. package/build/data/Binding.spec.js +0 -61
  161. package/build/data/Expression.spec.d.ts +0 -1
  162. package/build/data/Expression.spec.js +0 -196
  163. package/build/data/Grouper.spec.d.ts +0 -1
  164. package/build/data/Grouper.spec.js +0 -48
  165. package/build/data/Ref.spec.d.ts +0 -1
  166. package/build/data/Ref.spec.js +0 -72
  167. package/build/data/Store.spec.d.ts +0 -1
  168. package/build/data/Store.spec.js +0 -19
  169. package/build/data/StoreRef.spec.d.ts +0 -1
  170. package/build/data/StoreRef.spec.js +0 -22
  171. package/build/data/StringTemplate.spec.d.ts +0 -1
  172. package/build/data/StringTemplate.spec.js +0 -112
  173. package/build/data/StructuredSelector.spec.d.ts +0 -1
  174. package/build/data/StructuredSelector.spec.js +0 -102
  175. package/build/data/View.spec.d.ts +0 -1
  176. package/build/data/View.spec.js +0 -44
  177. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  178. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  179. package/build/data/comparer.spec.d.ts +0 -1
  180. package/build/data/comparer.spec.js +0 -50
  181. package/build/data/computable.spec.d.ts +0 -1
  182. package/build/data/computable.spec.js +0 -56
  183. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  184. package/build/data/createAccessorModelProxy.spec.js +0 -30
  185. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  186. package/build/data/createStructuredSelector.spec.js +0 -42
  187. package/build/data/diff/diffs.spec.d.ts +0 -1
  188. package/build/data/diff/diffs.spec.js +0 -45
  189. package/build/data/getAccessor.spec.d.ts +0 -1
  190. package/build/data/getAccessor.spec.js +0 -10
  191. package/build/data/getSelector.spec.d.ts +0 -1
  192. package/build/data/getSelector.spec.js +0 -36
  193. package/build/data/ops/append.spec.d.ts +0 -1
  194. package/build/data/ops/append.spec.js +0 -24
  195. package/build/data/ops/filter.spec.d.ts +0 -1
  196. package/build/data/ops/filter.spec.js +0 -25
  197. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  198. package/build/data/ops/findTreeNode.spec.js +0 -20
  199. package/build/data/ops/merge.spec.d.ts +0 -1
  200. package/build/data/ops/merge.spec.js +0 -23
  201. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  202. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  203. package/build/data/ops/updateArray.spec.d.ts +0 -1
  204. package/build/data/ops/updateArray.spec.js +0 -33
  205. package/build/data/ops/updateTree.spec.d.ts +0 -1
  206. package/build/data/ops/updateTree.spec.js +0 -44
  207. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  208. package/build/hooks/invokeCallback.spec.js +0 -44
  209. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  210. package/build/hooks/resolveCallback.spec.js +0 -35
  211. package/build/hooks/store.spec.d.ts +0 -1
  212. package/build/hooks/store.spec.js +0 -48
  213. package/build/hooks/useTrigger.spec.d.ts +0 -1
  214. package/build/hooks/useTrigger.spec.js +0 -59
  215. package/build/ui/Controller.spec.d.ts +0 -1
  216. package/build/ui/Controller.spec.js +0 -247
  217. package/build/ui/Cx.spec.d.ts +0 -1
  218. package/build/ui/Cx.spec.js +0 -153
  219. package/build/ui/DataProxy.spec.d.ts +0 -1
  220. package/build/ui/DataProxy.spec.js +0 -208
  221. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  222. package/build/ui/IsolatedScope.spec.js +0 -42
  223. package/build/ui/PureContainer.spec.d.ts +0 -1
  224. package/build/ui/PureContainer.spec.js +0 -149
  225. package/build/ui/Repeater.spec.d.ts +0 -1
  226. package/build/ui/Repeater.spec.js +0 -109
  227. package/build/ui/Rescope.spec.d.ts +0 -1
  228. package/build/ui/Rescope.spec.js +0 -134
  229. package/build/ui/Restate.spec.d.ts +0 -1
  230. package/build/ui/Restate.spec.js +0 -257
  231. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  232. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  233. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  234. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  235. package/build/ui/app/Url.spec.d.ts +0 -1
  236. package/build/ui/app/Url.spec.js +0 -43
  237. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  238. package/build/ui/createFunctionalComponent.spec.js +0 -272
  239. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  240. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  241. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  242. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  243. package/build/util/Format.spec.d.ts +0 -1
  244. package/build/util/Format.spec.js +0 -58
  245. package/build/util/TraversalStack.spec.d.ts +0 -1
  246. package/build/util/TraversalStack.spec.js +0 -43
  247. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  248. package/build/util/date/upperBoundCheck.spec.js +0 -22
  249. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  250. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  251. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  252. package/build/util/isValidIdentifierName.spec.js +0 -28
  253. package/build/util/routeAppend.spec.d.ts +0 -1
  254. package/build/util/routeAppend.spec.js +0 -14
  255. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  256. package/build/widgets/AccessorBindings.spec.js +0 -40
  257. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  258. package/build/widgets/HtmlElement.spec.js +0 -38
  259. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  260. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  261. package/build/widgets/nav/Route.spec.d.ts +0 -1
  262. package/build/widgets/nav/Route.spec.js +0 -15
  263. package/dist/manifest.d.ts +0 -1443
@@ -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
package/src/ui/Culture.ts CHANGED
@@ -1,159 +1,159 @@
1
- // @ts-expect-error
2
- import { NumberCulture, DateTimeCulture } from "intl-io";
3
- import { Localization } from "./Localization";
4
- import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
5
- import { invalidateExpressionCache } from "../data/Expression";
6
- import { invalidateStringTemplateCache } from "../data/StringTemplate";
7
- import { defaultCompare } from "../data/defaultCompare";
8
- import { Console } from "../util/Console";
9
-
10
- export interface CultureInfo {
11
- culture?: string;
12
- numberCulture?: string | null;
13
- dateTimeCulture?: string | null;
14
- defaultCurrency?: string;
15
- dateEncoding?: (date: Date) => string;
16
- timezone?: string | null;
17
- }
18
-
19
- export interface ResolvedCultureInfo {
20
- culture: string;
21
- numberCulture?: string | null;
22
- dateTimeCulture?: string | null;
23
- cache: any;
24
- defaultCurrency: string;
25
- dateEncoding: (date: Date) => string;
26
- timezone?: string | null;
27
- }
28
-
29
- let stack: ResolvedCultureInfo[] = [
30
- {
31
- culture: "en",
32
- numberCulture: null,
33
- dateTimeCulture: null,
34
- cache: {},
35
- defaultCurrency: "USD",
36
- dateEncoding: (date: Date) => date.toISOString(),
37
- timezone: null,
38
- },
39
- ];
40
-
41
- export function getDefaultCulture(): ResolvedCultureInfo {
42
- return stack[0];
43
- }
44
-
45
- export function getCurrentCulture(): ResolvedCultureInfo {
46
- return stack[stack.length - 1];
47
- }
48
-
49
- export function getCurrentCultureCache(): any {
50
- return getCurrentCulture().cache;
51
- }
52
-
53
- export function pushCulture(cultureInfo: ResolvedCultureInfo): void {
54
- stack.push(cultureInfo);
55
- }
56
-
57
- export function createCulture(cultureSpecs: Partial<CultureInfo>): ResolvedCultureInfo {
58
- let current = getCurrentCulture();
59
- let info: ResolvedCultureInfo = {
60
- culture: current.culture,
61
- dateEncoding: current.dateEncoding,
62
- defaultCurrency: current.defaultCurrency,
63
- cache: {},
64
- };
65
- for (let key in cultureSpecs) {
66
- if (!(cultureSpecs as any)[key]) continue;
67
- (info as any)[key] = (cultureSpecs as any)[key];
68
- }
69
- return info;
70
- }
71
-
72
- export function popCulture(cultureSpecs?: CultureInfo): CultureInfo | undefined {
73
- if (stack.length == 1) throw new Error("Cannot pop the last culture object.");
74
- if (cultureSpecs && stack[stack.length - 1] !== cultureSpecs) {
75
- Console.warn("Popped culture object does not match the current one.");
76
- }
77
- return stack.pop();
78
- }
79
-
80
- export class Culture {
81
- static setCulture(cultureCode: string): void {
82
- let cultureSpecs = getDefaultCulture();
83
- cultureSpecs.culture = cultureCode;
84
- cultureSpecs.cache = {};
85
- Localization.setCulture(cultureCode);
86
- this.invalidateCache();
87
- }
88
-
89
- static setNumberCulture(cultureCode: string): void {
90
- let cultureSpecs = getDefaultCulture();
91
- cultureSpecs.numberCulture = cultureCode;
92
- delete cultureSpecs.cache.numberCulture;
93
- this.invalidateCache();
94
- }
95
-
96
- static setDateTimeCulture(cultureCode: string): void {
97
- let cultureSpecs = getDefaultCulture();
98
- cultureSpecs.dateTimeCulture = cultureCode;
99
- delete cultureSpecs.cache.dateTimeCulture;
100
- this.invalidateCache();
101
- }
102
-
103
- static setDefaultCurrency(currencyCode: string): void {
104
- let cultureSpecs = getDefaultCulture();
105
- cultureSpecs.defaultCurrency = currencyCode;
106
- this.invalidateCache();
107
- }
108
-
109
- static setDefaultTimezone(timezone: string): void {
110
- let cultureSpecs = getDefaultCulture();
111
- cultureSpecs.timezone = timezone;
112
- this.invalidateCache();
113
- }
114
-
115
- static setDefaultDateEncoding(encoding: (date: Date) => string): void {
116
- let cultureSpecs = getDefaultCulture();
117
- cultureSpecs.dateEncoding = encoding;
118
- this.invalidateCache();
119
- }
120
-
121
- static invalidateCache(): void {
122
- GlobalCacheIdentifier.change();
123
- invalidateExpressionCache();
124
- invalidateStringTemplateCache();
125
- }
126
-
127
- static get defaultCurrency(): string | undefined {
128
- return getCurrentCulture().defaultCurrency;
129
- }
130
-
131
- static get culture(): string | undefined {
132
- return getCurrentCulture().culture;
133
- }
134
-
135
- static getNumberCulture(): NumberCulture {
136
- let { cache, numberCulture, culture } = getCurrentCulture();
137
- if (!cache!.numberCulture) cache!.numberCulture = new NumberCulture(numberCulture ?? culture);
138
- return cache!.numberCulture;
139
- }
140
-
141
- static getDateTimeCulture(): DateTimeCulture {
142
- let { cache, dateTimeCulture, culture, timezone } = getCurrentCulture();
143
- if (!cache!.dateTimeCulture)
144
- cache!.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture, {
145
- defaultTimezone: timezone,
146
- });
147
- return cache!.dateTimeCulture;
148
- }
149
-
150
- static getDefaultDateEncoding(): (date: Date) => string {
151
- return getCurrentCulture().dateEncoding;
152
- }
153
-
154
- static getComparer(options?: Intl.CollatorOptions): (a: any, b: any) => number {
155
- let { culture } = getCurrentCulture();
156
- if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
157
- return defaultCompare;
158
- }
159
- }
1
+ // @ts-expect-error
2
+ import { NumberCulture, DateTimeCulture } from "intl-io";
3
+ import { Localization } from "./Localization";
4
+ import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
5
+ import { invalidateExpressionCache } from "../data/Expression";
6
+ import { invalidateStringTemplateCache } from "../data/StringTemplate";
7
+ import { defaultCompare } from "../data/defaultCompare";
8
+ import { Console } from "../util/Console";
9
+
10
+ export interface CultureInfo {
11
+ culture?: string;
12
+ numberCulture?: string | null;
13
+ dateTimeCulture?: string | null;
14
+ defaultCurrency?: string;
15
+ dateEncoding?: (date: Date) => string;
16
+ timezone?: string | null;
17
+ }
18
+
19
+ export interface ResolvedCultureInfo {
20
+ culture: string;
21
+ numberCulture?: string | null;
22
+ dateTimeCulture?: string | null;
23
+ cache: any;
24
+ defaultCurrency: string;
25
+ dateEncoding: (date: Date) => string;
26
+ timezone?: string | null;
27
+ }
28
+
29
+ let stack: ResolvedCultureInfo[] = [
30
+ {
31
+ culture: "en",
32
+ numberCulture: null,
33
+ dateTimeCulture: null,
34
+ cache: {},
35
+ defaultCurrency: "USD",
36
+ dateEncoding: (date: Date) => date.toISOString(),
37
+ timezone: null,
38
+ },
39
+ ];
40
+
41
+ export function getDefaultCulture(): ResolvedCultureInfo {
42
+ return stack[0];
43
+ }
44
+
45
+ export function getCurrentCulture(): ResolvedCultureInfo {
46
+ return stack[stack.length - 1];
47
+ }
48
+
49
+ export function getCurrentCultureCache(): any {
50
+ return getCurrentCulture().cache;
51
+ }
52
+
53
+ export function pushCulture(cultureInfo: ResolvedCultureInfo): void {
54
+ stack.push(cultureInfo);
55
+ }
56
+
57
+ export function createCulture(cultureSpecs: Partial<CultureInfo>): ResolvedCultureInfo {
58
+ let current = getCurrentCulture();
59
+ let info: ResolvedCultureInfo = {
60
+ culture: current.culture,
61
+ dateEncoding: current.dateEncoding,
62
+ defaultCurrency: current.defaultCurrency,
63
+ cache: {},
64
+ };
65
+ for (let key in cultureSpecs) {
66
+ if (!(cultureSpecs as any)[key]) continue;
67
+ (info as any)[key] = (cultureSpecs as any)[key];
68
+ }
69
+ return info;
70
+ }
71
+
72
+ export function popCulture(cultureSpecs?: CultureInfo): CultureInfo | undefined {
73
+ if (stack.length == 1) throw new Error("Cannot pop the last culture object.");
74
+ if (cultureSpecs && stack[stack.length - 1] !== cultureSpecs) {
75
+ Console.warn("Popped culture object does not match the current one.");
76
+ }
77
+ return stack.pop();
78
+ }
79
+
80
+ export class Culture {
81
+ static setCulture(cultureCode: string): void {
82
+ let cultureSpecs = getDefaultCulture();
83
+ cultureSpecs.culture = cultureCode;
84
+ cultureSpecs.cache = {};
85
+ Localization.setCulture(cultureCode);
86
+ this.invalidateCache();
87
+ }
88
+
89
+ static setNumberCulture(cultureCode: string): void {
90
+ let cultureSpecs = getDefaultCulture();
91
+ cultureSpecs.numberCulture = cultureCode;
92
+ delete cultureSpecs.cache.numberCulture;
93
+ this.invalidateCache();
94
+ }
95
+
96
+ static setDateTimeCulture(cultureCode: string): void {
97
+ let cultureSpecs = getDefaultCulture();
98
+ cultureSpecs.dateTimeCulture = cultureCode;
99
+ delete cultureSpecs.cache.dateTimeCulture;
100
+ this.invalidateCache();
101
+ }
102
+
103
+ static setDefaultCurrency(currencyCode: string): void {
104
+ let cultureSpecs = getDefaultCulture();
105
+ cultureSpecs.defaultCurrency = currencyCode;
106
+ this.invalidateCache();
107
+ }
108
+
109
+ static setDefaultTimezone(timezone: string): void {
110
+ let cultureSpecs = getDefaultCulture();
111
+ cultureSpecs.timezone = timezone;
112
+ this.invalidateCache();
113
+ }
114
+
115
+ static setDefaultDateEncoding(encoding: (date: Date) => string): void {
116
+ let cultureSpecs = getDefaultCulture();
117
+ cultureSpecs.dateEncoding = encoding;
118
+ this.invalidateCache();
119
+ }
120
+
121
+ static invalidateCache(): void {
122
+ GlobalCacheIdentifier.change();
123
+ invalidateExpressionCache();
124
+ invalidateStringTemplateCache();
125
+ }
126
+
127
+ static get defaultCurrency(): string | undefined {
128
+ return getCurrentCulture().defaultCurrency;
129
+ }
130
+
131
+ static get culture(): string | undefined {
132
+ return getCurrentCulture().culture;
133
+ }
134
+
135
+ static getNumberCulture(): NumberCulture {
136
+ let { cache, numberCulture, culture } = getCurrentCulture();
137
+ if (!cache!.numberCulture) cache!.numberCulture = new NumberCulture(numberCulture ?? culture);
138
+ return cache!.numberCulture;
139
+ }
140
+
141
+ static getDateTimeCulture(): DateTimeCulture {
142
+ let { cache, dateTimeCulture, culture, timezone } = getCurrentCulture();
143
+ if (!cache!.dateTimeCulture)
144
+ cache!.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture, {
145
+ defaultTimezone: timezone,
146
+ });
147
+ return cache!.dateTimeCulture;
148
+ }
149
+
150
+ static getDefaultDateEncoding(): (date: Date) => string {
151
+ return getCurrentCulture().dateEncoding;
152
+ }
153
+
154
+ static getComparer(options?: Intl.CollatorOptions): (a: any, b: any) => number {
155
+ let { culture } = getCurrentCulture();
156
+ if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
157
+ return defaultCompare;
158
+ }
159
+ }