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,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 {};