cx 26.0.12 → 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 (363) 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.js +133 -133
  187. package/dist/data.js +2 -2
  188. package/dist/jsx-runtime.js +6 -1
  189. package/dist/manifest.d.ts +1443 -0
  190. package/dist/manifest.js +855 -807
  191. package/dist/ui.js +91 -5
  192. package/dist/util.js +3 -0
  193. package/dist/widgets.js +520 -161
  194. package/package.json +46 -20
  195. package/src/charts/Chart.ts +108 -108
  196. package/src/charts/ScatterGraph.tsx +6 -6
  197. package/src/data/ArrayElementView.ts +90 -90
  198. package/src/data/AugmentedViewBase.ts +88 -88
  199. package/src/data/Binding.ts +104 -104
  200. package/src/data/ExposedRecordView.ts +95 -95
  201. package/src/data/ExposedValueView.ts +89 -89
  202. package/src/data/Expression.spec.ts +229 -229
  203. package/src/data/Expression.ts +233 -233
  204. package/src/data/Grouper.spec.ts +57 -57
  205. package/src/data/Grouper.ts +158 -158
  206. package/src/data/NestedDataView.ts +43 -43
  207. package/src/data/ReadOnlyDataView.ts +39 -39
  208. package/src/data/Ref.ts +104 -104
  209. package/src/data/Selector.ts +10 -10
  210. package/src/data/Store.ts +52 -52
  211. package/src/data/StoreProxy.ts +19 -19
  212. package/src/data/StoreRef.ts +66 -66
  213. package/src/data/StringTemplate.spec.ts +132 -132
  214. package/src/data/StringTemplate.ts +93 -93
  215. package/src/data/StructuredSelector.spec.ts +113 -113
  216. package/src/data/StructuredSelector.ts +146 -146
  217. package/src/data/SubscribableView.ts +63 -63
  218. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  219. package/src/data/ZoomIntoPropertyView.ts +45 -45
  220. package/src/data/computable.spec.ts +87 -62
  221. package/src/data/computable.ts +3 -6
  222. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  223. package/src/data/createAccessorModelProxy.ts +9 -3
  224. package/src/data/createStructuredSelector.ts +62 -62
  225. package/src/data/getAccessor.spec.ts +11 -11
  226. package/src/data/getAccessor.ts +74 -74
  227. package/src/data/getSelector.spec.ts +43 -43
  228. package/src/data/getSelector.ts +66 -66
  229. package/src/data/ops/filter.spec.ts +35 -35
  230. package/src/data/ops/filter.ts +9 -9
  231. package/src/data/ops/findTreeNode.ts +1 -5
  232. package/src/data/ops/findTreePath.ts +1 -1
  233. package/src/data/ops/merge.ts +13 -13
  234. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  235. package/src/data/ops/removeTreeNodes.ts +2 -2
  236. package/src/data/ops/updateArray.spec.ts +69 -69
  237. package/src/data/ops/updateArray.ts +31 -31
  238. package/src/data/ops/updateTree.ts +1 -1
  239. package/src/data/test-types.ts +7 -7
  240. package/src/hooks/resolveCallback.spec.tsx +30 -7
  241. package/src/hooks/useTrigger.ts +26 -26
  242. package/src/index.scss +6 -6
  243. package/src/jsx-dev-runtime.ts +4 -4
  244. package/src/jsx-runtime.spec.tsx +402 -0
  245. package/src/jsx-runtime.ts +26 -22
  246. package/src/svg/BoundedObject.ts +101 -101
  247. package/src/svg/util/Rect.ts +105 -105
  248. package/src/ui/CSSHelper.ts +17 -17
  249. package/src/ui/ContentResolver.spec.tsx +172 -19
  250. package/src/ui/ContentResolver.ts +16 -8
  251. package/src/ui/Controller.ts +15 -2
  252. package/src/ui/Culture.ts +159 -159
  253. package/src/ui/DataProxy.ts +55 -55
  254. package/src/ui/FocusManager.ts +171 -171
  255. package/src/ui/Instance.ts +866 -868
  256. package/src/ui/Prop.ts +140 -112
  257. package/src/ui/RenderingContext.ts +99 -99
  258. package/src/ui/Repeater.ts +3 -12
  259. package/src/ui/Rescope.ts +49 -49
  260. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  261. package/src/ui/Text.ts +21 -2
  262. package/src/ui/VDOM.ts +34 -34
  263. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  264. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  265. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  266. package/src/ui/adapter/TreeAdapter.ts +185 -185
  267. package/src/ui/app/History.ts +133 -133
  268. package/src/ui/app/Url.spec.ts +50 -50
  269. package/src/ui/app/startHotAppLoop.ts +41 -41
  270. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  271. package/src/ui/createFunctionalComponent.ts +86 -65
  272. package/src/ui/expr.ts +4 -1
  273. package/src/ui/exprHelpers.spec.ts +379 -0
  274. package/src/ui/exprHelpers.ts +78 -0
  275. package/src/ui/index.ts +47 -46
  276. package/src/ui/layout/Content.ts +30 -30
  277. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  278. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  279. package/src/ui/selection/KeySelection.ts +153 -153
  280. package/src/ui/selection/Selection.ts +128 -128
  281. package/src/util/Console.ts +13 -11
  282. package/src/util/Format.ts +267 -267
  283. package/src/util/addEventListenerWithOptions.ts +41 -41
  284. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  285. package/src/util/color/rgbToHsl.ts +35 -35
  286. package/src/util/getActiveElement.ts +4 -4
  287. package/src/util/hasKey.ts +18 -18
  288. package/src/util/index.ts +55 -55
  289. package/src/util/innerTextTrim.ts +10 -10
  290. package/src/util/isArray.ts +3 -3
  291. package/src/util/isDataRecord.ts +5 -5
  292. package/src/util/isDefined.ts +3 -3
  293. package/src/util/isString.ts +3 -3
  294. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  295. package/src/widgets/Button.tsx +5 -17
  296. package/src/widgets/DocumentTitle.ts +95 -92
  297. package/src/widgets/Heading.ts +2 -2
  298. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  299. package/src/widgets/HtmlElement.spec.tsx +20 -12
  300. package/src/widgets/HtmlElement.tsx +77 -23
  301. package/src/widgets/Icon.ts +3 -17
  302. package/src/widgets/List.tsx +6 -0
  303. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  304. package/src/widgets/ReactElementWrapper.tsx +108 -0
  305. package/src/widgets/Sandbox.ts +103 -103
  306. package/src/widgets/autoFocus.ts +9 -9
  307. package/src/widgets/cx.ts +63 -63
  308. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  309. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  310. package/src/widgets/form/Checkbox.tsx +3 -0
  311. package/src/widgets/form/ColorField.tsx +3 -0
  312. package/src/widgets/form/DateTimeField.tsx +5 -0
  313. package/src/widgets/form/Field.tsx +0 -3
  314. package/src/widgets/form/Label.tsx +1 -0
  315. package/src/widgets/form/LabeledContainer.ts +22 -26
  316. package/src/widgets/form/LookupField.spec.tsx +93 -0
  317. package/src/widgets/form/LookupField.tsx +104 -9
  318. package/src/widgets/form/MonthField.tsx +5 -0
  319. package/src/widgets/form/NumberField.tsx +3 -0
  320. package/src/widgets/form/Radio.tsx +5 -0
  321. package/src/widgets/form/Select.tsx +5 -0
  322. package/src/widgets/form/Slider.tsx +4 -0
  323. package/src/widgets/form/Switch.tsx +3 -0
  324. package/src/widgets/form/TextField.tsx +62 -0
  325. package/src/widgets/form/TimeList.tsx +84 -73
  326. package/src/widgets/form/UploadButton.tsx +53 -2
  327. package/src/widgets/form/Validator.ts +40 -3
  328. package/src/widgets/grid/Grid.tsx +9 -12
  329. package/src/widgets/grid/GridCell.ts +143 -143
  330. package/src/widgets/grid/TreeNode.tsx +9 -0
  331. package/src/widgets/icons/calendar.tsx +17 -17
  332. package/src/widgets/icons/check.tsx +13 -13
  333. package/src/widgets/icons/clear.tsx +15 -15
  334. package/src/widgets/icons/close.tsx +20 -20
  335. package/src/widgets/icons/cx.tsx +38 -38
  336. package/src/widgets/icons/drop-down.tsx +15 -15
  337. package/src/widgets/icons/file.tsx +13 -13
  338. package/src/widgets/icons/folder-open.tsx +15 -15
  339. package/src/widgets/icons/folder.tsx +13 -13
  340. package/src/widgets/icons/forward.tsx +22 -22
  341. package/src/widgets/icons/loading.tsx +24 -24
  342. package/src/widgets/icons/menu.tsx +17 -17
  343. package/src/widgets/icons/pixel-picker.tsx +18 -18
  344. package/src/widgets/icons/search.tsx +13 -13
  345. package/src/widgets/icons/sort-asc.tsx +14 -14
  346. package/src/widgets/icons/square.tsx +18 -18
  347. package/src/widgets/index.ts +1 -0
  348. package/src/widgets/nav/MenuItem.tsx +3 -2
  349. package/src/widgets/nav/Route.ts +142 -142
  350. package/src/widgets/nav/Scroller.tsx +8 -9
  351. package/src/widgets/nav/Tab.ts +2 -2
  352. package/src/widgets/overlay/ContextMenu.ts +42 -42
  353. package/src/widgets/overlay/Dropdown.tsx +762 -762
  354. package/src/widgets/overlay/MsgBox.tsx +141 -141
  355. package/src/widgets/overlay/Overlay.tsx +5 -4
  356. package/src/widgets/overlay/Toast.ts +111 -111
  357. package/src/widgets/overlay/Window.tsx +299 -299
  358. package/src/widgets/overlay/alerts.ts +46 -46
  359. package/src/widgets/overlay/captureMouse.ts +195 -195
  360. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  361. package/src/widgets/overlay/index.d.ts +11 -11
  362. package/src/widgets/overlay/index.ts +11 -11
  363. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -0,0 +1,112 @@
1
+ import { StringTemplate } from "./StringTemplate";
2
+ import assert from "assert";
3
+ describe("StringTemplate", function () {
4
+ describe("#compile()", function () {
5
+ it("returns a selector", function () {
6
+ var e = StringTemplate.compile("Hello {person.name}");
7
+ var state = {
8
+ person: {
9
+ name: "Jim",
10
+ },
11
+ };
12
+ assert.equal(e(state), "Hello Jim");
13
+ });
14
+ it("allows empty strings", function () {
15
+ let e = StringTemplate.compile("");
16
+ assert.equal(e({}), "");
17
+ });
18
+ it("properly encodes ' and \"", function () {
19
+ var e = StringTemplate.compile('It\'s "working"!');
20
+ assert.equal(e({}), 'It\'s "working"!');
21
+ });
22
+ it("allows \\ before a binding", function () {
23
+ var e = StringTemplate.compile("t\\{person.name}");
24
+ assert.equal(e({ person: { name: "Ogi" } }), "t\\Ogi");
25
+ });
26
+ it("supports multi-line strings", function () {
27
+ var e = StringTemplate.compile("a\nb");
28
+ assert.equal(e({}), "a\nb");
29
+ var e = StringTemplate.compile("a\r\nb");
30
+ assert.equal(e({}), "a\r\nb");
31
+ });
32
+ });
33
+ describe("double brackets are used to escape brackets", function () {
34
+ it("double brackets are preserved", function () {
35
+ var e = StringTemplate.compile("Hello {{person.name}}");
36
+ var state = {
37
+ person: {
38
+ name: "Jim",
39
+ },
40
+ };
41
+ assert.equal(e(state), "Hello {person.name}");
42
+ });
43
+ it("triple brackets are converted to single brackets and a binding", function () {
44
+ var e = StringTemplate.compile("Hello {{{person.name}}}");
45
+ var state = {
46
+ person: {
47
+ name: "Jim",
48
+ },
49
+ };
50
+ assert.equal(e(state), "Hello {Jim}");
51
+ });
52
+ it("open brackets are ignored", function () {
53
+ var e = StringTemplate.compile("B { A");
54
+ assert.equal(e({}), "B { A");
55
+ });
56
+ });
57
+ describe("supports formatting", function () {
58
+ it("with colon", function () {
59
+ var e = StringTemplate.compile("{str:suffix;kg}");
60
+ assert.equal(e({ str: "5" }), "5kg");
61
+ });
62
+ it("with multiple formats", function () {
63
+ var e = StringTemplate.compile("{str:suffix;kg:wrap;(;)}");
64
+ assert.equal(e({ str: "5" }), "(5kg)");
65
+ });
66
+ it("with null values", function () {
67
+ var e = StringTemplate.compile("{str:suffix;kg:|N/A}");
68
+ assert.equal(e({ str: null }), "N/A");
69
+ });
70
+ it("of null values", function () {
71
+ var e = StringTemplate.compile("{str|N/A}");
72
+ assert.equal(e({ str: null }), "N/A");
73
+ });
74
+ });
75
+ describe("properly handles backslashes", function () {
76
+ it("in a string", function () {
77
+ var e = StringTemplate.compile("a\\b");
78
+ assert.equal(e({}), "a\\b");
79
+ });
80
+ it("before a special character", function () {
81
+ var e = StringTemplate.compile("\\t");
82
+ assert.equal(e({}), "\\t");
83
+ });
84
+ });
85
+ describe("supports expressions", function () {
86
+ it("using []", function () {
87
+ var e = StringTemplate.compile("1 + 2 = {[1+2]}");
88
+ assert.equal(e({}), "1 + 2 = 3");
89
+ });
90
+ it("using %", function () {
91
+ var e = StringTemplate.compile("1 + 2 = %{1+2}");
92
+ assert.equal(e({}), "1 + 2 = 3");
93
+ });
94
+ it("with subexpressions", function () {
95
+ var e = StringTemplate.compile("1 + 2 = {[%{1+2}]}");
96
+ assert.equal(e({}), "1 + 2 = 3");
97
+ });
98
+ it("with a conditional operator", function () {
99
+ var e = StringTemplate.compile("1 + 2 = {[true ? 3 : 2]:s}");
100
+ assert.equal(e({}), "1 + 2 = 3");
101
+ });
102
+ it("with sub-expression formatting", function () {
103
+ var e = StringTemplate.compile("{[!!{person.age} ? {person.age:suffix; years old} : 'Age unknown']}");
104
+ var state = {
105
+ person: {
106
+ age: 32,
107
+ },
108
+ };
109
+ assert.equal(e(state), "32 years old");
110
+ });
111
+ });
112
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ //@ts-nocheck
2
+ import { StructuredSelector } from "./StructuredSelector";
3
+ import assert from "assert";
4
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
5
+ describe("StructuredSelector", function () {
6
+ describe("#create()", function () {
7
+ it("constants", function () {
8
+ var x = {};
9
+ var s = new StructuredSelector({
10
+ props: {
11
+ a: undefined,
12
+ b: undefined,
13
+ },
14
+ values: {
15
+ a: 1,
16
+ b: 2,
17
+ },
18
+ }).create(x);
19
+ assert.deepEqual(s(x), { a: 1, b: 2 });
20
+ });
21
+ it("bindings", function () {
22
+ var x = { a: 1, b: 2 };
23
+ var s = new StructuredSelector({
24
+ props: {
25
+ a: undefined,
26
+ b: undefined,
27
+ },
28
+ values: {
29
+ a: { bind: "b" },
30
+ b: { bind: "a" },
31
+ },
32
+ }).create(x);
33
+ assert.deepEqual(s(x), { a: 2, b: 1 });
34
+ });
35
+ it("templates", function () {
36
+ var x = { a: 1, b: 2 };
37
+ var s = new StructuredSelector({
38
+ props: {
39
+ a: undefined,
40
+ b: undefined,
41
+ },
42
+ values: {
43
+ a: { tpl: "b{a}" },
44
+ b: { tpl: "a{b}" },
45
+ },
46
+ }).create(x);
47
+ assert.deepEqual(s(x), { a: "b1", b: "a2" });
48
+ });
49
+ it("structured", function () {
50
+ var x = { a: 1, b: 2 };
51
+ var s = new StructuredSelector({
52
+ props: {
53
+ a: {
54
+ structured: true,
55
+ },
56
+ b: undefined,
57
+ },
58
+ values: {
59
+ a: {
60
+ x: { expr: "{a} == 1" },
61
+ y: { expr: "{b} == 1" },
62
+ },
63
+ b: { tpl: "a{b}" },
64
+ },
65
+ }).create(x);
66
+ assert.deepEqual(s(x), { a: { x: true, y: false }, b: "a2" });
67
+ });
68
+ });
69
+ it("structures do not change if data doesn't change", function () {
70
+ var x = { a: 1, b: 2 };
71
+ var s = new StructuredSelector({
72
+ props: {
73
+ a: {
74
+ structured: true,
75
+ },
76
+ },
77
+ values: {
78
+ a: {
79
+ x: { expr: "{a} == 1" },
80
+ y: { expr: "{b} == 1" },
81
+ },
82
+ b: { tpl: "a{b}" },
83
+ },
84
+ }).create(x);
85
+ let r1 = s(x);
86
+ let r2 = s(x);
87
+ assert.equal(r1, r2);
88
+ });
89
+ it("structures do not change if data doesn't change", function () {
90
+ var x = { a: { b: 2 } };
91
+ var m = createAccessorModelProxy();
92
+ var s = new StructuredSelector({
93
+ props: {
94
+ b: undefined,
95
+ },
96
+ values: {
97
+ b: m.a.b,
98
+ },
99
+ }).create(x);
100
+ assert.deepEqual(s(x), { b: 2 });
101
+ });
102
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ //@ts-nocheck
2
+ import assert from 'assert';
3
+ import { Store } from './Store';
4
+ describe('View', () => {
5
+ const getStore = () => {
6
+ return new Store({
7
+ data: {
8
+ a: 3,
9
+ item: {
10
+ firstName: 'Jack'
11
+ }
12
+ }
13
+ });
14
+ };
15
+ describe('.get', () => {
16
+ it('retrieves a value pointed by a selector path', () => {
17
+ let store = getStore();
18
+ assert.equal(store.get('item.firstName'), 'Jack');
19
+ });
20
+ it('will return an array if multiple arguments are passed', () => {
21
+ let store = getStore();
22
+ assert.deepEqual(store.get('a', 'item.firstName'), [3, 'Jack']);
23
+ });
24
+ it('will return an array if array is passed', () => {
25
+ let store = getStore();
26
+ assert.deepEqual(store.get(['a', 'item.firstName']), [3, 'Jack']);
27
+ });
28
+ });
29
+ describe('.set', () => {
30
+ it('supports deep selectors', () => {
31
+ let store = getStore();
32
+ store.set('item.firstName', 'Jill');
33
+ assert.equal(store.get('item.firstName'), 'Jill');
34
+ });
35
+ it('supports setting multiple items through an object', () => {
36
+ let store = getStore();
37
+ store.set({
38
+ 'b': 4,
39
+ 'item.firstName': 'Jill'
40
+ });
41
+ assert.deepEqual(store.get(['b', 'item.firstName']), [4, 'Jill']);
42
+ });
43
+ });
44
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import assert from "assert";
2
+ import { Binding } from "./Binding";
3
+ import { Store } from "./Store";
4
+ import { ZoomIntoPropertyView } from "./ZoomIntoPropertyView";
5
+ describe("ZoomIntoPropertyView", () => {
6
+ const getZoom = () => {
7
+ let store = new Store({
8
+ data: {
9
+ a: 3,
10
+ item: {
11
+ firstName: "Jack",
12
+ },
13
+ },
14
+ });
15
+ return new ZoomIntoPropertyView({
16
+ store: store,
17
+ binding: Binding.get("item"),
18
+ });
19
+ };
20
+ it("allows direct access to properties of zoomed object", () => {
21
+ let zoom = getZoom();
22
+ assert.equal(zoom.get("firstName"), "Jack");
23
+ });
24
+ it("allows access to outside data through $root", () => {
25
+ let zoom = getZoom();
26
+ assert.equal(zoom.get("$root.a"), 3);
27
+ });
28
+ it("correctly sets zoomed object", () => {
29
+ let zoom = getZoom();
30
+ zoom.set("firstName", "Joe");
31
+ assert.equal(zoom.get("firstName"), "Joe");
32
+ });
33
+ it("correctly sets zoomed values", () => {
34
+ let zoom = getZoom();
35
+ zoom.set("firstName", "Joe");
36
+ assert.equal(zoom.get("firstName"), "Joe");
37
+ assert.equal(zoom.get("$root.item.firstName"), "Joe");
38
+ });
39
+ it("correctly sets outside values", () => {
40
+ let zoom = getZoom();
41
+ zoom.set("$root.a", 6);
42
+ assert.equal(zoom.get("$root.a"), 6);
43
+ });
44
+ it("correctly deletes zoomed values", () => {
45
+ let zoom = getZoom();
46
+ zoom.delete("firstName");
47
+ assert.equal(zoom.get("firstName"), undefined);
48
+ });
49
+ it("correctly deletes outside values", () => {
50
+ let zoom = getZoom();
51
+ zoom.delete("$root.a");
52
+ assert.equal(zoom.get("$root.a"), undefined);
53
+ });
54
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import { sorter } from "./comparer";
2
+ import assert from "assert";
3
+ describe("comparer", function () {
4
+ describe("sorter", function () {
5
+ it("orders by numeric values ASC", function () {
6
+ let records = [
7
+ { value: 3, id: 1 },
8
+ { value: -1, id: 2 },
9
+ { value: 2, id: 3 },
10
+ { value: null, id: 4 },
11
+ { value: null, id: 5 },
12
+ ];
13
+ let sort = sorter([{ value: { bind: "value" }, direction: "ASC" }]);
14
+ let sorted = sort(records);
15
+ assert.equal(sorted[0].value, -1);
16
+ assert.equal(sorted[1].value, 2);
17
+ assert.equal(sorted[2].value, 3);
18
+ assert.equal(sorted[3].value, null);
19
+ assert.equal(sorted[4].value, null);
20
+ });
21
+ it("orders by numeric values DESC", function () {
22
+ let records = [
23
+ { value: 3, id: 1 },
24
+ { value: 1, id: 2 },
25
+ { value: -2, id: 3 },
26
+ { value: null, id: 4 },
27
+ { value: null, id: 5 },
28
+ ];
29
+ let sort = sorter([{ value: { bind: "value" }, direction: "DESC" }]);
30
+ let sorted = sort(records);
31
+ assert.equal(sorted[0].value, 3);
32
+ assert.equal(sorted[1].value, 1);
33
+ assert.equal(sorted[2].value, -2);
34
+ assert.equal(sorted[3].value, null);
35
+ assert.equal(sorted[4].value, null);
36
+ });
37
+ it("supports field", function () {
38
+ let records = [
39
+ { value: 3, id: 1 },
40
+ { value: 1, id: 2 },
41
+ { value: 2, id: 3 },
42
+ ];
43
+ let sort = sorter([{ field: "value", direction: "ASC" }]);
44
+ let sorted = sort(records);
45
+ assert.equal(sorted[0].value, 1);
46
+ assert.equal(sorted[1].value, 2);
47
+ assert.equal(sorted[2].value, 3);
48
+ });
49
+ });
50
+ });
@@ -2,9 +2,6 @@ import { AccessorChain } from "./createAccessorModelProxy";
2
2
  import { CanMemoize, MemoSelector, Selector } from "./Selector";
3
3
  export type ComputableSelector<T = any> = string | Selector<T> | AccessorChain<T> | CanMemoize<T>;
4
4
  export type InferSelectorValue<T> = T extends Selector<infer R> ? R : T extends AccessorChain<infer R> ? R : T extends string ? any : never;
5
- export declare function computable<Selectors extends readonly any[], R>(...args: [
6
- ...selectors: ComputableSelector[],
7
- compute: (...values: {
8
- [K in keyof Selectors]: InferSelectorValue<Selectors[K]>;
9
- }) => R
10
- ]): MemoSelector<R>;
5
+ export declare function computable<T extends ComputableSelector[], R>(...args: [...T, (...values: {
6
+ [K in keyof T]: InferSelectorValue<T[K]>;
7
+ }) => R]): MemoSelector<R>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { computable } from "./computable";
2
+ import assert from "assert";
3
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
4
+ describe("computable", function () {
5
+ it("creates a selector", function () {
6
+ let state = { person: { name: "Joe" } };
7
+ let nameLength = computable("person.name", (name) => name.length);
8
+ assert.equal(nameLength(state), 3);
9
+ });
10
+ it("fires every time if not memoized", function () {
11
+ let state = { person: { name: "Joe" } };
12
+ let fired = 0;
13
+ let nameLength = computable("person.name", (name) => {
14
+ fired++;
15
+ return name.length;
16
+ });
17
+ assert.equal(nameLength(state), 3);
18
+ assert.equal(nameLength(state), 3);
19
+ assert.equal(fired, 2);
20
+ });
21
+ it("fires once if memoized and data has not changed", function () {
22
+ let state = { person: { name: "Joe" } };
23
+ let fired = 0;
24
+ let nameLength = computable("person.name", (name) => {
25
+ fired++;
26
+ return name.length;
27
+ }).memoize();
28
+ assert.equal(nameLength(state), 3);
29
+ assert.equal(nameLength(state), 3);
30
+ assert.equal(fired, 1);
31
+ });
32
+ //weird but that's how triggers work and
33
+ it("memoize with warmup data will not call compute", function () {
34
+ let state = { person: { name: "Joe" } };
35
+ let fired = 0;
36
+ let nameLength = computable("person.name", (name) => {
37
+ fired++;
38
+ return name.length;
39
+ }).memoize(state);
40
+ assert.equal(nameLength(state), undefined);
41
+ assert.equal(nameLength(state), undefined);
42
+ assert.equal(fired, 0);
43
+ });
44
+ it("works with accessors", function () {
45
+ var m = createAccessorModelProxy();
46
+ let state = { person: { name: "Joe" } };
47
+ let nameLength = computable(m.person.name, (name) => name.length);
48
+ assert.equal(nameLength(state), 3);
49
+ });
50
+ it("works with array length accessor", function () {
51
+ var m = createAccessorModelProxy();
52
+ let state = { items: ["a", "b", "c"] };
53
+ let itemCount = computable(m.items.length, (length) => length);
54
+ assert.equal(itemCount(state), 3);
55
+ });
56
+ });
@@ -6,12 +6,14 @@ interface AccessorChainMethods {
6
6
  type AccessorChainMap<M extends object> = {
7
7
  [prop in Exclude<keyof M, keyof AccessorChainMethods>]: AccessorChain<M[prop]>;
8
8
  };
9
+ type IsAny<T> = 0 extends 1 & T ? true : false;
9
10
  export type AccessorChain<M> = {
10
11
  toString(): string;
11
- valueOf(): string;
12
+ valueOf(): M | undefined;
12
13
  nameOf(): string;
13
- __accessorChainType?: M;
14
- } & (M extends object ? AccessorChainMap<M> : {});
14
+ } & (IsAny<M> extends true ? {
15
+ [key: string]: any;
16
+ } : M extends object ? AccessorChainMap<M> : {});
15
17
  export declare function createAccessorModelProxy<M>(chain?: string): AccessorChain<M>;
16
18
  export declare function isAccessorChain<M>(value: unknown): value is AccessorChain<M>;
17
19
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
2
+ import assert from "assert";
3
+ describe("createAccessorModelProxy", () => {
4
+ it("generates correct paths", () => {
5
+ let model = createAccessorModelProxy();
6
+ assert.strictEqual(model.firstName.toString(), "firstName");
7
+ assert.strictEqual(model.address.toString(), "address");
8
+ assert.strictEqual(model.address.city.toString(), "address.city");
9
+ });
10
+ it("can be used in string templates", () => {
11
+ let model = createAccessorModelProxy();
12
+ assert.strictEqual("address.city", `${model.address.city}`);
13
+ assert.strictEqual("address.city", "" + model.address.city);
14
+ assert.strictEqual("address.city.suffix", model.address.city + ".suffix");
15
+ });
16
+ it("nameOf returns name of the last prop ", () => {
17
+ let model = createAccessorModelProxy();
18
+ assert.strictEqual(model.firstName.nameOf(), "firstName");
19
+ assert.strictEqual(model.address.nameOf(), "address");
20
+ assert.strictEqual(model.address.city.nameOf(), "city");
21
+ assert.strictEqual(model.address.nameOf(), "address");
22
+ let { streetNumber, city } = model.address;
23
+ assert.strictEqual(streetNumber.nameOf(), "streetNumber");
24
+ assert.strictEqual(city.nameOf(), "city");
25
+ });
26
+ it("allows non-standard property identifiers ", () => {
27
+ let model = createAccessorModelProxy();
28
+ assert.strictEqual(model["@crazy"].nameOf(), "@crazy");
29
+ });
30
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ import { createStructuredSelector } from "./createStructuredSelector";
2
+ import assert from "assert";
3
+ import { getSelector } from "./getSelector";
4
+ import { computable } from "./computable";
5
+ describe("createStructuredSelector", function () {
6
+ it("works", function () {
7
+ let structure = {
8
+ name: getSelector({ bind: "name" }),
9
+ };
10
+ let state = { name: "Joe" };
11
+ let selector = createStructuredSelector(structure);
12
+ assert.deepEqual(selector(state), { name: "Joe" });
13
+ });
14
+ it("does not memoize by default", function () {
15
+ let computes = 0;
16
+ let structure = {
17
+ name: computable("name", (name) => {
18
+ computes++;
19
+ return name;
20
+ }),
21
+ };
22
+ let state = { name: "Joe" };
23
+ let selector = createStructuredSelector(structure);
24
+ assert.deepEqual(selector(state), { name: "Joe" });
25
+ selector(state);
26
+ assert.deepEqual(computes, 2);
27
+ });
28
+ it("supports memoize", function () {
29
+ let computes = 0;
30
+ let structure = {
31
+ name: computable("name", (name) => {
32
+ computes++;
33
+ return name;
34
+ }),
35
+ };
36
+ let state = { name: "Joe" };
37
+ let selector = createStructuredSelector(structure).memoize();
38
+ assert.deepEqual(selector(state), { name: "Joe" });
39
+ selector(state);
40
+ assert.deepEqual(computes, 1);
41
+ });
42
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
1
+ //@ts-nocheck
2
+ import assert from 'assert';
3
+ import { diffArrays } from './diffArrays';
4
+ describe('diffArrays', function () {
5
+ it('should detect new elements', function () {
6
+ var a = [];
7
+ var b = [{ k: 1 }, { k: 2 }];
8
+ var d = diffArrays(a, b);
9
+ assert.deepEqual(d, {
10
+ added: [{ k: 1 }, { k: 2 }],
11
+ removed: [],
12
+ unchanged: [],
13
+ changed: []
14
+ });
15
+ });
16
+ it('should detect removed elements', function () {
17
+ var a = [];
18
+ var b = [{ k: 1 }, { k: 2 }];
19
+ var d = diffArrays(b, a);
20
+ assert.deepEqual(d, {
21
+ removed: [{ k: 1 }, { k: 2 }],
22
+ added: [],
23
+ unchanged: [],
24
+ changed: []
25
+ });
26
+ });
27
+ it('should detect changed elements', function () {
28
+ var a = [{ k: 1, v: 2 }];
29
+ var b = [{ k: 1 }, { k: 2 }];
30
+ var d = diffArrays(a, b, x => x.k);
31
+ assert.deepEqual(d, {
32
+ added: [{ k: 2 }],
33
+ removed: [],
34
+ unchanged: [],
35
+ changed: [{
36
+ after: {
37
+ k: 1
38
+ },
39
+ before: {
40
+ k: 1, v: 2
41
+ }
42
+ }]
43
+ });
44
+ });
45
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import assert from "assert";
2
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
3
+ import { getAccessor } from "./getAccessor";
4
+ describe("getAccessor", function () {
5
+ it("works with accessor chains", function () {
6
+ let m = createAccessorModelProxy();
7
+ let accessor = getAccessor(m.a.b);
8
+ assert(typeof accessor.set == "function");
9
+ });
10
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ import { getSelector } from "./getSelector";
2
+ import assert from "assert";
3
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
4
+ describe("getSelector", function () {
5
+ it("array of selectors converts each element into a selector", function () {
6
+ let arraySelector = [{ bind: "name" }, { expr: "{name}" }];
7
+ let state = { name: "Joe" };
8
+ let selector = getSelector(arraySelector);
9
+ assert.deepEqual(selector(state), ["Joe", "Joe"]);
10
+ });
11
+ it("get can be used for selectors that have set defined too ", function () {
12
+ let selector = getSelector({ get: (data) => data.name, set: () => { } });
13
+ assert.deepEqual(selector({ name: "Jack" }), "Jack");
14
+ });
15
+ it("0 is a valid selector", function () {
16
+ let selector = getSelector(0);
17
+ assert.deepEqual(selector({}), 0);
18
+ });
19
+ it("false is a valid selector", function () {
20
+ let selector = getSelector(false);
21
+ assert.deepEqual(selector({}), false);
22
+ });
23
+ it("undefined is a valid selector", function () {
24
+ let selector = getSelector(undefined);
25
+ assert(selector({}) === undefined);
26
+ });
27
+ it("null is a valid selector", function () {
28
+ let selector = getSelector(null);
29
+ assert(selector({}) === null);
30
+ });
31
+ it("works with accessor chains", function () {
32
+ let m = createAccessorModelProxy();
33
+ let selector = getSelector(m.a.b);
34
+ assert(selector({ a: { b: 1 } }) === 1);
35
+ });
36
+ });
@@ -0,0 +1 @@
1
+ export {};