cx 26.0.14 → 26.1.0

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 (249) hide show
  1. package/build/ui/VDOM.d.ts +1 -20
  2. package/build/ui/VDOM.js +1 -3
  3. package/build/ui/Widget.d.ts +1 -1
  4. package/build/ui/app/startAppLoop.js +2 -10
  5. package/build/widgets/form/Checkbox.d.ts +0 -1
  6. package/build/widgets/form/Checkbox.js +1 -0
  7. package/build/widgets/form/ColorField.d.ts +0 -1
  8. package/build/widgets/form/ColorField.js +2 -2
  9. package/build/widgets/form/DateTimeField.d.ts +0 -2
  10. package/build/widgets/form/DateTimeField.js +1 -0
  11. package/build/widgets/form/DateTimePicker.d.ts +0 -2
  12. package/build/widgets/form/DateTimePicker.js +1 -0
  13. package/build/widgets/form/Radio.d.ts +0 -1
  14. package/build/widgets/form/Slider.js +9 -1
  15. package/build/widgets/form/Switch.d.ts +0 -1
  16. package/build/widgets/form/Switch.js +1 -1
  17. package/build/widgets/form/Wheel.d.ts +0 -1
  18. package/build/widgets/grid/Grid.d.ts +0 -2
  19. package/build/widgets/grid/GridCellEditor.js +3 -1
  20. package/build/widgets/overlay/Overlay.d.ts +3 -0
  21. package/build/widgets/overlay/Overlay.js +3 -2
  22. package/dist/manifest.js +816 -816
  23. package/dist/ui.js +3 -10
  24. package/dist/widgets.js +18 -6
  25. package/package.json +9 -8
  26. package/src/charts/Chart.ts +108 -108
  27. package/src/data/ArrayElementView.ts +90 -90
  28. package/src/data/AugmentedViewBase.ts +88 -88
  29. package/src/data/Binding.ts +104 -104
  30. package/src/data/ExposedRecordView.ts +95 -95
  31. package/src/data/ExposedValueView.ts +89 -89
  32. package/src/data/Expression.spec.ts +229 -229
  33. package/src/data/Expression.ts +233 -233
  34. package/src/data/Grouper.spec.ts +57 -57
  35. package/src/data/Grouper.ts +158 -158
  36. package/src/data/NestedDataView.ts +43 -43
  37. package/src/data/ReadOnlyDataView.ts +39 -39
  38. package/src/data/Ref.ts +104 -104
  39. package/src/data/Selector.ts +10 -10
  40. package/src/data/Store.ts +52 -52
  41. package/src/data/StoreProxy.ts +19 -19
  42. package/src/data/StoreRef.ts +66 -66
  43. package/src/data/StringTemplate.spec.ts +132 -132
  44. package/src/data/StringTemplate.ts +93 -93
  45. package/src/data/StructuredSelector.spec.ts +113 -113
  46. package/src/data/StructuredSelector.ts +146 -146
  47. package/src/data/SubscribableView.ts +63 -63
  48. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  49. package/src/data/ZoomIntoPropertyView.ts +45 -45
  50. package/src/data/computable.spec.ts +87 -87
  51. package/src/data/createStructuredSelector.ts +62 -62
  52. package/src/data/getAccessor.spec.ts +11 -11
  53. package/src/data/getAccessor.ts +74 -74
  54. package/src/data/getSelector.spec.ts +43 -43
  55. package/src/data/getSelector.ts +66 -66
  56. package/src/data/ops/filter.spec.ts +35 -35
  57. package/src/data/ops/filter.ts +9 -9
  58. package/src/data/ops/merge.ts +13 -13
  59. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  60. package/src/data/ops/updateArray.spec.ts +69 -69
  61. package/src/data/test-types.ts +7 -7
  62. package/src/hooks/useTrigger.ts +26 -26
  63. package/src/index.scss +6 -6
  64. package/src/jsx-dev-runtime.ts +4 -4
  65. package/src/svg/BoundedObject.ts +101 -101
  66. package/src/svg/util/Rect.ts +105 -105
  67. package/src/ui/CSSHelper.ts +17 -17
  68. package/src/ui/Culture.ts +159 -159
  69. package/src/ui/DataProxy.ts +55 -55
  70. package/src/ui/FocusManager.ts +171 -171
  71. package/src/ui/Instance.ts +866 -866
  72. package/src/ui/Prop.ts +140 -140
  73. package/src/ui/RenderingContext.ts +99 -99
  74. package/src/ui/Rescope.ts +49 -49
  75. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  76. package/src/ui/VDOM.ts +1 -34
  77. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  78. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  79. package/src/ui/adapter/TreeAdapter.ts +185 -185
  80. package/src/ui/app/History.ts +133 -133
  81. package/src/ui/app/Url.spec.ts +50 -50
  82. package/src/ui/app/startAppLoop.tsx +5 -9
  83. package/src/ui/app/startHotAppLoop.ts +41 -41
  84. package/src/ui/layout/Content.ts +30 -30
  85. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  86. package/src/util/Console.ts +13 -13
  87. package/src/util/Format.spec.ts +69 -69
  88. package/src/util/Format.ts +267 -267
  89. package/src/util/addEventListenerWithOptions.ts +41 -41
  90. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  91. package/src/util/color/rgbToHsl.ts +35 -35
  92. package/src/util/getActiveElement.ts +4 -4
  93. package/src/util/hasKey.ts +18 -18
  94. package/src/util/index.ts +55 -55
  95. package/src/util/innerTextTrim.ts +10 -10
  96. package/src/util/isArray.ts +3 -3
  97. package/src/util/isDataRecord.ts +5 -5
  98. package/src/util/isDefined.ts +3 -3
  99. package/src/util/isString.ts +3 -3
  100. package/src/widgets/DocumentTitle.ts +95 -95
  101. package/src/widgets/Sandbox.ts +103 -103
  102. package/src/widgets/autoFocus.ts +9 -9
  103. package/src/widgets/cx.ts +63 -63
  104. package/src/widgets/form/Checkbox.tsx +0 -1
  105. package/src/widgets/form/ColorField.tsx +15 -12
  106. package/src/widgets/form/DateTimeField.tsx +0 -2
  107. package/src/widgets/form/DateTimePicker.tsx +0 -2
  108. package/src/widgets/form/Radio.tsx +0 -1
  109. package/src/widgets/form/Slider.tsx +12 -4
  110. package/src/widgets/form/Switch.tsx +2 -3
  111. package/src/widgets/form/Wheel.tsx +0 -1
  112. package/src/widgets/grid/Grid.tsx +0 -1
  113. package/src/widgets/grid/GridCell.ts +143 -143
  114. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  115. package/src/widgets/icons/calendar.tsx +17 -17
  116. package/src/widgets/icons/check.tsx +13 -13
  117. package/src/widgets/icons/clear.tsx +15 -15
  118. package/src/widgets/icons/close.tsx +20 -20
  119. package/src/widgets/icons/cx.tsx +38 -38
  120. package/src/widgets/icons/drop-down.tsx +15 -15
  121. package/src/widgets/icons/file.tsx +13 -13
  122. package/src/widgets/icons/folder-open.tsx +15 -15
  123. package/src/widgets/icons/folder.tsx +13 -13
  124. package/src/widgets/icons/forward.tsx +22 -22
  125. package/src/widgets/icons/loading.tsx +24 -24
  126. package/src/widgets/icons/menu.tsx +17 -17
  127. package/src/widgets/icons/pixel-picker.tsx +18 -18
  128. package/src/widgets/icons/search.tsx +13 -13
  129. package/src/widgets/icons/sort-asc.tsx +14 -14
  130. package/src/widgets/icons/square.tsx +18 -18
  131. package/src/widgets/nav/Route.ts +142 -142
  132. package/src/widgets/overlay/Dropdown.tsx +762 -762
  133. package/src/widgets/overlay/MsgBox.tsx +141 -141
  134. package/src/widgets/overlay/Overlay.tsx +5 -1
  135. package/src/widgets/overlay/Toast.ts +111 -111
  136. package/src/widgets/overlay/Window.tsx +299 -299
  137. package/src/widgets/overlay/alerts.ts +46 -46
  138. package/src/widgets/overlay/captureMouse.ts +195 -195
  139. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  140. package/src/widgets/overlay/index.d.ts +11 -11
  141. package/src/widgets/overlay/index.ts +11 -11
  142. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  143. package/build/data/ArrayElementView.spec.d.ts +0 -1
  144. package/build/data/ArrayElementView.spec.js +0 -81
  145. package/build/data/Binding.spec.d.ts +0 -1
  146. package/build/data/Binding.spec.js +0 -61
  147. package/build/data/Expression.spec.d.ts +0 -1
  148. package/build/data/Expression.spec.js +0 -196
  149. package/build/data/Grouper.spec.d.ts +0 -1
  150. package/build/data/Grouper.spec.js +0 -48
  151. package/build/data/Ref.spec.d.ts +0 -1
  152. package/build/data/Ref.spec.js +0 -72
  153. package/build/data/Store.spec.d.ts +0 -1
  154. package/build/data/Store.spec.js +0 -19
  155. package/build/data/StoreRef.spec.d.ts +0 -1
  156. package/build/data/StoreRef.spec.js +0 -22
  157. package/build/data/StringTemplate.spec.d.ts +0 -1
  158. package/build/data/StringTemplate.spec.js +0 -112
  159. package/build/data/StructuredSelector.spec.d.ts +0 -1
  160. package/build/data/StructuredSelector.spec.js +0 -102
  161. package/build/data/View.spec.d.ts +0 -1
  162. package/build/data/View.spec.js +0 -44
  163. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  164. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  165. package/build/data/comparer.spec.d.ts +0 -1
  166. package/build/data/comparer.spec.js +0 -50
  167. package/build/data/computable.spec.d.ts +0 -1
  168. package/build/data/computable.spec.js +0 -56
  169. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  170. package/build/data/createAccessorModelProxy.spec.js +0 -30
  171. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  172. package/build/data/createStructuredSelector.spec.js +0 -42
  173. package/build/data/diff/diffs.spec.d.ts +0 -1
  174. package/build/data/diff/diffs.spec.js +0 -45
  175. package/build/data/getAccessor.spec.d.ts +0 -1
  176. package/build/data/getAccessor.spec.js +0 -10
  177. package/build/data/getSelector.spec.d.ts +0 -1
  178. package/build/data/getSelector.spec.js +0 -36
  179. package/build/data/ops/append.spec.d.ts +0 -1
  180. package/build/data/ops/append.spec.js +0 -24
  181. package/build/data/ops/filter.spec.d.ts +0 -1
  182. package/build/data/ops/filter.spec.js +0 -25
  183. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  184. package/build/data/ops/findTreeNode.spec.js +0 -20
  185. package/build/data/ops/merge.spec.d.ts +0 -1
  186. package/build/data/ops/merge.spec.js +0 -23
  187. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  188. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  189. package/build/data/ops/updateArray.spec.d.ts +0 -1
  190. package/build/data/ops/updateArray.spec.js +0 -33
  191. package/build/data/ops/updateTree.spec.d.ts +0 -1
  192. package/build/data/ops/updateTree.spec.js +0 -44
  193. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  194. package/build/hooks/invokeCallback.spec.js +0 -44
  195. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  196. package/build/hooks/resolveCallback.spec.js +0 -35
  197. package/build/hooks/store.spec.d.ts +0 -1
  198. package/build/hooks/store.spec.js +0 -48
  199. package/build/hooks/useTrigger.spec.d.ts +0 -1
  200. package/build/hooks/useTrigger.spec.js +0 -59
  201. package/build/ui/Controller.spec.d.ts +0 -1
  202. package/build/ui/Controller.spec.js +0 -247
  203. package/build/ui/Cx.spec.d.ts +0 -1
  204. package/build/ui/Cx.spec.js +0 -153
  205. package/build/ui/DataProxy.spec.d.ts +0 -1
  206. package/build/ui/DataProxy.spec.js +0 -208
  207. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  208. package/build/ui/IsolatedScope.spec.js +0 -42
  209. package/build/ui/PureContainer.spec.d.ts +0 -1
  210. package/build/ui/PureContainer.spec.js +0 -149
  211. package/build/ui/Repeater.spec.d.ts +0 -1
  212. package/build/ui/Repeater.spec.js +0 -109
  213. package/build/ui/Rescope.spec.d.ts +0 -1
  214. package/build/ui/Rescope.spec.js +0 -134
  215. package/build/ui/Restate.spec.d.ts +0 -1
  216. package/build/ui/Restate.spec.js +0 -257
  217. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  218. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  219. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  220. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  221. package/build/ui/app/Url.spec.d.ts +0 -1
  222. package/build/ui/app/Url.spec.js +0 -43
  223. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  224. package/build/ui/createFunctionalComponent.spec.js +0 -272
  225. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  226. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  227. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  228. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  229. package/build/util/Format.spec.d.ts +0 -1
  230. package/build/util/Format.spec.js +0 -58
  231. package/build/util/TraversalStack.spec.d.ts +0 -1
  232. package/build/util/TraversalStack.spec.js +0 -43
  233. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  234. package/build/util/date/upperBoundCheck.spec.js +0 -22
  235. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  236. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  237. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  238. package/build/util/isValidIdentifierName.spec.js +0 -28
  239. package/build/util/routeAppend.spec.d.ts +0 -1
  240. package/build/util/routeAppend.spec.js +0 -14
  241. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  242. package/build/widgets/AccessorBindings.spec.js +0 -40
  243. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  244. package/build/widgets/HtmlElement.spec.js +0 -38
  245. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  246. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  247. package/build/widgets/nav/Route.spec.d.ts +0 -1
  248. package/build/widgets/nav/Route.spec.js +0 -15
  249. package/dist/manifest.d.ts +0 -1443
@@ -1,101 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "cx/jsx-runtime";
2
- import { Store } from "../../data/Store";
3
- import { expr } from "../expr";
4
- import { createTestRenderer } from "../../util/test/createTestRenderer";
5
- import assert from "assert";
6
- import { FirstVisibleChildLayout } from "./FirstVisibleChildLayout";
7
- import { UseParentLayout } from "./UseParentLayout";
8
- import { PureContainer } from "../PureContainer";
9
- import { createFunctionalComponent } from "../createFunctionalComponent";
10
- describe("FirstVisibleChildLayout", () => {
11
- it("renders only the first child", () => {
12
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx("header", {}), _jsx("main", {}), _jsx("footer", {})] }) }));
13
- let store = new Store();
14
- const component = createTestRenderer(store, widget);
15
- let tree = component.toJSON();
16
- assert.deepEqual(tree, {
17
- type: "div",
18
- props: {},
19
- children: [{ type: "header", props: {}, children: null }],
20
- });
21
- });
22
- it("does not process other widgets", () => {
23
- let h = false, m = false, f = false;
24
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx("header", { onInit: () => {
25
- h = true;
26
- } }), _jsx("main", { onInit: () => {
27
- m = true;
28
- } }), _jsx("footer", { onInit: () => {
29
- f = true;
30
- } })] }) }));
31
- let store = new Store();
32
- const component = createTestRenderer(store, widget);
33
- let tree = component.toJSON();
34
- assert.deepEqual(tree, {
35
- type: "div",
36
- props: {},
37
- children: [{ type: "header", props: {}, children: null }],
38
- });
39
- assert.equal(h, true);
40
- assert.equal(m, false);
41
- assert.equal(f, false);
42
- });
43
- it("skips the first child if not visible", () => {
44
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx("header", { visible: false }), _jsx("main", {}), _jsx("footer", {})] }) }));
45
- let store = new Store();
46
- const component = createTestRenderer(store, widget);
47
- let tree = component.toJSON();
48
- assert.deepEqual(tree, {
49
- type: "div",
50
- props: {},
51
- children: [{ type: "main", props: {}, children: null }],
52
- });
53
- });
54
- it("skips pure containers which use parent layouts", () => {
55
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx(PureContainer, { layout: UseParentLayout, children: _jsx("header", { visible: false }) }), _jsx("main", {}), _jsx("footer", {})] }) }));
56
- let store = new Store();
57
- const component = createTestRenderer(store, widget);
58
- let tree = component.toJSON();
59
- assert.deepEqual(tree, {
60
- type: "div",
61
- props: {},
62
- children: [{ type: "main", props: {}, children: null }],
63
- });
64
- });
65
- it("works with functional components", () => {
66
- let FC = createFunctionalComponent(({ children }) => _jsx("cx", { children: children }));
67
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx(FC, { dummy: true, children: _jsx("header", { visible: false }) }), _jsx("main", {}), _jsx("footer", {})] }) }));
68
- let store = new Store();
69
- const component = createTestRenderer(store, widget);
70
- let tree = component.toJSON();
71
- assert.deepEqual(tree, {
72
- type: "div",
73
- props: {},
74
- children: [{ type: "main", props: {}, children: null }],
75
- });
76
- });
77
- it("properly destroys invisible items", () => {
78
- let destroyList = [];
79
- let widget = (_jsx("cx", { children: _jsxs("div", { layout: FirstVisibleChildLayout, children: [_jsx("div", { visible: expr("{index} == 0"), onDestroy: () => destroyList.push(0) }), _jsx("div", { visible: expr("{index} == 1"), onDestroy: () => destroyList.push(1) }), _jsx("div", { visible: expr("{index} == 2"), onDestroy: () => destroyList.push(2) }), _jsx("div", { visible: expr("{index} == 3"), onDestroy: () => destroyList.push(3) }), _jsx("div", { visible: expr("{index} == 4"), onDestroy: () => destroyList.push(4) })] }) }));
80
- let store = new Store();
81
- const component = createTestRenderer(store, widget);
82
- store.set("index", 0);
83
- component.toJSON();
84
- assert.deepEqual(destroyList, []);
85
- store.set("index", 3);
86
- component.toJSON();
87
- assert.deepEqual(destroyList, [0]);
88
- store.set("index", 1);
89
- component.toJSON();
90
- assert.deepEqual(destroyList, [0, 3]);
91
- store.set("index", 4);
92
- component.toJSON();
93
- assert.deepEqual(destroyList, [0, 3, 1]);
94
- store.set("index", 0);
95
- component.toJSON();
96
- assert.deepEqual(destroyList, [0, 3, 1, 4]);
97
- store.set("index", -1);
98
- component.toJSON();
99
- assert.deepEqual(destroyList, [0, 3, 1, 4, 0]);
100
- });
101
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,58 +0,0 @@
1
- import assert from 'assert';
2
- import { Format } from './Format';
3
- describe('Format', function () {
4
- describe('n,number ', function () {
5
- it('correctly formats numbers with min and max allowed precision', function () {
6
- assert.equal(Format.value(0.5, 'n;2;4'), '0.50');
7
- assert.equal(Format.value(0.50101, 'n;2;4'), '0.501');
8
- assert.equal(Format.value(0.5012, 'n;2;4'), '0.5012');
9
- assert.equal(Format.value(0.0, 'n;0;4'), '0');
10
- });
11
- it('correctly formats numbers fixed precision', function () {
12
- assert.equal(Format.value(0.5, 'number;3'), '0.500');
13
- assert.equal(Format.value(0.50101, 'number;3'), '0.501');
14
- assert.equal(Format.value(0.5016, 'number;3'), '0.502');
15
- });
16
- });
17
- describe('p,percentage', function () {
18
- it('correctly formats numbers with min and max allowed precision', function () {
19
- assert.equal(Format.value(0.5, 'p;2;4'), '50.00%');
20
- assert.equal(Format.value(0.50101, 'p;2;4'), '50.101%');
21
- assert.equal(Format.value(0.50123456, 'p;2;4'), '50.1235%');
22
- assert.equal(Format.value(0.0, 'p;0;4'), '0%');
23
- });
24
- it('correctly formats numbers fixed precision', function () {
25
- assert.equal(Format.value(0.5, 'percentage;3'), '50.000%');
26
- assert.equal(Format.value(0.50101, 'percentage;3'), '50.101%');
27
- assert.equal(Format.value(0.5016, 'percentage;3'), '50.160%');
28
- });
29
- });
30
- describe('date,time,datetime', function () {
31
- it('correctly formats dates', function () {
32
- assert.equal(Format.value(new Date(2015, 3, 1), 'd'), '4/1/2015');
33
- });
34
- it('correctly formats time', function () {
35
- assert.equal(Format.value(new Date(2015, 3, 1, 16, 15, 14), 't'), '16:15');
36
- assert.equal(Format.value(new Date(2015, 3, 1, 5, 6, 14), 'time'), '05:06');
37
- });
38
- it('correctly formats date-time', function () {
39
- assert.equal(Format.value(new Date(2015, 3, 1, 5, 6, 14), 'dt'), '4/1/2015 05:06');
40
- });
41
- });
42
- describe('ellipsis', function () {
43
- it('can shorten long texts', function () {
44
- assert.equal(Format.value('This is a very long text.', 'ellipsis;7'), 'This...');
45
- });
46
- it('can be used at the start of string', function () {
47
- assert.equal(Format.value('This is a very long text.', 'ellipsis;8;start'), '...text.');
48
- });
49
- it('can be used in the middle of the string', function () {
50
- assert.equal(Format.value('First (Middle) Last', 'ellipsis;11;middle'), 'Firs...Last');
51
- });
52
- });
53
- describe('null text', function () {
54
- it('can contain null text', function () {
55
- assert.equal(Format.value(null, 'n;2|N/A'), 'N/A');
56
- });
57
- });
58
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,43 +0,0 @@
1
- import { TraversalStack } from './TraversalStack';
2
- import assert from 'assert';
3
- describe('TraversalStack', function () {
4
- it('push', function () {
5
- let stack = new TraversalStack();
6
- stack.push(1);
7
- assert.equal(stack.pop(), 1);
8
- });
9
- it('traverses the tree in the right order', function () {
10
- let stack = new TraversalStack();
11
- let tree = {
12
- id: 1,
13
- children: [{
14
- id: 2,
15
- children: [{
16
- id: 3
17
- }, {
18
- id: 4
19
- }]
20
- }, {
21
- id: 5,
22
- children: [{
23
- id: 6
24
- }]
25
- }]
26
- };
27
- let list = [];
28
- stack.push(tree);
29
- while (!stack.empty()) {
30
- let node = stack.pop();
31
- if (node) {
32
- list.push(node.id);
33
- if (node.children) {
34
- stack.hop();
35
- node.children.forEach((child) => {
36
- stack.push(child);
37
- });
38
- }
39
- }
40
- }
41
- assert.deepEqual(list, [1, 2, 3, 4, 5, 6]);
42
- });
43
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,22 +0,0 @@
1
- import assert from 'assert';
2
- import { upperBoundCheck } from './upperBoundCheck';
3
- describe('upperBoundCheck', () => {
4
- let may18th = new Date('2017-05-18'); // May 18th
5
- let may19th = new Date('2017-05-19'); // May 19th
6
- let exclusive = true; // strictly less than...
7
- it('returns true for May 18th <= May 19th', () => {
8
- assert.equal(upperBoundCheck(may18th, may19th), true);
9
- });
10
- it('returns true for May 19th <= May 19th', () => {
11
- assert.equal(upperBoundCheck(may19th, may19th), true);
12
- });
13
- it('returns true for May 19th <= May 19th with exclusive=`false`', () => {
14
- assert.equal(upperBoundCheck(may19th, may19th, false), true);
15
- });
16
- it('returns false for May 19th < May 19th', () => {
17
- assert.equal(upperBoundCheck(may19th, may19th, exclusive), false);
18
- });
19
- it('returns false for May 19th <= May 18th', () => {
20
- assert.equal(upperBoundCheck(may19th, may18th), false);
21
- });
22
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,33 +0,0 @@
1
- import { getSearchQueryPredicate, getSearchQueryHighlighter } from "./getSearchQueryPredicate";
2
- import assert from "assert";
3
- describe("getSearchQueryPredicate", function () {
4
- it("blank means allow all", function () {
5
- var m = getSearchQueryPredicate("");
6
- assert(m("cx"));
7
- });
8
- it("is case insensitive", function () {
9
- var m = getSearchQueryPredicate("Cx");
10
- assert(m("cx"));
11
- });
12
- it("if multiple words are provided, all must be matched", function () {
13
- var m = getSearchQueryPredicate("jo smi");
14
- assert(m("John Smith"));
15
- assert(!m("John Nash"));
16
- });
17
- it("regex special characters are properly escaped", function () {
18
- var m = getSearchQueryPredicate("*?");
19
- assert(m("*?"));
20
- });
21
- });
22
- describe("getSearchQueryHighlighter", function () {
23
- it("detects search parts", function () {
24
- var m = getSearchQueryHighlighter("jo smi");
25
- let items = m("John Smith");
26
- assert.deepStrictEqual(items, ["", "Jo", "hn ", "Smi", "th"]);
27
- });
28
- it("detects search parts occuring multiple times", function () {
29
- var m = getSearchQueryHighlighter("O");
30
- let items = m("Option 1");
31
- assert.deepStrictEqual(items, ["", "O", "pti", "o", "n 1"]);
32
- });
33
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,28 +0,0 @@
1
- import { isValidIdentifierName } from "./isValidIdentifierName";
2
- import assert from "assert";
3
- describe("isValidIdentifierName", function () {
4
- it("names starting with a number are not valid", function () {
5
- assert(!isValidIdentifierName("1a"));
6
- assert(!isValidIdentifierName("00"));
7
- assert(!isValidIdentifierName("0_abc"));
8
- });
9
- it("names starting with a dollar sign are valid", function () {
10
- assert(isValidIdentifierName("$a"));
11
- assert(isValidIdentifierName("$"));
12
- });
13
- it("names starting with an underscore are valid", function () {
14
- assert(isValidIdentifierName("_a"));
15
- assert(isValidIdentifierName("_"));
16
- });
17
- it("names starting with a letter are valid", function () {
18
- assert(isValidIdentifierName("a"));
19
- assert(isValidIdentifierName("abc"));
20
- assert(isValidIdentifierName("abc0123"));
21
- });
22
- it("names with invalid characters are not valid", function () {
23
- assert(!isValidIdentifierName("a b"));
24
- assert(!isValidIdentifierName("a-b"));
25
- assert(!isValidIdentifierName("a.b"));
26
- assert(!isValidIdentifierName("a!b"));
27
- });
28
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,14 +0,0 @@
1
- import { routeAppend } from './routeAppend';
2
- import assert from 'assert';
3
- describe('routeAppend', function () {
4
- it('adds / if necessary', function () {
5
- assert(routeAppend('x', 'y'), 'x/y');
6
- });
7
- it('does not add extra / if not necessary', function () {
8
- assert(routeAppend('x/', 'y'), 'x/y');
9
- assert(routeAppend('x', '/y'), 'x/y');
10
- });
11
- it('removes extra slash if both parts contain it', function () {
12
- assert(routeAppend('x/', '/y'), 'x/y');
13
- });
14
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,40 +0,0 @@
1
- import { jsx as _jsx } from "cx/jsx-runtime";
2
- import assert from "assert";
3
- import { createAccessorModelProxy } from "../data/createAccessorModelProxy";
4
- import { Store } from "../data/Store";
5
- import { expr } from "../ui";
6
- import { createTestRenderer } from "../util/test/createTestRenderer";
7
- let { $page } = createAccessorModelProxy();
8
- describe("Accessors", () => {
9
- it("work as regular bindings", () => {
10
- let widget = (_jsx("cx", { children: _jsx("div", { text: $page.text }) }));
11
- let store = new Store({
12
- data: {
13
- $page: {
14
- text: "Test",
15
- },
16
- },
17
- });
18
- const component = createTestRenderer(store, widget);
19
- let tree = component.toJSON();
20
- assert(tree && !Array.isArray(tree));
21
- assert(tree.type === "div");
22
- assert.deepStrictEqual(tree.children, ["Test"]);
23
- });
24
- it("support expressions", () => {
25
- let widget = (_jsx("cx", { children: _jsx("div", { text: expr($page.a, $page.b, (a, b) => a + b) }) }));
26
- let store = new Store({
27
- data: {
28
- $page: {
29
- a: 1,
30
- b: 3,
31
- },
32
- },
33
- });
34
- const component = createTestRenderer(store, widget);
35
- let tree = component.toJSON();
36
- assert(tree && !Array.isArray(tree));
37
- assert(tree.type === "div");
38
- assert.deepStrictEqual(tree.children, ["4"]);
39
- });
40
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,38 +0,0 @@
1
- import { jsx as _jsx } from "cx/jsx-runtime";
2
- import { Store } from "../data/Store";
3
- import assert from "assert";
4
- import { createTestRenderer } from "../util/test/createTestRenderer";
5
- import { bind } from "../ui/bind";
6
- describe("HtmlElement", () => {
7
- it("renders textual content provided through the text property", () => {
8
- let widget = (_jsx("cx", { children: _jsx("div", { text: bind("text") }) }));
9
- let store = new Store({
10
- data: {
11
- text: "Test",
12
- },
13
- });
14
- const component = createTestRenderer(store, widget);
15
- let tree = component.toJSON();
16
- assert(tree && !Array.isArray(tree), "Expected single element");
17
- assert.equal(tree.type, "div");
18
- assert.deepEqual(tree.children, ["Test"]);
19
- });
20
- it("allows spread bindings", () => {
21
- let store = new Store({
22
- data: {
23
- title: "title",
24
- },
25
- });
26
- const component = createTestRenderer(store, (_jsx("cx", { children: _jsx("a", { href: "#", title: { bind: "title" }, children: "Link" }) })));
27
- let tree = component.toJSON();
28
- assert(tree && !Array.isArray(tree), "Expected single element");
29
- assert.deepEqual(tree, {
30
- type: "a",
31
- children: ["Link"],
32
- props: {
33
- href: "#",
34
- title: "title",
35
- },
36
- });
37
- });
38
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,62 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "cx/jsx-runtime";
2
- import { Store } from "../../data/Store";
3
- import { ValidationGroup } from "./ValidationGroup";
4
- import { Validator } from "./Validator";
5
- import { bind } from "../../ui/bind";
6
- import { createTestRenderer } from "../../util/test/createTestRenderer";
7
- import assert from "assert";
8
- describe("ValidationGroup", () => {
9
- it("performs validation and sets the flags", () => {
10
- let widget = (_jsx("cx", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), valid: bind("valid"), children: [_jsx(Validator, { onValidate: () => "Something is wrong..." }), _jsx("div", { visible: bind("invalid"), children: "Invalid" })] }) }));
11
- let store = new Store();
12
- const component = createTestRenderer(store, widget);
13
- let tree = component.toJSON();
14
- assert(tree && !Array.isArray(tree));
15
- assert.equal(tree.type, "div");
16
- assert.equal(store.get("invalid"), true);
17
- assert.equal(store.get("valid"), false);
18
- });
19
- it("nested validation works", () => {
20
- let widget = (_jsx("cx", { children: _jsx("div", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), children: [_jsx(ValidationGroup, { invalid: bind("invalid1"), children: _jsx(Validator, { onValidate: () => "Something is wrong..." }) }), _jsx(ValidationGroup, { invalid: bind("invalid2"), children: _jsx(Validator, { onValidate: () => false }) })] }) }) }));
21
- let store = new Store();
22
- const component = createTestRenderer(store, widget);
23
- let tree = component.toJSON();
24
- assert.equal(store.get("invalid"), true);
25
- assert.equal(store.get("invalid1"), true);
26
- assert.equal(store.get("invalid2"), false);
27
- });
28
- it("isolated validation group does not affect the parent", () => {
29
- let widget = (_jsx("cx", { children: _jsx("div", { children: _jsxs(ValidationGroup, { invalid: bind("invalid"), children: [_jsx(ValidationGroup, { invalid: bind("invalid1"), isolated: true, children: _jsx(Validator, { onValidate: () => "Something is wrong..." }) }), _jsx(ValidationGroup, { invalid: bind("invalid2"), children: _jsx(Validator, { onValidate: () => false }) })] }) }) }));
30
- let store = new Store();
31
- const component = createTestRenderer(store, widget);
32
- let tree = component.toJSON();
33
- assert.equal(store.get("invalid"), false);
34
- assert.equal(store.get("invalid1"), true);
35
- assert.equal(store.get("invalid2"), false);
36
- });
37
- it("visited flag is propagated into nested validation groups", () => {
38
- let visited = false;
39
- let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { visited: true, children: _jsx(ValidationGroup, { children: _jsx("div", { onExplore: (context, instance) => {
40
- if (context.parentVisited)
41
- visited = true;
42
- } }) }) }) }) }));
43
- let store = new Store();
44
- const component = createTestRenderer(store, widget);
45
- let tree = component.toJSON();
46
- assert(visited);
47
- });
48
- it("disabled flag can be overruled by the field props", () => {
49
- let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { invalid: bind("invalid"), disabled: true, children: _jsx(Validator, { onValidate: () => "Something is wrong...", disabled: false }) }) }) }));
50
- let store = new Store();
51
- const component = createTestRenderer(store, widget);
52
- let tree = component.toJSON();
53
- assert.equal(store.get("invalid"), true);
54
- });
55
- it("strict flag is used to enforce disabled flag", () => {
56
- let widget = (_jsx("cx", { children: _jsx("div", { children: _jsx(ValidationGroup, { invalid: bind("invalid"), disabled: true, strict: true, children: _jsx(Validator, { onValidate: () => "Something is wrong...", disabled: false }) }) }) }));
57
- let store = new Store();
58
- const component = createTestRenderer(store, widget);
59
- let tree = component.toJSON();
60
- assert.equal(store.get("invalid"), false);
61
- });
62
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,15 +0,0 @@
1
- import { jsx as _jsx } from "cx/jsx-runtime";
2
- import { Route } from "./Route";
3
- import { Store } from "../../data/Store";
4
- import { createTestRenderer } from "../../util/test/createTestRenderer";
5
- import assert from "assert";
6
- describe("Route", () => {
7
- it("matching works for ~/widgets/color-pickers", () => {
8
- let widget = (_jsx("cx", { children: _jsx(Route, { url: "~/widgets/color-pickers", route: "~/widgets/color-pickers", children: _jsx("div", {}) }) }));
9
- let store = new Store();
10
- const component = createTestRenderer(store, widget);
11
- let tree = component.toJSON();
12
- assert(tree && !Array.isArray(tree));
13
- assert.equal(tree.type, "div");
14
- });
15
- });