cx 26.0.12 → 26.0.14

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 (365) hide show
  1. package/build/charts/ScatterGraph.d.ts +4 -4
  2. package/build/charts/ScatterGraph.js +2 -2
  3. package/build/data/ArrayElementView.spec.d.ts +1 -0
  4. package/build/data/ArrayElementView.spec.js +81 -0
  5. package/build/data/Binding.spec.d.ts +1 -0
  6. package/build/data/Binding.spec.js +61 -0
  7. package/build/data/Expression.spec.d.ts +1 -0
  8. package/build/data/Expression.spec.js +196 -0
  9. package/build/data/Grouper.spec.d.ts +1 -0
  10. package/build/data/Grouper.spec.js +48 -0
  11. package/build/data/Ref.spec.d.ts +1 -0
  12. package/build/data/Ref.spec.js +72 -0
  13. package/build/data/Selector.d.ts +1 -1
  14. package/build/data/Store.spec.d.ts +1 -0
  15. package/build/data/Store.spec.js +19 -0
  16. package/build/data/StoreRef.spec.d.ts +1 -0
  17. package/build/data/StoreRef.spec.js +22 -0
  18. package/build/data/StringTemplate.spec.d.ts +1 -0
  19. package/build/data/StringTemplate.spec.js +112 -0
  20. package/build/data/StructuredSelector.spec.d.ts +1 -0
  21. package/build/data/StructuredSelector.spec.js +102 -0
  22. package/build/data/View.spec.d.ts +1 -0
  23. package/build/data/View.spec.js +44 -0
  24. package/build/data/ZoomIntoPropertyView.spec.d.ts +1 -0
  25. package/build/data/ZoomIntoPropertyView.spec.js +54 -0
  26. package/build/data/comparer.spec.d.ts +1 -0
  27. package/build/data/comparer.spec.js +50 -0
  28. package/build/data/computable.d.ts +3 -6
  29. package/build/data/computable.spec.d.ts +1 -0
  30. package/build/data/computable.spec.js +56 -0
  31. package/build/data/createAccessorModelProxy.d.ts +5 -3
  32. package/build/data/createAccessorModelProxy.spec.d.ts +1 -0
  33. package/build/data/createAccessorModelProxy.spec.js +30 -0
  34. package/build/data/createStructuredSelector.spec.d.ts +1 -0
  35. package/build/data/createStructuredSelector.spec.js +42 -0
  36. package/build/data/diff/diffs.spec.d.ts +1 -0
  37. package/build/data/diff/diffs.spec.js +45 -0
  38. package/build/data/getAccessor.spec.d.ts +1 -0
  39. package/build/data/getAccessor.spec.js +10 -0
  40. package/build/data/getSelector.spec.d.ts +1 -0
  41. package/build/data/getSelector.spec.js +36 -0
  42. package/build/data/ops/append.spec.d.ts +1 -0
  43. package/build/data/ops/append.spec.js +24 -0
  44. package/build/data/ops/filter.spec.d.ts +1 -0
  45. package/build/data/ops/filter.spec.js +25 -0
  46. package/build/data/ops/findTreeNode.d.ts +1 -1
  47. package/build/data/ops/findTreeNode.js +1 -1
  48. package/build/data/ops/findTreeNode.spec.d.ts +1 -0
  49. package/build/data/ops/findTreeNode.spec.js +20 -0
  50. package/build/data/ops/findTreePath.d.ts +1 -1
  51. package/build/data/ops/merge.spec.d.ts +1 -0
  52. package/build/data/ops/merge.spec.js +23 -0
  53. package/build/data/ops/removeTreeNodes.d.ts +1 -1
  54. package/build/data/ops/removeTreeNodes.js +1 -1
  55. package/build/data/ops/removeTreeNodes.spec.d.ts +1 -0
  56. package/build/data/ops/removeTreeNodes.spec.js +35 -0
  57. package/build/data/ops/updateArray.spec.d.ts +1 -0
  58. package/build/data/ops/updateArray.spec.js +33 -0
  59. package/build/data/ops/updateTree.d.ts +1 -1
  60. package/build/data/ops/updateTree.spec.d.ts +1 -0
  61. package/build/data/ops/updateTree.spec.js +44 -0
  62. package/build/hooks/invokeCallback.spec.d.ts +1 -0
  63. package/build/hooks/invokeCallback.spec.js +44 -0
  64. package/build/hooks/resolveCallback.spec.d.ts +1 -0
  65. package/build/hooks/resolveCallback.spec.js +35 -0
  66. package/build/hooks/store.spec.d.ts +1 -0
  67. package/build/hooks/store.spec.js +48 -0
  68. package/build/hooks/useTrigger.spec.d.ts +1 -0
  69. package/build/hooks/useTrigger.spec.js +59 -0
  70. package/build/jsx-runtime.d.ts +10 -10
  71. package/build/jsx-runtime.js +6 -0
  72. package/build/svg/util/Rect.d.ts +1 -1
  73. package/build/ui/ContentResolver.d.ts +16 -6
  74. package/build/ui/Controller.d.ts +7 -0
  75. package/build/ui/Controller.js +2 -1
  76. package/build/ui/Controller.spec.d.ts +1 -0
  77. package/build/ui/Controller.spec.js +247 -0
  78. package/build/ui/Cx.spec.d.ts +1 -0
  79. package/build/ui/Cx.spec.js +153 -0
  80. package/build/ui/DataProxy.spec.d.ts +1 -0
  81. package/build/ui/DataProxy.spec.js +208 -0
  82. package/build/ui/Instance.d.ts +1 -1
  83. package/build/ui/Instance.js +10 -10
  84. package/build/ui/IsolatedScope.spec.d.ts +1 -0
  85. package/build/ui/IsolatedScope.spec.js +42 -0
  86. package/build/ui/Prop.d.ts +12 -1
  87. package/build/ui/PureContainer.spec.d.ts +1 -0
  88. package/build/ui/PureContainer.spec.js +149 -0
  89. package/build/ui/Repeater.d.ts +3 -3
  90. package/build/ui/Repeater.spec.d.ts +1 -0
  91. package/build/ui/Repeater.spec.js +109 -0
  92. package/build/ui/Rescope.spec.d.ts +1 -0
  93. package/build/ui/Rescope.spec.js +134 -0
  94. package/build/ui/Restate.spec.d.ts +1 -0
  95. package/build/ui/Restate.spec.js +257 -0
  96. package/build/ui/Text.d.ts +14 -2
  97. package/build/ui/Text.js +3 -0
  98. package/build/ui/adapter/ArrayAdapter.js +4 -1
  99. package/build/ui/adapter/ArrayAdapter.spec.d.ts +1 -0
  100. package/build/ui/adapter/ArrayAdapter.spec.js +44 -0
  101. package/build/ui/adapter/TreeAdapter.spec.d.ts +1 -0
  102. package/build/ui/adapter/TreeAdapter.spec.js +71 -0
  103. package/build/ui/app/Url.spec.d.ts +1 -0
  104. package/build/ui/app/Url.spec.js +43 -0
  105. package/build/ui/app/startHotAppLoop.js +1 -1
  106. package/build/ui/createFunctionalComponent.d.ts +14 -1
  107. package/build/ui/createFunctionalComponent.js +7 -4
  108. package/build/ui/createFunctionalComponent.spec.d.ts +1 -0
  109. package/build/ui/createFunctionalComponent.spec.js +272 -0
  110. package/build/ui/expr.d.ts +3 -1
  111. package/build/ui/exprHelpers.d.ts +32 -0
  112. package/build/ui/exprHelpers.js +61 -0
  113. package/build/ui/index.d.ts +1 -0
  114. package/build/ui/index.js +1 -0
  115. package/build/ui/layout/ContentPlaceholder.spec.d.ts +1 -0
  116. package/build/ui/layout/ContentPlaceholder.spec.js +333 -0
  117. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +1 -0
  118. package/build/ui/layout/FirstVisibleChildLayout.spec.js +101 -0
  119. package/build/util/Console.d.ts +1 -0
  120. package/build/util/Console.js +7 -3
  121. package/build/util/Format.spec.d.ts +1 -0
  122. package/build/util/Format.spec.js +58 -0
  123. package/build/util/TraversalStack.spec.d.ts +1 -0
  124. package/build/util/TraversalStack.spec.js +43 -0
  125. package/build/util/date/upperBoundCheck.spec.d.ts +1 -0
  126. package/build/util/date/upperBoundCheck.spec.js +22 -0
  127. package/build/util/getSearchQueryPredicate.spec.d.ts +1 -0
  128. package/build/util/getSearchQueryPredicate.spec.js +33 -0
  129. package/build/util/isValidIdentifierName.spec.d.ts +1 -0
  130. package/build/util/isValidIdentifierName.spec.js +28 -0
  131. package/build/util/routeAppend.spec.d.ts +1 -0
  132. package/build/util/routeAppend.spec.js +14 -0
  133. package/build/widgets/AccessorBindings.spec.d.ts +1 -0
  134. package/build/widgets/AccessorBindings.spec.js +40 -0
  135. package/build/widgets/Button.d.ts +3 -6
  136. package/build/widgets/Button.js +1 -1
  137. package/build/widgets/DocumentTitle.d.ts +2 -0
  138. package/build/widgets/Heading.d.ts +2 -2
  139. package/build/widgets/HtmlElement.d.ts +31 -8
  140. package/build/widgets/HtmlElement.js +7 -9
  141. package/build/widgets/HtmlElement.spec.d.ts +1 -0
  142. package/build/widgets/HtmlElement.spec.js +38 -0
  143. package/build/widgets/Icon.d.ts +3 -13
  144. package/build/widgets/List.d.ts +4 -0
  145. package/build/widgets/ReactElementWrapper.d.ts +29 -0
  146. package/build/widgets/ReactElementWrapper.js +59 -0
  147. package/build/widgets/drag-drop/DragSource.d.ts +3 -3
  148. package/build/widgets/drag-drop/DragSource.js +2 -3
  149. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  150. package/build/widgets/drag-drop/DropZone.js +2 -3
  151. package/build/widgets/form/Checkbox.d.ts +2 -0
  152. package/build/widgets/form/ColorField.d.ts +2 -0
  153. package/build/widgets/form/DateTimeField.d.ts +2 -0
  154. package/build/widgets/form/Field.d.ts +0 -2
  155. package/build/widgets/form/LabeledContainer.d.ts +9 -8
  156. package/build/widgets/form/LabeledContainer.js +9 -9
  157. package/build/widgets/form/LookupField.d.ts +57 -9
  158. package/build/widgets/form/MonthField.d.ts +2 -0
  159. package/build/widgets/form/NumberField.d.ts +2 -0
  160. package/build/widgets/form/Radio.d.ts +2 -0
  161. package/build/widgets/form/Select.d.ts +2 -0
  162. package/build/widgets/form/Slider.d.ts +3 -0
  163. package/build/widgets/form/Switch.d.ts +2 -0
  164. package/build/widgets/form/TextField.d.ts +34 -0
  165. package/build/widgets/form/TimeList.d.ts +16 -1
  166. package/build/widgets/form/TimeList.js +34 -62
  167. package/build/widgets/form/UploadButton.d.ts +34 -2
  168. package/build/widgets/form/UploadButton.js +3 -1
  169. package/build/widgets/form/ValidationGroup.spec.d.ts +1 -0
  170. package/build/widgets/form/ValidationGroup.spec.js +62 -0
  171. package/build/widgets/form/Validator.d.ts +33 -2
  172. package/build/widgets/form/Validator.js +3 -0
  173. package/build/widgets/grid/Grid.d.ts +9 -9
  174. package/build/widgets/grid/TreeNode.d.ts +6 -0
  175. package/build/widgets/index.d.ts +1 -0
  176. package/build/widgets/index.js +1 -0
  177. package/build/widgets/nav/MenuItem.d.ts +3 -2
  178. package/build/widgets/nav/Route.spec.d.ts +1 -0
  179. package/build/widgets/nav/Route.spec.js +15 -0
  180. package/build/widgets/nav/Scroller.d.ts +4 -6
  181. package/build/widgets/nav/Scroller.js +6 -3
  182. package/build/widgets/nav/Tab.d.ts +2 -2
  183. package/build/widgets/overlay/ContextMenu.d.ts +3 -3
  184. package/build/widgets/overlay/Overlay.d.ts +2 -1
  185. package/build/widgets/overlay/Overlay.js +1 -1
  186. package/build/widgets/overlay/createHotPromiseWindowFactory.js +0 -1
  187. package/build.js +133 -133
  188. package/dist/data.js +2 -2
  189. package/dist/jsx-runtime.js +6 -1
  190. package/dist/manifest.d.ts +1443 -0
  191. package/dist/manifest.js +761 -713
  192. package/dist/ui.js +91 -5
  193. package/dist/util.js +3 -0
  194. package/dist/widgets.js +520 -162
  195. package/package.json +46 -20
  196. package/src/charts/Chart.ts +108 -108
  197. package/src/charts/ScatterGraph.tsx +6 -6
  198. package/src/data/ArrayElementView.ts +90 -90
  199. package/src/data/AugmentedViewBase.ts +88 -88
  200. package/src/data/Binding.ts +104 -104
  201. package/src/data/ExposedRecordView.ts +95 -95
  202. package/src/data/ExposedValueView.ts +89 -89
  203. package/src/data/Expression.spec.ts +229 -229
  204. package/src/data/Expression.ts +233 -233
  205. package/src/data/Grouper.spec.ts +57 -57
  206. package/src/data/Grouper.ts +158 -158
  207. package/src/data/NestedDataView.ts +43 -43
  208. package/src/data/ReadOnlyDataView.ts +39 -39
  209. package/src/data/Ref.ts +104 -104
  210. package/src/data/Selector.ts +10 -10
  211. package/src/data/Store.ts +52 -52
  212. package/src/data/StoreProxy.ts +19 -19
  213. package/src/data/StoreRef.ts +66 -66
  214. package/src/data/StringTemplate.spec.ts +132 -132
  215. package/src/data/StringTemplate.ts +93 -93
  216. package/src/data/StructuredSelector.spec.ts +113 -113
  217. package/src/data/StructuredSelector.ts +146 -146
  218. package/src/data/SubscribableView.ts +63 -63
  219. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  220. package/src/data/ZoomIntoPropertyView.ts +45 -45
  221. package/src/data/computable.spec.ts +87 -62
  222. package/src/data/computable.ts +3 -6
  223. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  224. package/src/data/createAccessorModelProxy.ts +9 -3
  225. package/src/data/createStructuredSelector.ts +62 -62
  226. package/src/data/getAccessor.spec.ts +11 -11
  227. package/src/data/getAccessor.ts +74 -74
  228. package/src/data/getSelector.spec.ts +43 -43
  229. package/src/data/getSelector.ts +66 -66
  230. package/src/data/ops/filter.spec.ts +35 -35
  231. package/src/data/ops/filter.ts +9 -9
  232. package/src/data/ops/findTreeNode.ts +1 -5
  233. package/src/data/ops/findTreePath.ts +1 -1
  234. package/src/data/ops/merge.ts +13 -13
  235. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  236. package/src/data/ops/removeTreeNodes.ts +2 -2
  237. package/src/data/ops/updateArray.spec.ts +69 -69
  238. package/src/data/ops/updateArray.ts +31 -31
  239. package/src/data/ops/updateTree.ts +1 -1
  240. package/src/data/test-types.ts +7 -7
  241. package/src/hooks/resolveCallback.spec.tsx +30 -7
  242. package/src/hooks/useTrigger.ts +26 -26
  243. package/src/index.scss +6 -6
  244. package/src/jsx-dev-runtime.ts +4 -4
  245. package/src/jsx-runtime.spec.tsx +431 -0
  246. package/src/jsx-runtime.ts +26 -22
  247. package/src/svg/BoundedObject.ts +101 -101
  248. package/src/svg/util/Rect.ts +105 -105
  249. package/src/ui/CSSHelper.ts +17 -17
  250. package/src/ui/ContentResolver.spec.tsx +172 -19
  251. package/src/ui/ContentResolver.ts +16 -8
  252. package/src/ui/Controller.ts +15 -2
  253. package/src/ui/Culture.ts +159 -159
  254. package/src/ui/DataProxy.ts +55 -55
  255. package/src/ui/FocusManager.ts +171 -171
  256. package/src/ui/Instance.ts +866 -868
  257. package/src/ui/Prop.ts +140 -112
  258. package/src/ui/RenderingContext.ts +99 -99
  259. package/src/ui/Repeater.ts +3 -12
  260. package/src/ui/Rescope.ts +49 -49
  261. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  262. package/src/ui/Text.ts +21 -2
  263. package/src/ui/VDOM.ts +34 -34
  264. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  265. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  266. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  267. package/src/ui/adapter/TreeAdapter.ts +185 -185
  268. package/src/ui/app/History.ts +133 -133
  269. package/src/ui/app/Url.spec.ts +50 -50
  270. package/src/ui/app/startHotAppLoop.ts +41 -41
  271. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  272. package/src/ui/createFunctionalComponent.ts +86 -65
  273. package/src/ui/expr.ts +4 -1
  274. package/src/ui/exprHelpers.spec.ts +379 -0
  275. package/src/ui/exprHelpers.ts +78 -0
  276. package/src/ui/index.ts +47 -46
  277. package/src/ui/layout/Content.ts +30 -30
  278. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  279. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  280. package/src/ui/selection/KeySelection.ts +153 -153
  281. package/src/ui/selection/Selection.ts +128 -128
  282. package/src/util/Console.ts +13 -11
  283. package/src/util/Format.spec.ts +41 -41
  284. package/src/util/Format.ts +267 -267
  285. package/src/util/addEventListenerWithOptions.ts +41 -41
  286. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  287. package/src/util/color/rgbToHsl.ts +35 -35
  288. package/src/util/getActiveElement.ts +4 -4
  289. package/src/util/hasKey.ts +18 -18
  290. package/src/util/index.ts +55 -55
  291. package/src/util/innerTextTrim.ts +10 -10
  292. package/src/util/isArray.ts +3 -3
  293. package/src/util/isDataRecord.ts +5 -5
  294. package/src/util/isDefined.ts +3 -3
  295. package/src/util/isString.ts +3 -3
  296. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  297. package/src/widgets/Button.tsx +5 -17
  298. package/src/widgets/DocumentTitle.ts +95 -92
  299. package/src/widgets/Heading.ts +2 -2
  300. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  301. package/src/widgets/HtmlElement.spec.tsx +20 -12
  302. package/src/widgets/HtmlElement.tsx +77 -23
  303. package/src/widgets/Icon.ts +3 -17
  304. package/src/widgets/List.tsx +6 -0
  305. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  306. package/src/widgets/ReactElementWrapper.tsx +108 -0
  307. package/src/widgets/Sandbox.ts +103 -103
  308. package/src/widgets/autoFocus.ts +9 -9
  309. package/src/widgets/cx.ts +63 -63
  310. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  311. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  312. package/src/widgets/form/Checkbox.tsx +3 -0
  313. package/src/widgets/form/ColorField.tsx +3 -0
  314. package/src/widgets/form/DateTimeField.tsx +5 -0
  315. package/src/widgets/form/Field.tsx +0 -3
  316. package/src/widgets/form/Label.tsx +1 -0
  317. package/src/widgets/form/LabeledContainer.ts +22 -26
  318. package/src/widgets/form/LookupField.spec.tsx +93 -0
  319. package/src/widgets/form/LookupField.tsx +104 -9
  320. package/src/widgets/form/MonthField.tsx +5 -0
  321. package/src/widgets/form/NumberField.tsx +3 -0
  322. package/src/widgets/form/Radio.tsx +5 -0
  323. package/src/widgets/form/Select.tsx +5 -0
  324. package/src/widgets/form/Slider.tsx +4 -0
  325. package/src/widgets/form/Switch.tsx +3 -0
  326. package/src/widgets/form/TextField.tsx +62 -0
  327. package/src/widgets/form/TimeList.tsx +84 -73
  328. package/src/widgets/form/UploadButton.tsx +53 -2
  329. package/src/widgets/form/Validator.ts +40 -3
  330. package/src/widgets/grid/Grid.tsx +9 -12
  331. package/src/widgets/grid/GridCell.ts +143 -143
  332. package/src/widgets/grid/TreeNode.tsx +9 -0
  333. package/src/widgets/icons/calendar.tsx +17 -17
  334. package/src/widgets/icons/check.tsx +13 -13
  335. package/src/widgets/icons/clear.tsx +15 -15
  336. package/src/widgets/icons/close.tsx +20 -20
  337. package/src/widgets/icons/cx.tsx +38 -38
  338. package/src/widgets/icons/drop-down.tsx +15 -15
  339. package/src/widgets/icons/file.tsx +13 -13
  340. package/src/widgets/icons/folder-open.tsx +15 -15
  341. package/src/widgets/icons/folder.tsx +13 -13
  342. package/src/widgets/icons/forward.tsx +22 -22
  343. package/src/widgets/icons/loading.tsx +24 -24
  344. package/src/widgets/icons/menu.tsx +17 -17
  345. package/src/widgets/icons/pixel-picker.tsx +18 -18
  346. package/src/widgets/icons/search.tsx +13 -13
  347. package/src/widgets/icons/sort-asc.tsx +14 -14
  348. package/src/widgets/icons/square.tsx +18 -18
  349. package/src/widgets/index.ts +1 -0
  350. package/src/widgets/nav/MenuItem.tsx +3 -2
  351. package/src/widgets/nav/Route.ts +142 -142
  352. package/src/widgets/nav/Scroller.tsx +8 -9
  353. package/src/widgets/nav/Tab.ts +2 -2
  354. package/src/widgets/overlay/ContextMenu.ts +42 -42
  355. package/src/widgets/overlay/Dropdown.tsx +762 -762
  356. package/src/widgets/overlay/MsgBox.tsx +141 -141
  357. package/src/widgets/overlay/Overlay.tsx +5 -4
  358. package/src/widgets/overlay/Toast.ts +111 -111
  359. package/src/widgets/overlay/Window.tsx +299 -299
  360. package/src/widgets/overlay/alerts.ts +46 -46
  361. package/src/widgets/overlay/captureMouse.ts +195 -195
  362. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +0 -1
  363. package/src/widgets/overlay/index.d.ts +11 -11
  364. package/src/widgets/overlay/index.ts +11 -11
  365. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -0,0 +1,247 @@
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
+ import { Store } from "../data/Store";
3
+ import { Controller } from "./Controller";
4
+ import { createTestRenderer } from "../util/test/createTestRenderer";
5
+ import { Widget } from "./Widget";
6
+ import { bind } from "./bind";
7
+ import assert from "assert";
8
+ describe("Controller", () => {
9
+ it("invokes lifetime methods", () => {
10
+ let init = 0, prepare = 0, explore = 0, cleanup = 0;
11
+ class TestController extends Controller {
12
+ onInit() {
13
+ init++;
14
+ }
15
+ onExplore() {
16
+ explore++;
17
+ }
18
+ onPrepare() {
19
+ prepare++;
20
+ }
21
+ onCleanup() {
22
+ cleanup++;
23
+ }
24
+ }
25
+ let store = new Store();
26
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController }) }));
27
+ let tree = component.toJSON();
28
+ assert.equal(init, 1);
29
+ assert.equal(explore, 1);
30
+ assert.equal(prepare, 1);
31
+ assert.equal(cleanup, 1);
32
+ });
33
+ it("widgets invoke controller methods specified as strings", () => {
34
+ let callback = 0;
35
+ class TestController extends Controller {
36
+ callback() {
37
+ ++callback;
38
+ }
39
+ }
40
+ class Cmp extends Widget {
41
+ render(context, instance, key) {
42
+ instance.invoke("onTest");
43
+ return null;
44
+ }
45
+ }
46
+ let store = new Store();
47
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx(Cmp, { controller: TestController, onTest: "callback" }) }));
48
+ let tree = component.toJSON();
49
+ assert.equal(callback, 1);
50
+ });
51
+ it("widgets can access controller methods specified in ancestor controllers", () => {
52
+ let callback1 = 0;
53
+ let callback2 = 0;
54
+ class TestController1 extends Controller {
55
+ callback1() {
56
+ ++callback1;
57
+ }
58
+ }
59
+ class TestController2 extends Controller {
60
+ callback2() {
61
+ ++callback2;
62
+ }
63
+ }
64
+ class Cmp extends Widget {
65
+ render(context, instance, key) {
66
+ instance.invoke("onTest");
67
+ return null;
68
+ }
69
+ }
70
+ let store = new Store();
71
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController1, children: _jsx(Cmp, { controller: TestController2, onTest: "callback1" }) }) }));
72
+ let tree = component.toJSON();
73
+ assert.equal(callback1, 1);
74
+ assert.equal(callback2, 0);
75
+ });
76
+ it("ancestor controllers are initialized first", () => {
77
+ let order = [];
78
+ class TestController1 extends Controller {
79
+ onInit() {
80
+ order.push("1");
81
+ }
82
+ }
83
+ class TestController2 extends Controller {
84
+ onInit() {
85
+ order.push("2");
86
+ }
87
+ }
88
+ let store = new Store();
89
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController1, children: _jsx("div", { controller: TestController2 }) }) }));
90
+ let tree = component.toJSON();
91
+ assert.deepEqual(order, ["1", "2"]);
92
+ });
93
+ it("controllers on invisible elements are not initialized", () => {
94
+ let order = [];
95
+ class TestController1 extends Controller {
96
+ onInit() {
97
+ order.push("1");
98
+ }
99
+ }
100
+ class TestController2 extends Controller {
101
+ onInit() {
102
+ order.push("2");
103
+ }
104
+ }
105
+ let store = new Store();
106
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController1, children: _jsx("div", { visible: false, controller: TestController2 }) }) }));
107
+ let tree = component.toJSON();
108
+ assert.deepEqual(order, ["1"]);
109
+ });
110
+ it("invokes triggers and computables in order of definition", () => {
111
+ let log = [];
112
+ class TestController extends Controller {
113
+ onInit() {
114
+ this.addTrigger("t1", [], () => {
115
+ log.push("t1");
116
+ }, true);
117
+ this.addComputable("c1", [], () => {
118
+ log.push("c1");
119
+ return null;
120
+ });
121
+ this.addTrigger("t2", [], () => {
122
+ log.push("t2");
123
+ }, true);
124
+ }
125
+ }
126
+ let store = new Store();
127
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController }) }));
128
+ let tree = component.toJSON();
129
+ assert.deepEqual(log, ["t1", "c1", "t2"]);
130
+ });
131
+ it("is recreated if a component is hidden and shown", () => {
132
+ let initCount = 0;
133
+ class TestController extends Controller {
134
+ onInit() {
135
+ initCount++;
136
+ }
137
+ }
138
+ let store = new Store();
139
+ store.set("visible", true);
140
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { visible: bind("visible"), controller: TestController }) }));
141
+ let tree1 = component.toJSON();
142
+ assert.equal(initCount, 1);
143
+ store.set("visible", false);
144
+ let tree2 = component.toJSON();
145
+ assert.equal(tree2, null);
146
+ store.set("visible", true);
147
+ let tree3 = component.toJSON();
148
+ assert.equal(initCount, 2);
149
+ });
150
+ it("allows creation through a factory", () => {
151
+ let store = new Store({ data: { x: 0 } });
152
+ const controllerFactory = ({ store }) => {
153
+ return {
154
+ increment() {
155
+ store.update("x", (x) => x + 1);
156
+ },
157
+ };
158
+ };
159
+ let c = Controller.create(controllerFactory, { store });
160
+ c.increment();
161
+ assert.equal(store.get("x"), 1);
162
+ });
163
+ it("lifetime methods of a functional controller are properly invoked", () => {
164
+ let initCount = 0, destroyCount = 0;
165
+ const testController = () => ({
166
+ onInit() {
167
+ initCount++;
168
+ },
169
+ onDestroy() {
170
+ destroyCount++;
171
+ },
172
+ });
173
+ let store = new Store();
174
+ store.set("visible", true);
175
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { visible: bind("visible"), controller: testController }) }));
176
+ let tree1 = component.toJSON();
177
+ assert.equal(initCount, 1);
178
+ store.set("visible", false);
179
+ let tree2 = component.toJSON();
180
+ assert.equal(destroyCount, 1);
181
+ store.set("visible", true);
182
+ let tree3 = component.toJSON();
183
+ assert.equal(initCount, 2);
184
+ });
185
+ it("widgets can easily define controller methods", () => {
186
+ let store = new Store({ data: { x: 0 } });
187
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: {
188
+ increment(count) {
189
+ this.store.update("x", (x) => x + count);
190
+ },
191
+ }, children: _jsx("div", { controller: {
192
+ onInit() {
193
+ this.invokeParentMethod("increment", 1);
194
+ },
195
+ } }) }) }));
196
+ let tree1 = component.toJSON();
197
+ assert.equal(store.get("x"), 1);
198
+ });
199
+ it("functional controllers get store methods through configuration", () => {
200
+ let store = new Store({ data: { x: 0 } });
201
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: ({ update }) => ({
202
+ increment(count) {
203
+ update("x", (x) => x + count);
204
+ },
205
+ }), children: _jsx("div", { controller: {
206
+ onInit() {
207
+ this.invokeParentMethod("increment", 1);
208
+ },
209
+ } }) }) }));
210
+ let tree1 = component.toJSON();
211
+ assert.equal(store.get("x"), 1);
212
+ });
213
+ it("addComputable accepts refs", () => {
214
+ let store = new Store({ data: { x: 0 } });
215
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: ({ ref }) => {
216
+ let x = ref("x");
217
+ return {
218
+ onInit() {
219
+ this.addComputable("y", [x], (x) => x + 1);
220
+ },
221
+ };
222
+ } }) }));
223
+ let tree1 = component.toJSON();
224
+ assert.equal(store.get("y"), 1);
225
+ });
226
+ it("invokeParentMethod is invoked on parent instance", () => {
227
+ let testValid = [];
228
+ class TestController1 extends Controller {
229
+ onInit() {
230
+ this.test();
231
+ }
232
+ test() {
233
+ testValid.push(1);
234
+ this.invokeParentMethod("test", 2);
235
+ }
236
+ }
237
+ class TestController2 extends Controller {
238
+ test(val) {
239
+ testValid.push(val);
240
+ }
241
+ }
242
+ let store = new Store();
243
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController2, children: _jsx("div", { controller: TestController1 }) }) }));
244
+ // let tree = component.toJSON();
245
+ assert.deepStrictEqual(testValid, [1, 2]);
246
+ });
247
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,153 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "cx/jsx-runtime";
2
+ import { VDOM } from "./VDOM";
3
+ import { ContainerBase } from "./Container";
4
+ import { Store } from "../data/Store";
5
+ import { bind } from "./bind";
6
+ import { createTestRenderer, createTestWidget } from "../util/test/createTestRenderer";
7
+ import assert from "assert";
8
+ describe("Cx", () => {
9
+ it("can render cx content", () => {
10
+ let widget = (_jsx("cx", { children: _jsx("div", { children: "Test" }) }));
11
+ let store = new Store();
12
+ const component = createTestRenderer(store, widget);
13
+ let tree = component.toJSON();
14
+ assert.deepEqual(tree, {
15
+ type: "div",
16
+ props: {},
17
+ children: ["Test"],
18
+ });
19
+ });
20
+ it("store changes preserve the instance", () => {
21
+ let instanceLog = [];
22
+ let storeLog = [];
23
+ let widget = (_jsx("cx", { children: _jsx("div", { text: bind("text"), onExplore: (context, instance) => {
24
+ instanceLog.push(instance);
25
+ storeLog.push(instance.store);
26
+ } }) }));
27
+ let store1 = new Store({ data: { text: "Test1" } });
28
+ let store2 = new Store({ data: { text: "Test2" } });
29
+ const component = createTestRenderer(store1, widget);
30
+ let tree1 = component.toJSON();
31
+ assert.deepEqual(tree1, {
32
+ type: "div",
33
+ props: {},
34
+ children: ["Test1"],
35
+ });
36
+ component.update(createTestWidget(store2, widget));
37
+ let tree2 = component.toJSON();
38
+ assert.deepEqual(tree2, {
39
+ type: "div",
40
+ props: {},
41
+ children: ["Test2"],
42
+ });
43
+ assert.equal(instanceLog.length, 2);
44
+ assert.equal(instanceLog[0], instanceLog[1]); //store changes should preserve the instance
45
+ assert(storeLog[0] === store1);
46
+ assert(storeLog[1] === store2);
47
+ });
48
+ it("invokes lifetime methods in the right order", () => {
49
+ let events = [];
50
+ class TestWidget extends ContainerBase {
51
+ explore(context, instance) {
52
+ super.explore(context, instance);
53
+ events.push(["explore", this.id]);
54
+ }
55
+ exploreCleanup(context, instance) {
56
+ //super.exploreCleanup(context, instance);
57
+ events.push(["exploreCleanup", this.id]);
58
+ }
59
+ prepare(context, instance) {
60
+ //super.prepare(context, instance);
61
+ events.push(["prepare", this.id]);
62
+ }
63
+ prepareCleanup(context, instance) {
64
+ //super.prepareCleanup(context, instance);
65
+ events.push(["prepareCleanup", this.id]);
66
+ }
67
+ render(context, instance, key) {
68
+ events.push(["render", this.id]);
69
+ return VDOM.createElement("div", { key }, this.renderChildren(context, instance));
70
+ }
71
+ }
72
+ let widget = (_jsx("cx", { children: _jsxs(TestWidget, { id: "0", children: [_jsx(TestWidget, { id: "0.0" }), _jsxs(TestWidget, { id: "0.1", children: [_jsx(TestWidget, { id: "0.1.0" }), _jsx(TestWidget, { id: "0.1.1" })] }), _jsx(TestWidget, { id: "0.2", children: _jsx(TestWidget, { id: "0.2.0" }) })] }) }));
73
+ let store = new Store();
74
+ const component = createTestRenderer(store, widget);
75
+ let tree = component.toJSON();
76
+ assert.deepEqual(tree, {
77
+ type: "div",
78
+ props: {},
79
+ children: [
80
+ {
81
+ type: "div",
82
+ props: {},
83
+ children: null,
84
+ },
85
+ {
86
+ type: "div",
87
+ props: {},
88
+ children: [
89
+ {
90
+ type: "div",
91
+ props: {},
92
+ children: null,
93
+ },
94
+ {
95
+ type: "div",
96
+ props: {},
97
+ children: null,
98
+ },
99
+ ],
100
+ },
101
+ {
102
+ type: "div",
103
+ props: {},
104
+ children: [
105
+ {
106
+ type: "div",
107
+ props: {},
108
+ children: null,
109
+ },
110
+ ],
111
+ },
112
+ ],
113
+ });
114
+ //console.log(events);
115
+ assert.deepEqual(events, [
116
+ ["explore", "0"],
117
+ ["explore", "0.0"],
118
+ ["exploreCleanup", "0.0"],
119
+ ["explore", "0.1"],
120
+ ["explore", "0.1.0"],
121
+ ["exploreCleanup", "0.1.0"],
122
+ ["explore", "0.1.1"],
123
+ ["exploreCleanup", "0.1.1"],
124
+ ["exploreCleanup", "0.1"],
125
+ ["explore", "0.2"],
126
+ ["explore", "0.2.0"],
127
+ ["exploreCleanup", "0.2.0"],
128
+ ["exploreCleanup", "0.2"],
129
+ ["exploreCleanup", "0"],
130
+ ["prepare", "0"],
131
+ ["prepare", "0.0"],
132
+ ["prepareCleanup", "0.0"],
133
+ ["prepare", "0.1"],
134
+ ["prepare", "0.1.0"],
135
+ ["prepareCleanup", "0.1.0"],
136
+ ["prepare", "0.1.1"],
137
+ ["prepareCleanup", "0.1.1"],
138
+ ["prepareCleanup", "0.1"],
139
+ ["prepare", "0.2"],
140
+ ["prepare", "0.2.0"],
141
+ ["prepareCleanup", "0.2.0"],
142
+ ["prepareCleanup", "0.2"],
143
+ ["prepareCleanup", "0"],
144
+ ["render", "0.2.0"],
145
+ ["render", "0.2"],
146
+ ["render", "0.1.1"],
147
+ ["render", "0.1.0"],
148
+ ["render", "0.1"],
149
+ ["render", "0.0"],
150
+ ["render", "0"],
151
+ ]);
152
+ });
153
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,208 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "cx/jsx-runtime";
2
+ import { Store } from "../data/Store";
3
+ import { createTestRenderer } from "../util/test/createTestRenderer";
4
+ import assert from "assert";
5
+ import { Controller } from "./Controller";
6
+ import { DataProxy } from "./DataProxy";
7
+ import { computable } from "../data/computable";
8
+ import { useState } from "../hooks";
9
+ import { createFunctionalComponent } from "./createFunctionalComponent";
10
+ import { Widget } from "./Widget";
11
+ import { bind } from "./bind";
12
+ import { tpl } from "./tpl";
13
+ describe("DataProxy", () => {
14
+ it("can calculate values", () => {
15
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { data: {
16
+ $value: { bind: "value" },
17
+ }, children: _jsx("span", { text: bind("$value") }) }) }));
18
+ let store = new Store({
19
+ data: {
20
+ value: "good",
21
+ },
22
+ });
23
+ const component = createTestRenderer(store, widget);
24
+ let tree = component.toJSON();
25
+ assert.deepEqual(tree, {
26
+ type: "span",
27
+ props: {},
28
+ children: ["good"],
29
+ });
30
+ });
31
+ it("can write into values aliased with bind", () => {
32
+ class TestController extends Controller {
33
+ onInit() {
34
+ this.store.set("$value", "excellent");
35
+ }
36
+ }
37
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { data: {
38
+ $value: { bind: "value" },
39
+ }, controller: TestController, children: _jsx("span", { text: bind("$value") }) }) }));
40
+ let store = new Store({
41
+ data: {
42
+ value: "good",
43
+ },
44
+ });
45
+ const component = createTestRenderer(store, widget);
46
+ let tree = component.toJSON();
47
+ assert(store.get("value"), "excellent");
48
+ assert.deepEqual(tree, {
49
+ type: "span",
50
+ props: {},
51
+ children: ["excellent"],
52
+ });
53
+ });
54
+ it("can write into aliased values using provided setters", () => {
55
+ class TestController extends Controller {
56
+ onInit() {
57
+ this.store.set("$value", "excellent");
58
+ }
59
+ }
60
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { data: {
61
+ $value: {
62
+ expr: computable("value", (value) => value),
63
+ set: (value, { store }) => {
64
+ store.set("value", value);
65
+ },
66
+ },
67
+ }, controller: TestController, children: _jsx("span", { text: bind("$value") }) }) }));
68
+ let store = new Store({
69
+ data: {
70
+ value: "good",
71
+ },
72
+ });
73
+ const component = createTestRenderer(store, widget);
74
+ let tree = component.toJSON();
75
+ assert(store.get("value"), "excellent");
76
+ assert.deepEqual(tree, {
77
+ type: "span",
78
+ props: {},
79
+ children: ["excellent"],
80
+ });
81
+ });
82
+ it("allows shorter syntax", () => {
83
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { alias: "$value", value: bind("value"), children: _jsx("span", { text: bind("$value") }) }) }));
84
+ let store = new Store({
85
+ data: {
86
+ value: "good",
87
+ },
88
+ });
89
+ const component = createTestRenderer(store, widget);
90
+ let tree = component.toJSON();
91
+ assert.deepEqual(tree, {
92
+ type: "span",
93
+ props: {},
94
+ children: ["good"],
95
+ });
96
+ });
97
+ it("correctly updates aliased data after write", () => {
98
+ class TestController extends Controller {
99
+ onInit() {
100
+ this.store.set("$value", "excellent");
101
+ assert.equal(this.store.get("$value"), "excellent");
102
+ }
103
+ }
104
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { data: {
105
+ $value: { bind: "value" },
106
+ }, controller: TestController, children: _jsx("span", { text: bind("$value") }) }) }));
107
+ let store = new Store({
108
+ data: {
109
+ value: "good",
110
+ },
111
+ });
112
+ const component = createTestRenderer(store, widget);
113
+ let tree = component.toJSON();
114
+ assert(store.get("value"), "excellent");
115
+ assert.deepEqual(tree, {
116
+ type: "span",
117
+ props: {},
118
+ children: ["excellent"],
119
+ });
120
+ });
121
+ it("properly binds structures", () => {
122
+ class TestController extends Controller {
123
+ onInit() {
124
+ this.store.set("$person.firstName", "Jim");
125
+ }
126
+ }
127
+ let widget = (_jsx("cx", { children: _jsx(DataProxy, { data: {
128
+ $person: { bind: "person" },
129
+ }, controller: TestController, children: _jsx("span", { text: tpl("{$person.firstName} {$person.lastName}") }) }) }));
130
+ let store = new Store({
131
+ data: {
132
+ person: { firstName: "John", lastName: "Smith" },
133
+ },
134
+ });
135
+ const component = createTestRenderer(store, widget);
136
+ let tree = component.toJSON();
137
+ assert(store.get("person.firstName"), "Jim");
138
+ assert.deepEqual(tree, {
139
+ type: "span",
140
+ props: {},
141
+ children: ["Jim Smith"],
142
+ });
143
+ });
144
+ it("works with Store refs", () => {
145
+ let widget = createFunctionalComponent(() => {
146
+ let valueRef = useState("a");
147
+ return (_jsx("cx", { children: _jsx(DataProxy, { data: {
148
+ $value: valueRef,
149
+ }, children: _jsx("span", { text: bind("$value"), controller: {
150
+ onInit() {
151
+ valueRef.set("b");
152
+ },
153
+ } }) }) }));
154
+ });
155
+ let store = new Store({
156
+ data: {
157
+ //value: "good"
158
+ },
159
+ });
160
+ const component = createTestRenderer(store, widget);
161
+ let tree = component.toJSON();
162
+ assert.deepEqual(tree, {
163
+ type: "span",
164
+ props: {},
165
+ children: ["b"],
166
+ });
167
+ });
168
+ it("controllers set on the DataProxy can see calculated values", () => {
169
+ let value;
170
+ let widget = Widget.create(_jsx("cx", { children: _jsx(DataProxy, { data: {
171
+ $value: 5,
172
+ }, controller: {
173
+ onInit() {
174
+ value = this.store.get("$value");
175
+ },
176
+ } }) }));
177
+ let store = new Store();
178
+ const component = createTestRenderer(store, widget);
179
+ let tree = component.toJSON();
180
+ assert.equal(value, 5);
181
+ });
182
+ it("correctly propagates undefined values over a previous value (bug)", () => {
183
+ let widget = (_jsxs("cx", { children: [_jsx(DataProxy, { data: {
184
+ $value: { bind: "value" },
185
+ }, children: _jsx("span", { text: bind("$value") }) }), _jsx(DataProxy, { data: {
186
+ $value: { bind: "dummy" },
187
+ }, children: _jsx("span", { text: bind("$value") }) })] }));
188
+ let store = new Store({
189
+ data: {
190
+ value: "initial",
191
+ },
192
+ });
193
+ const component = createTestRenderer(store, widget);
194
+ let tree = component.toJSON();
195
+ assert.deepEqual(tree, [
196
+ {
197
+ type: "span",
198
+ props: {},
199
+ children: ["initial"],
200
+ },
201
+ {
202
+ type: "span",
203
+ props: {},
204
+ children: null,
205
+ },
206
+ ]);
207
+ });
208
+ });
@@ -1,7 +1,7 @@
1
+ import { View } from "../data/View";
1
2
  import { Controller } from "./Controller";
2
3
  import { RenderingContext } from "./RenderingContext";
3
4
  import type { Widget } from "./Widget";
4
- import { View } from "../data/View";
5
5
  /**
6
6
  * Serializable value types that can be safely passed through the framework
7
7
  */
@@ -1,17 +1,17 @@
1
- import { Controller } from "./Controller";
2
- import { debug, renderFlag, processDataFlag, destroyFlag } from "../util/Debug";
1
+ import { isAccessorChain } from "../data/createAccessorModelProxy";
2
+ import { debug, destroyFlag, processDataFlag, renderFlag } from "../util/Debug";
3
3
  import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
4
- import { throttle } from "../util/throttle";
5
- import { validatedDebounce } from "../util/validatedDebounce";
6
- import { batchUpdates } from "./batchUpdates";
7
- import { isString } from "../util/isString";
8
- import { isFunction } from "../util/isFunction";
9
- import { isDefined } from "../util/isDefined";
10
4
  import { isArray } from "../util/isArray";
11
- import { isObject } from "../util/isObject";
5
+ import { isDefined } from "../util/isDefined";
6
+ import { isFunction } from "../util/isFunction";
12
7
  import { isNonEmptyArray } from "../util/isNonEmptyArray";
8
+ import { isObject } from "../util/isObject";
9
+ import { isString } from "../util/isString";
13
10
  import { isUndefined } from "../util/isUndefined";
14
- import { isAccessorChain } from "../data/createAccessorModelProxy";
11
+ import { throttle } from "../util/throttle";
12
+ import { validatedDebounce } from "../util/validatedDebounce";
13
+ import { batchUpdates } from "./batchUpdates";
14
+ import { Controller } from "./Controller";
15
15
  let instanceId = 1000;
16
16
  /**
17
17
  * Base Instance class
@@ -0,0 +1 @@
1
+ export {};