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,379 @@
1
+ import {
2
+ truthy,
3
+ falsy,
4
+ isTrue,
5
+ isFalse,
6
+ hasValue,
7
+ isEmpty,
8
+ isNonEmpty,
9
+ lessThan,
10
+ lessThanOrEqual,
11
+ greaterThan,
12
+ greaterThanOrEqual,
13
+ equal,
14
+ notEqual,
15
+ strictEqual,
16
+ strictNotEqual,
17
+ } from "./exprHelpers";
18
+ import assert from "assert";
19
+ import { createAccessorModelProxy } from "../data/createAccessorModelProxy";
20
+
21
+ interface Model {
22
+ value: number;
23
+ name: string;
24
+ flag: boolean;
25
+ nullable: string | null | undefined;
26
+ items: string[];
27
+ }
28
+
29
+ describe("exprHelpers", function () {
30
+ const m = createAccessorModelProxy<Model>();
31
+
32
+ describe("truthy", function () {
33
+ it("returns true for truthy values", function () {
34
+ const selector = truthy(m.value);
35
+ assert.strictEqual(selector({ value: 1 }), true);
36
+ assert.strictEqual(selector({ value: 100 }), true);
37
+ });
38
+
39
+ it("returns false for falsy values", function () {
40
+ const selector = truthy(m.value);
41
+ assert.strictEqual(selector({ value: 0 }), false);
42
+ });
43
+
44
+ it("returns true for non-empty strings", function () {
45
+ const selector = truthy(m.name);
46
+ assert.strictEqual(selector({ name: "hello" }), true);
47
+ });
48
+
49
+ it("returns false for empty strings", function () {
50
+ const selector = truthy(m.name);
51
+ assert.strictEqual(selector({ name: "" }), false);
52
+ });
53
+
54
+ it("returns false for null", function () {
55
+ const selector = truthy(m.nullable);
56
+ assert.strictEqual(selector({ nullable: null }), false);
57
+ });
58
+ });
59
+
60
+ describe("falsy", function () {
61
+ it("returns false for truthy values", function () {
62
+ const selector = falsy(m.flag);
63
+ assert.strictEqual(selector({ flag: true }), false);
64
+ });
65
+
66
+ it("returns true for falsy values", function () {
67
+ const selector = falsy(m.flag);
68
+ assert.strictEqual(selector({ flag: false }), true);
69
+ });
70
+
71
+ it("returns true for null", function () {
72
+ const selector = falsy(m.nullable);
73
+ assert.strictEqual(selector({ nullable: null }), true);
74
+ });
75
+
76
+ it("returns true for zero", function () {
77
+ const selector = falsy(m.value);
78
+ assert.strictEqual(selector({ value: 0 }), true);
79
+ });
80
+
81
+ it("returns true for empty string", function () {
82
+ const selector = falsy(m.name);
83
+ assert.strictEqual(selector({ name: "" }), true);
84
+ });
85
+ });
86
+
87
+ describe("isTrue", function () {
88
+ it("returns true only for strictly true", function () {
89
+ const selector = isTrue(m.flag);
90
+ assert.strictEqual(selector({ flag: true }), true);
91
+ });
92
+
93
+ it("returns false for truthy values that are not true", function () {
94
+ const selector = isTrue(m.value);
95
+ assert.strictEqual(selector({ value: 1 }), false);
96
+ assert.strictEqual(selector({ value: "true" }), false);
97
+ });
98
+
99
+ it("returns false for false", function () {
100
+ const selector = isTrue(m.flag);
101
+ assert.strictEqual(selector({ flag: false }), false);
102
+ });
103
+ });
104
+
105
+ describe("isFalse", function () {
106
+ it("returns true only for strictly false", function () {
107
+ const selector = isFalse(m.flag);
108
+ assert.strictEqual(selector({ flag: false }), true);
109
+ });
110
+
111
+ it("returns false for falsy values that are not false", function () {
112
+ const selector = isFalse(m.value);
113
+ assert.strictEqual(selector({ value: 0 }), false);
114
+ assert.strictEqual(selector({ value: null }), false);
115
+ assert.strictEqual(selector({ value: "" }), false);
116
+ });
117
+
118
+ it("returns false for true", function () {
119
+ const selector = isFalse(m.flag);
120
+ assert.strictEqual(selector({ flag: true }), false);
121
+ });
122
+ });
123
+
124
+ describe("hasValue", function () {
125
+ it("returns true for defined values", function () {
126
+ const selector = hasValue(m.value);
127
+ assert.strictEqual(selector({ value: 0 }), true);
128
+ assert.strictEqual(selector({ value: 1 }), true);
129
+ });
130
+
131
+ it("returns true for empty string", function () {
132
+ const selector = hasValue(m.name);
133
+ assert.strictEqual(selector({ name: "" }), true);
134
+ });
135
+
136
+ it("returns true for false", function () {
137
+ const selector = hasValue(m.flag);
138
+ assert.strictEqual(selector({ flag: false }), true);
139
+ });
140
+
141
+ it("returns false for null", function () {
142
+ const selector = hasValue(m.nullable);
143
+ assert.strictEqual(selector({ nullable: null }), false);
144
+ });
145
+
146
+ it("returns false for undefined", function () {
147
+ const selector = hasValue(m.nullable);
148
+ assert.strictEqual(selector({ nullable: undefined }), false);
149
+ });
150
+ });
151
+
152
+ describe("isEmpty", function () {
153
+ it("returns true for empty string", function () {
154
+ const selector = isEmpty(m.name);
155
+ assert.strictEqual(selector({ name: "" }), true);
156
+ });
157
+
158
+ it("returns false for non-empty string", function () {
159
+ const selector = isEmpty(m.name);
160
+ assert.strictEqual(selector({ name: "hello" }), false);
161
+ });
162
+
163
+ it("returns true for empty array", function () {
164
+ const selector = isEmpty(m.items);
165
+ assert.strictEqual(selector({ items: [] }), true);
166
+ });
167
+
168
+ it("returns false for non-empty array", function () {
169
+ const selector = isEmpty(m.items);
170
+ assert.strictEqual(selector({ items: ["a", "b"] }), false);
171
+ });
172
+
173
+ it("returns true for null", function () {
174
+ const selector = isEmpty(m.nullable);
175
+ assert.strictEqual(selector({ nullable: null }), true);
176
+ });
177
+
178
+ it("returns true for undefined", function () {
179
+ const selector = isEmpty(m.nullable);
180
+ assert.strictEqual(selector({ nullable: undefined }), true);
181
+ });
182
+ });
183
+
184
+ describe("isNonEmpty", function () {
185
+ it("returns false for empty string", function () {
186
+ const selector = isNonEmpty(m.name);
187
+ assert.strictEqual(selector({ name: "" }), false);
188
+ });
189
+
190
+ it("returns true for non-empty string", function () {
191
+ const selector = isNonEmpty(m.name);
192
+ assert.strictEqual(selector({ name: "hello" }), true);
193
+ });
194
+
195
+ it("returns false for empty array", function () {
196
+ const selector = isNonEmpty(m.items);
197
+ assert.strictEqual(selector({ items: [] }), false);
198
+ });
199
+
200
+ it("returns true for non-empty array", function () {
201
+ const selector = isNonEmpty(m.items);
202
+ assert.strictEqual(selector({ items: ["a", "b"] }), true);
203
+ });
204
+
205
+ it("returns false for null", function () {
206
+ const selector = isNonEmpty(m.nullable);
207
+ assert.strictEqual(selector({ nullable: null }), false);
208
+ });
209
+
210
+ it("returns false for undefined", function () {
211
+ const selector = isNonEmpty(m.nullable);
212
+ assert.strictEqual(selector({ nullable: undefined }), false);
213
+ });
214
+ });
215
+
216
+ describe("lessThan", function () {
217
+ it("returns true when value is less than target", function () {
218
+ const selector = lessThan(m.value, 10);
219
+ assert.strictEqual(selector({ value: 5 }), true);
220
+ assert.strictEqual(selector({ value: 9 }), true);
221
+ });
222
+
223
+ it("returns false when value is equal to target", function () {
224
+ const selector = lessThan(m.value, 10);
225
+ assert.strictEqual(selector({ value: 10 }), false);
226
+ });
227
+
228
+ it("returns false when value is greater than target", function () {
229
+ const selector = lessThan(m.value, 10);
230
+ assert.strictEqual(selector({ value: 11 }), false);
231
+ assert.strictEqual(selector({ value: 100 }), false);
232
+ });
233
+ });
234
+
235
+ describe("lessThanOrEqual", function () {
236
+ it("returns true when value is less than target", function () {
237
+ const selector = lessThanOrEqual(m.value, 10);
238
+ assert.strictEqual(selector({ value: 5 }), true);
239
+ assert.strictEqual(selector({ value: 9 }), true);
240
+ });
241
+
242
+ it("returns true when value is equal to target", function () {
243
+ const selector = lessThanOrEqual(m.value, 10);
244
+ assert.strictEqual(selector({ value: 10 }), true);
245
+ });
246
+
247
+ it("returns false when value is greater than target", function () {
248
+ const selector = lessThanOrEqual(m.value, 10);
249
+ assert.strictEqual(selector({ value: 11 }), false);
250
+ assert.strictEqual(selector({ value: 100 }), false);
251
+ });
252
+ });
253
+
254
+ describe("greaterThan", function () {
255
+ it("returns true when value is greater than target", function () {
256
+ const selector = greaterThan(m.value, 10);
257
+ assert.strictEqual(selector({ value: 11 }), true);
258
+ assert.strictEqual(selector({ value: 100 }), true);
259
+ });
260
+
261
+ it("returns false when value is equal to target", function () {
262
+ const selector = greaterThan(m.value, 10);
263
+ assert.strictEqual(selector({ value: 10 }), false);
264
+ });
265
+
266
+ it("returns false when value is less than target", function () {
267
+ const selector = greaterThan(m.value, 10);
268
+ assert.strictEqual(selector({ value: 5 }), false);
269
+ assert.strictEqual(selector({ value: 9 }), false);
270
+ });
271
+ });
272
+
273
+ describe("greaterThanOrEqual", function () {
274
+ it("returns true when value is greater than target", function () {
275
+ const selector = greaterThanOrEqual(m.value, 10);
276
+ assert.strictEqual(selector({ value: 11 }), true);
277
+ assert.strictEqual(selector({ value: 100 }), true);
278
+ });
279
+
280
+ it("returns true when value is equal to target", function () {
281
+ const selector = greaterThanOrEqual(m.value, 10);
282
+ assert.strictEqual(selector({ value: 10 }), true);
283
+ });
284
+
285
+ it("returns false when value is less than target", function () {
286
+ const selector = greaterThanOrEqual(m.value, 10);
287
+ assert.strictEqual(selector({ value: 5 }), false);
288
+ assert.strictEqual(selector({ value: 9 }), false);
289
+ });
290
+ });
291
+
292
+ describe("equal (loose equality)", function () {
293
+ it("returns true when value equals target", function () {
294
+ const selector = equal(m.value, 10);
295
+ assert.strictEqual(selector({ value: 10 }), true);
296
+ });
297
+
298
+ it("returns false when value does not equal target", function () {
299
+ const selector = equal(m.value, 10);
300
+ assert.strictEqual(selector({ value: 5 }), false);
301
+ assert.strictEqual(selector({ value: 11 }), false);
302
+ });
303
+
304
+ it("works with string values", function () {
305
+ const selector = equal(m.name, "hello");
306
+ assert.strictEqual(selector({ name: "hello" }), true);
307
+ assert.strictEqual(selector({ name: "world" }), false);
308
+ });
309
+
310
+ it("uses loose equality (null == undefined)", function () {
311
+ const selector = equal(m.nullable, null);
312
+ assert.strictEqual(selector({ nullable: null }), true);
313
+ assert.strictEqual(selector({ nullable: undefined }), true);
314
+ });
315
+ });
316
+
317
+ describe("notEqual (loose inequality)", function () {
318
+ it("returns false when value equals target", function () {
319
+ const selector = notEqual(m.value, 10);
320
+ assert.strictEqual(selector({ value: 10 }), false);
321
+ });
322
+
323
+ it("returns true when value does not equal target", function () {
324
+ const selector = notEqual(m.value, 10);
325
+ assert.strictEqual(selector({ value: 5 }), true);
326
+ assert.strictEqual(selector({ value: 11 }), true);
327
+ });
328
+
329
+ it("works with string values", function () {
330
+ const selector = notEqual(m.name, "hello");
331
+ assert.strictEqual(selector({ name: "hello" }), false);
332
+ assert.strictEqual(selector({ name: "world" }), true);
333
+ });
334
+
335
+ it("uses loose inequality (null == undefined)", function () {
336
+ const selector = notEqual(m.nullable, null);
337
+ assert.strictEqual(selector({ nullable: null }), false);
338
+ assert.strictEqual(selector({ nullable: undefined }), false);
339
+ });
340
+ });
341
+
342
+ describe("strictEqual", function () {
343
+ it("returns true when value strictly equals target", function () {
344
+ const selector = strictEqual(m.value, 10);
345
+ assert.strictEqual(selector({ value: 10 }), true);
346
+ });
347
+
348
+ it("returns false when value does not strictly equal target", function () {
349
+ const selector = strictEqual(m.value, 10);
350
+ assert.strictEqual(selector({ value: 5 }), false);
351
+ assert.strictEqual(selector({ value: 11 }), false);
352
+ });
353
+
354
+ it("uses strict equality (null !== undefined)", function () {
355
+ const selector = strictEqual(m.nullable, null);
356
+ assert.strictEqual(selector({ nullable: null }), true);
357
+ assert.strictEqual(selector({ nullable: undefined }), false);
358
+ });
359
+ });
360
+
361
+ describe("strictNotEqual", function () {
362
+ it("returns false when value strictly equals target", function () {
363
+ const selector = strictNotEqual(m.value, 10);
364
+ assert.strictEqual(selector({ value: 10 }), false);
365
+ });
366
+
367
+ it("returns true when value does not strictly equal target", function () {
368
+ const selector = strictNotEqual(m.value, 10);
369
+ assert.strictEqual(selector({ value: 5 }), true);
370
+ assert.strictEqual(selector({ value: 11 }), true);
371
+ });
372
+
373
+ it("uses strict inequality (null !== undefined)", function () {
374
+ const selector = strictNotEqual(m.nullable, null);
375
+ assert.strictEqual(selector({ nullable: null }), false);
376
+ assert.strictEqual(selector({ nullable: undefined }), true);
377
+ });
378
+ });
379
+ });
@@ -0,0 +1,78 @@
1
+ import { AccessorChain } from "../data/createAccessorModelProxy";
2
+ import { Selector } from "../data/Selector";
3
+ import { expr } from "./expr";
4
+
5
+ /** Returns a selector that converts the value to boolean using !! */
6
+ export function truthy<V>(arg: AccessorChain<V>): Selector<boolean> {
7
+ return expr(arg, (x) => !!x);
8
+ }
9
+
10
+ /** Returns a selector that checks if the value is falsy using ! */
11
+ export function falsy<V>(arg: AccessorChain<V>): Selector<boolean> {
12
+ return expr(arg, (x) => !x);
13
+ }
14
+
15
+ /** Returns a selector that checks if the value is strictly true (=== true) */
16
+ export function isTrue(arg: AccessorChain<any>): Selector<boolean> {
17
+ return expr(arg, (x) => x === true);
18
+ }
19
+
20
+ /** Returns a selector that checks if the value is strictly false (=== false) */
21
+ export function isFalse(arg: AccessorChain<any>): Selector<boolean> {
22
+ return expr(arg, (x) => x === false);
23
+ }
24
+
25
+ /** Returns a selector that checks if the value is not null or undefined (x != null) */
26
+ export function hasValue<V>(arg: AccessorChain<V>): Selector<boolean> {
27
+ return expr(arg, (x) => x != null);
28
+ }
29
+
30
+ /** Returns a selector that checks if a string or array is empty (null, undefined, or length === 0) */
31
+ export function isEmpty(arg: AccessorChain<string | any[] | null | undefined>): Selector<boolean> {
32
+ return expr(arg, (x) => x == null || x.length === 0);
33
+ }
34
+
35
+ /** Returns a selector that checks if a string or array is non-empty (not null/undefined and length > 0) */
36
+ export function isNonEmpty(arg: AccessorChain<string | any[] | null | undefined>): Selector<boolean> {
37
+ return expr(arg, (x) => x != null && x.length > 0);
38
+ }
39
+
40
+ /** Returns a selector that checks if the value is less than the given value */
41
+ export function lessThan<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
42
+ return expr(arg, (x) => x < value);
43
+ }
44
+
45
+ /** Returns a selector that checks if the value is less than or equal to the given value */
46
+ export function lessThanOrEqual<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
47
+ return expr(arg, (x) => x <= value);
48
+ }
49
+
50
+ /** Returns a selector that checks if the value is greater than the given value */
51
+ export function greaterThan<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
52
+ return expr(arg, (x) => x > value);
53
+ }
54
+
55
+ /** Returns a selector that checks if the value is greater than or equal to the given value */
56
+ export function greaterThanOrEqual<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
57
+ return expr(arg, (x) => x >= value);
58
+ }
59
+
60
+ /** Returns a selector that checks if the value equals the given value using == */
61
+ export function equal<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
62
+ return expr(arg, (x) => x == value);
63
+ }
64
+
65
+ /** Returns a selector that checks if the value does not equal the given value using != */
66
+ export function notEqual<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
67
+ return expr(arg, (x) => x != value);
68
+ }
69
+
70
+ /** Returns a selector that checks if the value strictly equals the given value using === */
71
+ export function strictEqual<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
72
+ return expr(arg, (x) => x === value);
73
+ }
74
+
75
+ /** Returns a selector that checks if the value strictly does not equal the given value using !== */
76
+ export function strictNotEqual<V>(arg: AccessorChain<V>, value: V): Selector<boolean> {
77
+ return expr(arg, (x) => x !== value);
78
+ }
package/src/ui/index.ts CHANGED
@@ -1,46 +1,47 @@
1
- export * from "./Prop";
2
- export * from "./Controller";
3
- export * from "./Widget";
4
- export * from "./Container";
5
- export * from "./PureContainer";
6
- export * from "./Repeater";
7
- export * from "./Rescope";
8
- export * from "./StaticText";
9
- export * from "./Text";
10
- export * from "./CSS";
11
- export * from "./CSSHelper";
12
- export * from "./FocusManager";
13
- export * from "./ResizeManager";
14
- export * from "./ZIndexManager";
15
- export * from "./Format";
16
- export * from "./Culture";
17
- export * from "./Localization";
18
- export * from "./Cx";
19
- export * from "./Instance";
20
- export * from "./RenderingContext";
21
- export * from "./ContentResolver";
22
- export * from "./batchUpdates";
23
- export * from "./IsolatedScope";
24
- export * from "./DetachedScope";
25
- export * from "./Restate";
26
- export * from "./DataProxy";
27
- export * from "./keyboardShortcuts";
28
- export * from "./StructuredInstanceDataAccessor";
29
- export * from "./HoverSync";
30
-
31
- export * from "./createFunctionalComponent";
32
- export * from "./flattenProps";
33
-
34
- export * from "./selection/index";
35
- export * from "./layout/index";
36
- export * from "./app/index";
37
- export * from "./adapter/index";
38
-
39
- export * from "./bind";
40
- export * from "./tpl";
41
- export * from "./expr";
42
-
43
- //re-export computable here
44
- import { computable } from "../data/computable";
45
- import { createAccessorModelProxy, AccessorChain } from "../data/createAccessorModelProxy";
46
- export { computable, createAccessorModelProxy, AccessorChain };
1
+ export * from "./Prop";
2
+ export * from "./Controller";
3
+ export * from "./Widget";
4
+ export * from "./Container";
5
+ export * from "./PureContainer";
6
+ export * from "./Repeater";
7
+ export * from "./Rescope";
8
+ export * from "./StaticText";
9
+ export * from "./Text";
10
+ export * from "./CSS";
11
+ export * from "./CSSHelper";
12
+ export * from "./FocusManager";
13
+ export * from "./ResizeManager";
14
+ export * from "./ZIndexManager";
15
+ export * from "./Format";
16
+ export * from "./Culture";
17
+ export * from "./Localization";
18
+ export * from "./Cx";
19
+ export * from "./Instance";
20
+ export * from "./RenderingContext";
21
+ export * from "./ContentResolver";
22
+ export * from "./batchUpdates";
23
+ export * from "./IsolatedScope";
24
+ export * from "./DetachedScope";
25
+ export * from "./Restate";
26
+ export * from "./DataProxy";
27
+ export * from "./keyboardShortcuts";
28
+ export * from "./StructuredInstanceDataAccessor";
29
+ export * from "./HoverSync";
30
+
31
+ export * from "./createFunctionalComponent";
32
+ export * from "./flattenProps";
33
+
34
+ export * from "./selection/index";
35
+ export * from "./layout/index";
36
+ export * from "./app/index";
37
+ export * from "./adapter/index";
38
+
39
+ export * from "./bind";
40
+ export * from "./tpl";
41
+ export * from "./expr";
42
+ export * from "./exprHelpers";
43
+
44
+ //re-export computable here
45
+ import { computable } from "../data/computable";
46
+ import { createAccessorModelProxy, AccessorChain } from "../data/createAccessorModelProxy";
47
+ export { computable, createAccessorModelProxy, AccessorChain };
@@ -1,30 +1,30 @@
1
- import { Widget } from "../Widget";
2
- import { PureContainerBase, PureContainerConfig } from "../PureContainer";
3
- import { Instance } from "../Instance";
4
-
5
- export interface ContentConfig extends PureContainerConfig {
6
- /** Placeholder name where the content is rendered. */
7
- name?: string;
8
-
9
- /** Placeholder name where the content is rendered. */
10
- for?: string;
11
- }
12
-
13
- export class Content extends PureContainerBase<ContentConfig, Instance> {
14
- declare name?: string;
15
- declare for?: string;
16
-
17
- constructor(config?: ContentConfig) {
18
- super(config);
19
- }
20
-
21
- init(): void {
22
- super.init();
23
- if (!this.putInto) this.putInto = this.for || this.name;
24
- }
25
- }
26
-
27
- Content.prototype.name = "body";
28
- Content.prototype.isContent = true;
29
-
30
- Widget.alias("content", Content);
1
+ import { Widget } from "../Widget";
2
+ import { PureContainerBase, PureContainerConfig } from "../PureContainer";
3
+ import { Instance } from "../Instance";
4
+
5
+ export interface ContentConfig extends PureContainerConfig {
6
+ /** Placeholder name where the content is rendered. */
7
+ name?: string;
8
+
9
+ /** Placeholder name where the content is rendered. */
10
+ for?: string;
11
+ }
12
+
13
+ export class Content extends PureContainerBase<ContentConfig, Instance> {
14
+ declare name?: string;
15
+ declare for?: string;
16
+
17
+ constructor(config?: ContentConfig) {
18
+ super(config);
19
+ }
20
+
21
+ init(): void {
22
+ super.init();
23
+ if (!this.putInto) this.putInto = this.for || this.name;
24
+ }
25
+ }
26
+
27
+ Content.prototype.name = "body";
28
+ Content.prototype.isContent = true;
29
+
30
+ Widget.alias("content", Content);
@@ -129,7 +129,7 @@ describe("FirstVisibleChildLayout", () => {
129
129
  let widget = (
130
130
  <cx>
131
131
  <div layout={FirstVisibleChildLayout}>
132
- <FC dummy>
132
+ <FC>
133
133
  <header visible={false}></header>
134
134
  </FC>
135
135
  <main></main>