cx 26.0.11 → 26.0.13

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 (366) 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/ui/selection/KeySelection.d.ts +0 -8
  120. package/build/ui/selection/Selection.d.ts +9 -3
  121. package/build/util/Console.d.ts +1 -0
  122. package/build/util/Console.js +7 -3
  123. package/build/util/Format.spec.d.ts +1 -0
  124. package/build/util/Format.spec.js +58 -0
  125. package/build/util/TraversalStack.spec.d.ts +1 -0
  126. package/build/util/TraversalStack.spec.js +43 -0
  127. package/build/util/date/upperBoundCheck.spec.d.ts +1 -0
  128. package/build/util/date/upperBoundCheck.spec.js +22 -0
  129. package/build/util/getSearchQueryPredicate.spec.d.ts +1 -0
  130. package/build/util/getSearchQueryPredicate.spec.js +33 -0
  131. package/build/util/isValidIdentifierName.spec.d.ts +1 -0
  132. package/build/util/isValidIdentifierName.spec.js +28 -0
  133. package/build/util/routeAppend.spec.d.ts +1 -0
  134. package/build/util/routeAppend.spec.js +14 -0
  135. package/build/widgets/AccessorBindings.spec.d.ts +1 -0
  136. package/build/widgets/AccessorBindings.spec.js +40 -0
  137. package/build/widgets/Button.d.ts +3 -6
  138. package/build/widgets/Button.js +1 -1
  139. package/build/widgets/DocumentTitle.d.ts +2 -0
  140. package/build/widgets/Heading.d.ts +2 -2
  141. package/build/widgets/HtmlElement.d.ts +33 -8
  142. package/build/widgets/HtmlElement.js +7 -9
  143. package/build/widgets/HtmlElement.spec.d.ts +1 -0
  144. package/build/widgets/HtmlElement.spec.js +38 -0
  145. package/build/widgets/Icon.d.ts +3 -13
  146. package/build/widgets/List.d.ts +4 -0
  147. package/build/widgets/ReactElementWrapper.d.ts +29 -0
  148. package/build/widgets/ReactElementWrapper.js +59 -0
  149. package/build/widgets/drag-drop/DragSource.d.ts +3 -3
  150. package/build/widgets/drag-drop/DragSource.js +2 -3
  151. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  152. package/build/widgets/drag-drop/DropZone.js +2 -3
  153. package/build/widgets/form/Checkbox.d.ts +2 -0
  154. package/build/widgets/form/ColorField.d.ts +2 -0
  155. package/build/widgets/form/DateTimeField.d.ts +2 -0
  156. package/build/widgets/form/Field.d.ts +0 -2
  157. package/build/widgets/form/LabeledContainer.d.ts +9 -8
  158. package/build/widgets/form/LabeledContainer.js +9 -9
  159. package/build/widgets/form/LookupField.d.ts +57 -9
  160. package/build/widgets/form/MonthField.d.ts +2 -0
  161. package/build/widgets/form/NumberField.d.ts +2 -0
  162. package/build/widgets/form/Radio.d.ts +2 -0
  163. package/build/widgets/form/Select.d.ts +2 -0
  164. package/build/widgets/form/Slider.d.ts +3 -0
  165. package/build/widgets/form/Switch.d.ts +2 -0
  166. package/build/widgets/form/TextField.d.ts +34 -0
  167. package/build/widgets/form/TimeList.d.ts +16 -1
  168. package/build/widgets/form/TimeList.js +34 -62
  169. package/build/widgets/form/UploadButton.d.ts +34 -2
  170. package/build/widgets/form/UploadButton.js +3 -1
  171. package/build/widgets/form/ValidationGroup.spec.d.ts +1 -0
  172. package/build/widgets/form/ValidationGroup.spec.js +62 -0
  173. package/build/widgets/form/Validator.d.ts +33 -2
  174. package/build/widgets/form/Validator.js +3 -0
  175. package/build/widgets/grid/Grid.d.ts +9 -9
  176. package/build/widgets/grid/TreeNode.d.ts +6 -0
  177. package/build/widgets/index.d.ts +1 -0
  178. package/build/widgets/index.js +1 -0
  179. package/build/widgets/nav/MenuItem.d.ts +3 -2
  180. package/build/widgets/nav/Route.spec.d.ts +1 -0
  181. package/build/widgets/nav/Route.spec.js +15 -0
  182. package/build/widgets/nav/Scroller.d.ts +4 -6
  183. package/build/widgets/nav/Scroller.js +6 -3
  184. package/build/widgets/nav/Tab.d.ts +2 -2
  185. package/build/widgets/overlay/ContextMenu.d.ts +3 -3
  186. package/build/widgets/overlay/Overlay.d.ts +2 -1
  187. package/build/widgets/overlay/Overlay.js +1 -1
  188. package/build.js +133 -133
  189. package/dist/data.js +2 -2
  190. package/dist/jsx-runtime.js +6 -1
  191. package/dist/manifest.d.ts +1443 -0
  192. package/dist/manifest.js +852 -804
  193. package/dist/ui.js +91 -5
  194. package/dist/util.js +3 -0
  195. package/dist/widgets.js +520 -161
  196. package/package.json +46 -20
  197. package/src/charts/Chart.ts +108 -108
  198. package/src/charts/ScatterGraph.tsx +6 -6
  199. package/src/data/ArrayElementView.ts +90 -90
  200. package/src/data/AugmentedViewBase.ts +88 -88
  201. package/src/data/Binding.ts +104 -104
  202. package/src/data/ExposedRecordView.ts +95 -95
  203. package/src/data/ExposedValueView.ts +89 -89
  204. package/src/data/Expression.spec.ts +229 -229
  205. package/src/data/Expression.ts +233 -233
  206. package/src/data/Grouper.spec.ts +57 -57
  207. package/src/data/Grouper.ts +158 -158
  208. package/src/data/NestedDataView.ts +43 -43
  209. package/src/data/ReadOnlyDataView.ts +39 -39
  210. package/src/data/Ref.ts +104 -104
  211. package/src/data/Selector.ts +10 -10
  212. package/src/data/Store.ts +52 -52
  213. package/src/data/StoreProxy.ts +19 -19
  214. package/src/data/StoreRef.ts +66 -66
  215. package/src/data/StringTemplate.spec.ts +132 -132
  216. package/src/data/StringTemplate.ts +93 -93
  217. package/src/data/StructuredSelector.spec.ts +113 -113
  218. package/src/data/StructuredSelector.ts +146 -146
  219. package/src/data/SubscribableView.ts +63 -63
  220. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  221. package/src/data/ZoomIntoPropertyView.ts +45 -45
  222. package/src/data/computable.spec.ts +87 -62
  223. package/src/data/computable.ts +3 -6
  224. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  225. package/src/data/createAccessorModelProxy.ts +9 -3
  226. package/src/data/createStructuredSelector.ts +62 -62
  227. package/src/data/getAccessor.spec.ts +11 -11
  228. package/src/data/getAccessor.ts +74 -74
  229. package/src/data/getSelector.spec.ts +43 -43
  230. package/src/data/getSelector.ts +66 -66
  231. package/src/data/ops/filter.spec.ts +35 -35
  232. package/src/data/ops/filter.ts +9 -9
  233. package/src/data/ops/findTreeNode.ts +1 -5
  234. package/src/data/ops/findTreePath.ts +1 -1
  235. package/src/data/ops/merge.ts +13 -13
  236. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  237. package/src/data/ops/removeTreeNodes.ts +2 -2
  238. package/src/data/ops/updateArray.spec.ts +69 -69
  239. package/src/data/ops/updateArray.ts +31 -31
  240. package/src/data/ops/updateTree.ts +1 -1
  241. package/src/data/test-types.ts +7 -7
  242. package/src/hooks/resolveCallback.spec.tsx +30 -7
  243. package/src/hooks/useTrigger.ts +26 -26
  244. package/src/index.scss +6 -6
  245. package/src/jsx-dev-runtime.ts +4 -4
  246. package/src/jsx-runtime.spec.tsx +402 -0
  247. package/src/jsx-runtime.ts +26 -22
  248. package/src/svg/BoundedObject.ts +101 -101
  249. package/src/svg/util/Rect.ts +105 -105
  250. package/src/ui/CSSHelper.ts +17 -17
  251. package/src/ui/ContentResolver.spec.tsx +172 -19
  252. package/src/ui/ContentResolver.ts +16 -8
  253. package/src/ui/Controller.ts +15 -2
  254. package/src/ui/Culture.ts +159 -159
  255. package/src/ui/DataProxy.ts +55 -55
  256. package/src/ui/FocusManager.ts +171 -171
  257. package/src/ui/Instance.ts +866 -868
  258. package/src/ui/Prop.ts +140 -112
  259. package/src/ui/RenderingContext.ts +99 -99
  260. package/src/ui/Repeater.ts +3 -12
  261. package/src/ui/Rescope.ts +49 -49
  262. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  263. package/src/ui/Text.ts +21 -2
  264. package/src/ui/VDOM.ts +34 -34
  265. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  266. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  267. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  268. package/src/ui/adapter/TreeAdapter.ts +185 -185
  269. package/src/ui/app/History.ts +133 -133
  270. package/src/ui/app/Url.spec.ts +50 -50
  271. package/src/ui/app/startHotAppLoop.ts +41 -41
  272. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  273. package/src/ui/createFunctionalComponent.ts +86 -65
  274. package/src/ui/expr.ts +4 -1
  275. package/src/ui/exprHelpers.spec.ts +379 -0
  276. package/src/ui/exprHelpers.ts +78 -0
  277. package/src/ui/index.ts +47 -46
  278. package/src/ui/layout/Content.ts +30 -30
  279. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  280. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  281. package/src/ui/selection/KeySelection.ts +0 -12
  282. package/src/ui/selection/PropertySelection.ts +87 -87
  283. package/src/ui/selection/Selection.ts +13 -3
  284. package/src/util/Console.ts +13 -11
  285. package/src/util/Format.ts +267 -267
  286. package/src/util/addEventListenerWithOptions.ts +41 -41
  287. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  288. package/src/util/color/rgbToHsl.ts +35 -35
  289. package/src/util/getActiveElement.ts +4 -4
  290. package/src/util/hasKey.ts +18 -18
  291. package/src/util/index.ts +55 -55
  292. package/src/util/innerTextTrim.ts +10 -10
  293. package/src/util/isArray.ts +3 -3
  294. package/src/util/isDataRecord.ts +5 -5
  295. package/src/util/isDefined.ts +3 -3
  296. package/src/util/isString.ts +3 -3
  297. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  298. package/src/widgets/Button.tsx +5 -17
  299. package/src/widgets/DocumentTitle.ts +95 -92
  300. package/src/widgets/Heading.ts +2 -2
  301. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  302. package/src/widgets/HtmlElement.spec.tsx +20 -12
  303. package/src/widgets/HtmlElement.tsx +82 -24
  304. package/src/widgets/Icon.ts +3 -17
  305. package/src/widgets/List.tsx +6 -0
  306. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  307. package/src/widgets/ReactElementWrapper.tsx +108 -0
  308. package/src/widgets/Sandbox.ts +103 -103
  309. package/src/widgets/autoFocus.ts +9 -9
  310. package/src/widgets/cx.ts +63 -63
  311. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  312. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  313. package/src/widgets/form/Checkbox.tsx +3 -0
  314. package/src/widgets/form/ColorField.tsx +3 -0
  315. package/src/widgets/form/DateTimeField.tsx +5 -0
  316. package/src/widgets/form/Field.tsx +0 -3
  317. package/src/widgets/form/Label.tsx +1 -0
  318. package/src/widgets/form/LabeledContainer.ts +22 -26
  319. package/src/widgets/form/LookupField.spec.tsx +93 -0
  320. package/src/widgets/form/LookupField.tsx +104 -9
  321. package/src/widgets/form/MonthField.tsx +5 -0
  322. package/src/widgets/form/NumberField.tsx +3 -0
  323. package/src/widgets/form/Radio.tsx +5 -0
  324. package/src/widgets/form/Select.tsx +5 -0
  325. package/src/widgets/form/Slider.tsx +4 -0
  326. package/src/widgets/form/Switch.tsx +3 -0
  327. package/src/widgets/form/TextField.tsx +62 -0
  328. package/src/widgets/form/TimeList.tsx +84 -73
  329. package/src/widgets/form/UploadButton.tsx +53 -2
  330. package/src/widgets/form/Validator.ts +40 -3
  331. package/src/widgets/grid/Grid.tsx +9 -12
  332. package/src/widgets/grid/GridCell.ts +143 -143
  333. package/src/widgets/grid/TreeNode.tsx +9 -0
  334. package/src/widgets/icons/calendar.tsx +17 -17
  335. package/src/widgets/icons/check.tsx +13 -13
  336. package/src/widgets/icons/clear.tsx +15 -15
  337. package/src/widgets/icons/close.tsx +20 -20
  338. package/src/widgets/icons/cx.tsx +38 -38
  339. package/src/widgets/icons/drop-down.tsx +15 -15
  340. package/src/widgets/icons/file.tsx +13 -13
  341. package/src/widgets/icons/folder-open.tsx +15 -15
  342. package/src/widgets/icons/folder.tsx +13 -13
  343. package/src/widgets/icons/forward.tsx +22 -22
  344. package/src/widgets/icons/loading.tsx +24 -24
  345. package/src/widgets/icons/menu.tsx +17 -17
  346. package/src/widgets/icons/pixel-picker.tsx +18 -18
  347. package/src/widgets/icons/search.tsx +13 -13
  348. package/src/widgets/icons/sort-asc.tsx +14 -14
  349. package/src/widgets/icons/square.tsx +18 -18
  350. package/src/widgets/index.ts +1 -0
  351. package/src/widgets/nav/MenuItem.tsx +3 -2
  352. package/src/widgets/nav/Route.ts +142 -142
  353. package/src/widgets/nav/Scroller.tsx +8 -9
  354. package/src/widgets/nav/Tab.ts +2 -2
  355. package/src/widgets/overlay/ContextMenu.ts +42 -42
  356. package/src/widgets/overlay/Dropdown.tsx +762 -762
  357. package/src/widgets/overlay/MsgBox.tsx +141 -141
  358. package/src/widgets/overlay/Overlay.tsx +5 -4
  359. package/src/widgets/overlay/Toast.ts +111 -111
  360. package/src/widgets/overlay/Window.tsx +299 -299
  361. package/src/widgets/overlay/alerts.ts +46 -46
  362. package/src/widgets/overlay/captureMouse.ts +195 -195
  363. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  364. package/src/widgets/overlay/index.d.ts +11 -11
  365. package/src/widgets/overlay/index.ts +11 -11
  366. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -0,0 +1,24 @@
1
+ import assert from 'assert';
2
+ import { Store } from '../Store';
3
+ import { append } from './append';
4
+ describe('append', function () {
5
+ it('should add elements to an array', function () {
6
+ let store = new Store({
7
+ data: {
8
+ array: []
9
+ }
10
+ });
11
+ assert(store.update('array', append, 1));
12
+ assert.deepEqual(store.get('array'), [1]);
13
+ });
14
+ it('should work with undefined arrays', function () {
15
+ let store = new Store();
16
+ assert(store.update('array', append, 1));
17
+ assert.deepEqual(store.get('array'), [1]);
18
+ });
19
+ it('accepts multiple arguments', function () {
20
+ let store = new Store();
21
+ assert(store.update('array', append, 1, 2, 3));
22
+ assert.deepEqual(store.get('array'), [1, 2, 3]);
23
+ });
24
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import assert from "assert";
2
+ import { Store } from "../Store";
3
+ import { filter } from "./filter";
4
+ describe("filter", function () {
5
+ it("should filter array elements", function () {
6
+ let store = new Store({
7
+ data: {
8
+ array: [1, 2, 3],
9
+ },
10
+ });
11
+ assert(store.update("array", filter, (x) => x > 1));
12
+ assert.deepEqual(store.get("array"), [2, 3]);
13
+ });
14
+ it("should work with undefined arrays", function () {
15
+ let store = new Store();
16
+ assert.equal(false, store.update("array", filter, (x) => x > 1));
17
+ assert.deepEqual(store.get("array"), undefined);
18
+ });
19
+ it("returns same array if all elements satisfy condition", function () {
20
+ let array = [1, 2, 3];
21
+ let store = new Store({ data: { array } });
22
+ assert.equal(false, store.update("array", filter, (x) => x > 0));
23
+ assert(store.get("array") === array);
24
+ });
25
+ });
@@ -1 +1 @@
1
- export declare function findTreeNode<T extends Record<string, any>>(array: T[], criteria: (node: T) => boolean, childrenField?: keyof T): T | false;
1
+ export declare function findTreeNode<T = any>(array: T[], criteria: (node: T) => boolean, childrenField: keyof T): T | false;
@@ -1,4 +1,4 @@
1
- export function findTreeNode(array, criteria, childrenField = "$children") {
1
+ export function findTreeNode(array, criteria, childrenField) {
2
2
  if (!Array.isArray(array))
3
3
  return false;
4
4
  for (const node of array) {
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import assert from 'assert';
2
+ import { findTreeNode } from './findTreeNode';
3
+ describe('removeTreeNodes', function () {
4
+ it('removes all nodes that satisfy criteria', function () {
5
+ let array = [{
6
+ id: 'n1',
7
+ value: 1,
8
+ children: [{
9
+ id: 'n11',
10
+ value: 2
11
+ }, {
12
+ id: 'n12',
13
+ value: 3
14
+ }]
15
+ }];
16
+ let node = findTreeNode(array, x => x.value == 3, 'children');
17
+ assert(node);
18
+ assert.equal(node.value, 3);
19
+ });
20
+ });
@@ -1 +1 @@
1
- export declare function findTreePath<T extends Record<string, any>>(array: T[] | undefined, criteria: (node: T) => boolean, childrenField?: keyof T, currentPath?: T[]): T[] | false;
1
+ export declare function findTreePath<T = any>(array: T[] | undefined, criteria: (node: T) => boolean, childrenField?: keyof T, currentPath?: T[]): T[] | false;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { Store } from "../Store";
2
+ import { merge } from "./merge";
3
+ import assert from "assert";
4
+ describe("merge", function () {
5
+ it("performs multiple set operations", function () {
6
+ let store = new Store({
7
+ data: {
8
+ person: { firstName: "John", lastName: "Doe" },
9
+ },
10
+ });
11
+ assert(store.update("person", merge, { firstName: "Johny", age: 18 }));
12
+ assert.deepEqual(store.get("person"), { firstName: "Johny", lastName: "Doe", age: 18 });
13
+ });
14
+ it("does not modify data if not necessary", function () {
15
+ let store = new Store({
16
+ data: {
17
+ person: { firstName: "John", lastName: "Doe" },
18
+ },
19
+ });
20
+ assert(store.update("person", merge, { firstName: "John" }) == false);
21
+ assert.deepEqual(store.get("person"), { firstName: "John", lastName: "Doe" });
22
+ });
23
+ });
@@ -1 +1 @@
1
- export declare function removeTreeNodes<T extends Record<string, any>>(array: T[] | undefined, criteria: (node: T) => boolean, childrenField?: keyof T): T[] | undefined;
1
+ export declare function removeTreeNodes<T = any>(array: T[] | undefined, criteria: (node: T) => boolean, childrenField: keyof T): T[] | undefined;
@@ -1,4 +1,4 @@
1
1
  import { updateTree } from "./updateTree";
2
- export function removeTreeNodes(array, criteria, childrenField = "$children") {
2
+ export function removeTreeNodes(array, criteria, childrenField) {
3
3
  return updateTree(array, (x) => x, () => false, childrenField, criteria);
4
4
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import { Store } from "../Store";
2
+ import { removeTreeNodes } from "./removeTreeNodes";
3
+ import assert from "assert";
4
+ describe("removeTreeNodes", function () {
5
+ it("removes all nodes that satisfy criteria", function () {
6
+ let store = new Store({
7
+ data: {
8
+ array: [
9
+ {
10
+ id: "n1",
11
+ value: 1,
12
+ children: [
13
+ {
14
+ id: "n11",
15
+ value: 2,
16
+ },
17
+ {
18
+ id: "n12",
19
+ value: 3,
20
+ },
21
+ ],
22
+ },
23
+ ],
24
+ },
25
+ });
26
+ assert(store.update("array", removeTreeNodes, (x) => x.value > 1, "children"));
27
+ assert.deepEqual(store.get("array"), [
28
+ {
29
+ id: "n1",
30
+ value: 1,
31
+ children: [],
32
+ },
33
+ ]);
34
+ });
35
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { Store } from "../Store";
2
+ import { updateArray } from "./updateArray";
3
+ import assert from "assert";
4
+ describe("updateArray", function () {
5
+ it("updates all elements that satisfy criteria", function () {
6
+ let store = new Store({
7
+ data: { array: [1, 2, 3, 4, 5, 6] },
8
+ });
9
+ assert(store.update("array", updateArray, (x) => x + 1, (x) => x > 3));
10
+ assert.deepEqual(store.get("array"), [1, 2, 3, 5, 6, 7]);
11
+ });
12
+ it("does not modify data if not necessary", function () {
13
+ let array = [1, 2, 3, 4, 5, 6];
14
+ let store = new Store({
15
+ data: { array },
16
+ });
17
+ assert(false ===
18
+ store.update("array", updateArray, (x) => x + 1, (x) => x > 10));
19
+ assert(store.get("array") === array);
20
+ });
21
+ it("works with null or undefined", function () {
22
+ let store = new Store();
23
+ assert(false ===
24
+ store.update("array", updateArray, (x) => x + 1, (x) => x > 0));
25
+ });
26
+ it("can remove elements given the criteria", function () {
27
+ let store = new Store({
28
+ data: { array: [1, 2, 3, 4, 5, 6] },
29
+ });
30
+ assert(store.update("array", updateArray, (x) => x + 1, (x) => x > 3, (x) => x <= 3));
31
+ assert.deepEqual(store.get("array"), [5, 6, 7]);
32
+ });
33
+ });
@@ -1 +1 @@
1
- export declare function updateTree<T extends Record<string, any> = any>(array: T[] | undefined, updateCallback: (item: T) => T, itemFilter: ((item: T) => boolean) | null, childrenField: keyof T, removeFilter?: (item: T) => boolean): T[] | undefined;
1
+ export declare function updateTree<T = any>(array: T[] | undefined, updateCallback: (item: T) => T, itemFilter: ((item: T) => boolean) | null, childrenField: keyof T, removeFilter?: (item: T) => boolean): T[] | undefined;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { Store } from "../Store";
2
+ import { updateTree } from "./updateTree";
3
+ import assert from "assert";
4
+ describe("updateTree", function () {
5
+ it("updates all nodes that satisfy criteria", function () {
6
+ let store = new Store({
7
+ data: {
8
+ array: [
9
+ {
10
+ id: "n1",
11
+ value: 1,
12
+ children: [
13
+ {
14
+ id: "n11",
15
+ value: 2,
16
+ },
17
+ {
18
+ id: "n12",
19
+ value: 3,
20
+ },
21
+ ],
22
+ },
23
+ ],
24
+ },
25
+ });
26
+ assert(store.update("array", updateTree, (x) => ({ ...x, value: x.value + 1 }), (x) => x.value > 1, "children"));
27
+ assert.deepEqual(store.get("array"), [
28
+ {
29
+ id: "n1",
30
+ value: 1,
31
+ children: [
32
+ {
33
+ id: "n11",
34
+ value: 3,
35
+ },
36
+ {
37
+ id: "n12",
38
+ value: 4,
39
+ },
40
+ ],
41
+ },
42
+ ]);
43
+ });
44
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
+ import assert from "assert";
3
+ import { Store } from "../data/Store";
4
+ import { createFunctionalComponent } from "../ui/createFunctionalComponent";
5
+ import { createTestRenderer } from "../util/test/createTestRenderer";
6
+ import { invokeCallback } from "./invokeCallback";
7
+ describe("invokeCallback", () => {
8
+ it("works with functions", () => {
9
+ const FComp = createFunctionalComponent(({ onTest }) => {
10
+ invokeCallback(null, onTest, "works");
11
+ return (_jsx("cx", { children: _jsx("div", {}) }));
12
+ });
13
+ let store = new Store();
14
+ let value;
15
+ const component = createTestRenderer(store, {
16
+ type: FComp,
17
+ onTest: (v) => {
18
+ value = v;
19
+ },
20
+ });
21
+ component.toJSON();
22
+ assert.equal(value, "works");
23
+ });
24
+ it("works with controller methods", () => {
25
+ const FComp = createFunctionalComponent(({ onTest }) => {
26
+ return (_jsx("cx", { children: _jsx("div", { onExplore: (context, instance) => {
27
+ invokeCallback(instance, onTest, "works");
28
+ } }) }));
29
+ });
30
+ let store = new Store();
31
+ let value;
32
+ const component = createTestRenderer(store, {
33
+ type: FComp,
34
+ onTest: "onTest",
35
+ controller: {
36
+ onTest(v) {
37
+ value = v;
38
+ },
39
+ },
40
+ });
41
+ component.toJSON();
42
+ assert.equal(value, "works");
43
+ });
44
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
+ import assert from "assert";
3
+ import { Store } from "../data/Store";
4
+ import { createFunctionalComponent } from "../ui/createFunctionalComponent";
5
+ import { createTestRenderer } from "../util/test/createTestRenderer";
6
+ import { resolveCallback } from "./resolveCallback";
7
+ describe("resolveCallback", () => {
8
+ it("works with functions", () => {
9
+ const FComp = createFunctionalComponent(({ onTest }) => {
10
+ let callback = resolveCallback(onTest);
11
+ assert(typeof callback === 'function');
12
+ callback("works");
13
+ return (_jsx("cx", { children: _jsx("div", {}) }));
14
+ });
15
+ let store = new Store();
16
+ let value;
17
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx(FComp, { onTest: (v) => { value = v; } }) }));
18
+ component.toJSON();
19
+ assert.equal(value, "works");
20
+ });
21
+ it("works with controller methods", () => {
22
+ const FComp = createFunctionalComponent(({ onTest }) => {
23
+ let callback = resolveCallback(onTest);
24
+ assert(typeof callback === 'function');
25
+ return (_jsx("cx", { children: _jsx("div", { onInit: () => { callback("works"); } }) }));
26
+ });
27
+ let store = new Store();
28
+ let value;
29
+ const component = createTestRenderer(store, _jsx("cx", { children: _jsx(FComp, { onTest: "onTest", controller: {
30
+ onTest(v) { value = v; }
31
+ } }) }));
32
+ component.toJSON();
33
+ assert.equal(value, "works");
34
+ });
35
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
+ import assert from "assert";
3
+ import { createTestRenderer } from "../util/test/createTestRenderer";
4
+ import { computable } from "../data";
5
+ import { Store } from "../data/Store";
6
+ import { createFunctionalComponent } from "../ui/createFunctionalComponent";
7
+ import { ref } from "./store";
8
+ describe("ref", () => {
9
+ it("allows store references in functional components", () => {
10
+ const FComp = createFunctionalComponent(({}) => {
11
+ let testValue = ref({ bind: "x", defaultValue: 10 });
12
+ return (_jsx("cx", { children: _jsx("div", { text: testValue }) }));
13
+ });
14
+ let store = new Store();
15
+ const component = createTestRenderer(store, FComp);
16
+ let tree = component.toJSON();
17
+ assert.deepEqual(tree, {
18
+ type: "div",
19
+ children: ["10"],
20
+ props: {},
21
+ });
22
+ });
23
+ it("can be used to adapt any prop passed to a functional component", () => {
24
+ const FComp = createFunctionalComponent(({ value }) => {
25
+ return (_jsx("cx", { children: _jsx("div", { text: computable(ref(value), (value) => `x${value}`) }) }));
26
+ });
27
+ let store = new Store({ data: { value: 100 } });
28
+ function test(value, expectation) {
29
+ const component = createTestRenderer(store, _jsx(FComp, { value: value }));
30
+ let tree = component.toJSON();
31
+ assert.deepEqual(tree, {
32
+ type: "div",
33
+ children: [expectation],
34
+ props: {},
35
+ });
36
+ }
37
+ test({ bind: "value" }, "x100");
38
+ test({ expr: "{value}" }, "x100");
39
+ test({ tpl: "{value:n;2}" }, "x100.00");
40
+ test(200, "x200");
41
+ test(() => 500, "x500");
42
+ test(computable("value", (value) => value + 100), "x200");
43
+ test(null, "xnull");
44
+ test(undefined, "xundefined");
45
+ test(0, "x0");
46
+ test(false, "xfalse");
47
+ });
48
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx } from "cx/jsx-runtime";
2
+ import assert from "assert";
3
+ import { createTestRenderer } from "../util/test/createTestRenderer";
4
+ import { Store } from "../data/Store";
5
+ import { createFunctionalComponent } from "../ui/createFunctionalComponent";
6
+ import { useTrigger } from "./useTrigger";
7
+ describe("useTrigger", () => {
8
+ it("works", () => {
9
+ let last = null;
10
+ const FComp = createFunctionalComponent(({ ...props }) => {
11
+ useTrigger(["test"], (test) => {
12
+ last = test;
13
+ });
14
+ return (_jsx("cx", { children: _jsx("div", {}) }));
15
+ });
16
+ let store = new Store();
17
+ let test = store.ref("test", 1);
18
+ const component = createTestRenderer(store, FComp);
19
+ component.toJSON();
20
+ assert.equal(last, null); //trigger did not fire because it didn't receive true as the last argument
21
+ test.set(2);
22
+ component.toJSON();
23
+ assert.equal(last, 2);
24
+ });
25
+ it("fires immediately if the last argument is true", () => {
26
+ let last = null;
27
+ const FComp = createFunctionalComponent(({ ...props }) => {
28
+ useTrigger(["test"], (test) => {
29
+ last = test;
30
+ }, true);
31
+ return (_jsx("cx", { children: _jsx("div", {}) }));
32
+ });
33
+ let store = new Store();
34
+ let test = store.ref("test", 1);
35
+ const component = createTestRenderer(store, FComp);
36
+ component.toJSON();
37
+ assert.equal(last, 1);
38
+ test.set(2);
39
+ component.toJSON();
40
+ assert.equal(last, 2);
41
+ });
42
+ it("accepts refs as arguments", () => {
43
+ let last = null;
44
+ let store = new Store();
45
+ let test = store.ref("test", 1);
46
+ const FComp = createFunctionalComponent(({ ...props }) => {
47
+ useTrigger([test], (test) => {
48
+ last = test;
49
+ }, true);
50
+ return (_jsx("cx", { children: _jsx("div", {}) }));
51
+ });
52
+ const component = createTestRenderer(store, FComp);
53
+ component.toJSON();
54
+ assert.equal(last, 1);
55
+ test.set(2);
56
+ component.toJSON();
57
+ assert.equal(last, 2);
58
+ });
59
+ });
@@ -1,20 +1,15 @@
1
- import type { JSX as ReactJSX } from "react";
2
- import { Instance } from "./ui/Instance";
3
- import type { ClassProp, Prop } from "./ui/Prop";
1
+ import type { ComponentClass, FunctionComponent, JSX as ReactJSX } from "react";
2
+ import type { CxFunctionalComponent } from "./ui/createFunctionalComponent";
4
3
  import { Widget } from "./ui/Widget";
5
4
  import { HtmlElementConfig } from "./widgets/HtmlElement";
6
- import { ChildNode } from "./ui/Container";
5
+ import { ReactElementWrapperConfig } from "./widgets/ReactElementWrapper";
7
6
  export declare function jsx(typeName: any, props: any, key?: string): any;
8
7
  export declare const jsxs: typeof jsx;
9
8
  type ReactIntrinsicElements = ReactJSX.IntrinsicElements;
10
- type IsEventHandler<K, T> = K extends `on${string}` ? (T extends Function ? true : false) : false;
11
- type CxEventHandler<T> = T extends (event: infer E) => any ? string | ((event: E, instance: Instance) => void) : string | T;
12
- type CxIntrinsicElement<T> = {
13
- [K in keyof T]: K extends "children" ? ChildNode | ChildNode[] : K extends "className" | "class" ? ClassProp : IsEventHandler<K, T[K]> extends true ? CxEventHandler<T[K]> : Prop<T[K]>;
14
- } & HtmlElementConfig;
15
9
  type CxIntrinsicElements = {
16
- [K in keyof ReactIntrinsicElements]: CxIntrinsicElement<ReactIntrinsicElements[K]>;
10
+ [K in keyof ReactIntrinsicElements]: HtmlElementConfig<K>;
17
11
  };
12
+ type TransformReactComponentProps<C, P> = [C] extends [CxFunctionalComponent<any>] ? P : [C] extends [FunctionComponent<any>] ? ReactElementWrapperConfig<P> : [C] extends [ComponentClass<any>] ? ReactElementWrapperConfig<P> : P;
18
13
  export declare namespace JSX {
19
14
  /**
20
15
  * Base class for JSX element instances.
@@ -28,5 +23,10 @@ export declare namespace JSX {
28
23
  interface IntrinsicElements extends CxIntrinsicElements {
29
24
  cx: any;
30
25
  }
26
+ /**
27
+ * Transform props for React function components used in CxJS JSX.
28
+ * Adds standard WidgetConfig properties and transforms React props to Prop<X>.
29
+ */
30
+ type LibraryManagedAttributes<C, P> = TransformReactComponentProps<C, P>;
31
31
  }
32
32
  export {};
@@ -1,6 +1,7 @@
1
1
  import { isArray } from "./util/isArray";
2
2
  import { isString } from "./util/isString";
3
3
  import { HtmlElement } from "./widgets/HtmlElement";
4
+ import { ReactElementWrapper } from "./widgets/ReactElementWrapper";
4
5
  export function jsx(typeName, props, key) {
5
6
  if (isArray(typeName))
6
7
  return typeName;
@@ -18,6 +19,11 @@ export function jsx(typeName, props, key) {
18
19
  props.tag = typeName;
19
20
  typeName = HtmlElement;
20
21
  }
22
+ // React components (functions/classes without isComponentType and not CxJS functional components) should go through ReactElementWrapper
23
+ else if (typeof typeName === "function" && !typeName.isComponentType && !typeName.$isComponentFactory) {
24
+ props.componentType = typeName;
25
+ typeName = ReactElementWrapper;
26
+ }
21
27
  return {
22
28
  $type: typeName,
23
29
  ...props,
@@ -21,7 +21,7 @@ export declare class Rect implements IRect {
21
21
  height(): number;
22
22
  valid(): boolean;
23
23
  makeValid(): Rect;
24
- isEqual(r: Rect): boolean;
24
+ isEqual(r?: Rect): boolean;
25
25
  static add(a: Rect, b: Rect): Rect;
26
26
  static multiply(a: Rect, b: Rect): Rect;
27
27
  static margin(r: Rect, m?: RectMargin): Rect;
@@ -1,6 +1,6 @@
1
1
  import { PureContainerBase, PureContainerConfig } from "./PureContainer";
2
2
  import { RenderingContext } from "./RenderingContext";
3
- import { BooleanProp, StructuredProp, ResolveStructuredProp } from "./Prop";
3
+ import { BooleanProp, StructuredProp, ResolvePropType } from "./Prop";
4
4
  import { Instance } from "./Instance";
5
5
  /**
6
6
  * Configuration for ContentResolver widget.
@@ -9,9 +9,11 @@ import { Instance } from "./Instance";
9
9
  * - Literal values (numbers, strings, booleans) preserve their types
10
10
  * - AccessorChain<T> resolves to T
11
11
  * - Bind/Tpl/Expr resolve to any (type cannot be determined at compile time)
12
+ * - Structured props (objects) have each property resolved individually
12
13
  *
13
14
  * @example
14
15
  * ```typescript
16
+ * // Structured params (object)
15
17
  * <ContentResolver
16
18
  * params={{
17
19
  * count: 42, // number
@@ -21,26 +23,34 @@ import { Instance } from "./Instance";
21
23
  * // params.count is number, params.name is string
22
24
  * }}
23
25
  * />
26
+ *
27
+ * // Simple param (single value)
28
+ * <ContentResolver
29
+ * params={model.user.name} // AccessorChain<string>
30
+ * onResolve={(name) => {
31
+ * // name is string
32
+ * }}
33
+ * />
24
34
  * ```
25
35
  */
26
- export interface ContentResolverConfig<P extends StructuredProp = StructuredProp> extends PureContainerConfig {
27
- /** Parameters that trigger content resolution when changed. */
36
+ export interface ContentResolverConfig<P = StructuredProp> extends PureContainerConfig {
37
+ /** Parameters that trigger content resolution when changed. Can be a structured object or a single Prop. */
28
38
  params?: P;
29
39
  /**
30
40
  * Callback function that resolves content based on params. Can return content directly or a Promise.
31
41
  * The params type is inferred from the params property - literal values and AccessorChain<T>
32
42
  * preserve their types, while bindings (bind/tpl/expr) resolve to `any`.
33
43
  */
34
- onResolve?: string | ((params: ResolveStructuredProp<P>, instance: Instance) => any);
44
+ onResolve?: string | ((params: ResolvePropType<P>, instance: Instance) => any);
35
45
  /** How to combine resolved content with initial content. Default is 'replace'. */
36
46
  mode?: "replace" | "prepend" | "append";
37
47
  /** Indicates if content is being loaded. */
38
48
  loading?: BooleanProp;
39
49
  }
40
- export declare class ContentResolver<P extends StructuredProp = StructuredProp> extends PureContainerBase<ContentResolverConfig<P>> {
50
+ export declare class ContentResolver<P = StructuredProp> extends PureContainerBase<ContentResolverConfig<P>> {
41
51
  constructor(config?: ContentResolverConfig<P>);
42
52
  mode: "replace" | "prepend" | "append";
43
- onResolve?: string | ((params: ResolveStructuredProp<P>, instance: Instance) => any);
53
+ onResolve?: string | ((params: ResolvePropType<P>, instance: Instance) => any);
44
54
  initialItems: any;
45
55
  declareData(...args: any[]): void;
46
56
  init(): void;
@@ -4,6 +4,7 @@ import { RenderingContext } from "./RenderingContext";
4
4
  import { View, ViewMethods } from "../data/View";
5
5
  import { Widget } from "./Widget";
6
6
  import { Instance } from "./Instance";
7
+ import { AccessorChain } from "../data/createAccessorModelProxy";
7
8
  interface ComputableEntry {
8
9
  name: string;
9
10
  selector: any;
@@ -17,6 +18,9 @@ export interface ControllerMethods {
17
18
  addTrigger<Selectors extends readonly ComputableSelector[]>(name: string, args: [...Selectors], callback: (...values: {
18
19
  [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
19
20
  }) => any, autoRun?: boolean): void;
21
+ addComputable<T, Selectors extends readonly ComputableSelector[]>(name: AccessorChain<T>, args: [...Selectors], callback: (...values: {
22
+ [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
23
+ }) => T): void;
20
24
  addComputable<Selectors extends readonly ComputableSelector[]>(name: string, args: [...Selectors], callback: (...values: {
21
25
  [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
22
26
  }) => any): void;
@@ -50,6 +54,9 @@ export declare class Controller<D = any> extends Component implements Controller
50
54
  explore(context: RenderingContext): void;
51
55
  prepare(context: RenderingContext): void;
52
56
  cleanup(context: RenderingContext): void;
57
+ addComputable<T, Selectors extends readonly ComputableSelector[]>(name: AccessorChain<T>, args: [...Selectors], callback: (...values: {
58
+ [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
59
+ }) => T): void;
53
60
  addComputable<Selectors extends readonly ComputableSelector[]>(name: string, args: [...Selectors], callback: (...values: {
54
61
  [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
55
62
  }) => any): void;
@@ -54,7 +54,8 @@ export class Controller extends Component {
54
54
  let selector = computable(...args, callback).memoize();
55
55
  if (!this.computables)
56
56
  this.computables = {};
57
- this.computables[computablePrefix + name] = { name, selector, type: "computable" };
57
+ let nameStr = String(name);
58
+ this.computables[computablePrefix + nameStr] = { name: nameStr, selector, type: "computable" };
58
59
  }
59
60
  addTrigger(name, args, callback, autoRun) {
60
61
  if (!isArray(args))
@@ -0,0 +1 @@
1
+ export {};