cx 25.2.1 → 25.4.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 (116) hide show
  1. package/dist/charts.css +8 -0
  2. package/dist/charts.js +29 -2
  3. package/dist/manifest.js +682 -682
  4. package/dist/widgets.js +7 -2
  5. package/package.json +1 -1
  6. package/src/charts/Legend.d.ts +18 -0
  7. package/src/charts/Legend.js +22 -2
  8. package/src/charts/Legend.scss +8 -0
  9. package/src/charts/LegendEntry.js +128 -128
  10. package/src/charts/LegendEntry.scss +27 -27
  11. package/src/charts/PieChart.d.ts +92 -92
  12. package/src/charts/PieChart.js +1 -0
  13. package/src/charts/axis/Axis.d.ts +113 -113
  14. package/src/charts/axis/Axis.js +280 -280
  15. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  16. package/src/charts/axis/CategoryAxis.js +241 -241
  17. package/src/charts/axis/NumericAxis.js +351 -351
  18. package/src/charts/axis/Stack.js +55 -55
  19. package/src/charts/axis/TimeAxis.d.ts +28 -28
  20. package/src/charts/axis/TimeAxis.js +611 -611
  21. package/src/charts/helpers/PointReducer.js +47 -47
  22. package/src/charts/helpers/SnapPointFinder.js +69 -69
  23. package/src/core.d.ts +40 -1
  24. package/src/data/Binding.spec.js +69 -69
  25. package/src/data/Expression.js +229 -229
  26. package/src/data/Expression.spec.js +229 -229
  27. package/src/data/StringTemplate.js +92 -92
  28. package/src/data/StringTemplate.spec.js +132 -132
  29. package/src/data/StructuredSelector.js +132 -132
  30. package/src/data/View.d.ts +36 -12
  31. package/src/data/getAccessor.spec.js +11 -11
  32. package/src/data/getSelector.js +49 -49
  33. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  34. package/src/hooks/createLocalStorageRef.js +20 -20
  35. package/src/index.scss +6 -6
  36. package/src/ui/Culture.d.ts +57 -57
  37. package/src/ui/Culture.js +139 -139
  38. package/src/ui/FocusManager.js +171 -171
  39. package/src/ui/Format.js +108 -108
  40. package/src/ui/HoverSync.js +147 -147
  41. package/src/ui/Instance.d.ts +72 -72
  42. package/src/ui/Instance.js +614 -614
  43. package/src/ui/Repeater.d.ts +61 -61
  44. package/src/ui/ResizeManager.d.ts +4 -3
  45. package/src/ui/index.d.ts +42 -42
  46. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  47. package/src/ui/layout/ContentPlaceholder.js +105 -105
  48. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  49. package/src/ui/layout/LabelsTopLayout.js +134 -134
  50. package/src/util/Format.js +270 -270
  51. package/src/util/date/encodeDate.d.ts +1 -1
  52. package/src/util/date/encodeDate.js +8 -8
  53. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  54. package/src/util/date/index.d.ts +11 -11
  55. package/src/util/date/index.js +11 -11
  56. package/src/util/date/parseDateInvariant.d.ts +3 -3
  57. package/src/util/date/parseDateInvariant.js +20 -20
  58. package/src/util/debounce.d.ts +3 -4
  59. package/src/util/getSearchQueryPredicate.js +59 -59
  60. package/src/util/index.d.ts +51 -51
  61. package/src/util/index.js +54 -54
  62. package/src/util/isValidIdentifierName.d.ts +1 -1
  63. package/src/util/isValidIdentifierName.js +5 -5
  64. package/src/util/isValidIdentifierName.spec.js +33 -33
  65. package/src/util/scss/add-rules.scss +38 -38
  66. package/src/widgets/CxCredit.scss +37 -37
  67. package/src/widgets/HighlightedSearchText.js +36 -36
  68. package/src/widgets/HighlightedSearchText.scss +18 -18
  69. package/src/widgets/HtmlElement.d.ts +4 -0
  70. package/src/widgets/List.scss +91 -91
  71. package/src/widgets/drag-drop/DropZone.js +214 -214
  72. package/src/widgets/form/Calendar.js +618 -618
  73. package/src/widgets/form/Calendar.scss +196 -196
  74. package/src/widgets/form/Checkbox.scss +127 -127
  75. package/src/widgets/form/ColorField.js +397 -397
  76. package/src/widgets/form/ColorField.scss +96 -96
  77. package/src/widgets/form/ColorPicker.js +8 -3
  78. package/src/widgets/form/ColorPicker.scss +283 -283
  79. package/src/widgets/form/DateTimeField.js +576 -576
  80. package/src/widgets/form/DateTimePicker.js +392 -392
  81. package/src/widgets/form/LookupField.d.ts +179 -179
  82. package/src/widgets/form/LookupField.scss +219 -219
  83. package/src/widgets/form/MonthField.d.ts +99 -99
  84. package/src/widgets/form/MonthField.js +523 -523
  85. package/src/widgets/form/MonthPicker.d.ts +76 -76
  86. package/src/widgets/form/MonthPicker.js +641 -641
  87. package/src/widgets/form/MonthPicker.scss +118 -118
  88. package/src/widgets/form/NumberField.js +459 -459
  89. package/src/widgets/form/NumberField.scss +61 -61
  90. package/src/widgets/form/Radio.scss +121 -121
  91. package/src/widgets/form/Select.scss +99 -99
  92. package/src/widgets/form/Slider.scss +118 -118
  93. package/src/widgets/form/Switch.scss +140 -140
  94. package/src/widgets/form/TextArea.scss +43 -43
  95. package/src/widgets/form/TextField.js +290 -290
  96. package/src/widgets/form/TextField.scss +55 -55
  97. package/src/widgets/form/UploadButton.d.ts +34 -34
  98. package/src/widgets/form/variables.scss +353 -353
  99. package/src/widgets/grid/Grid.d.ts +442 -442
  100. package/src/widgets/grid/Grid.js +3414 -3414
  101. package/src/widgets/grid/GridRow.js +228 -228
  102. package/src/widgets/grid/TreeNode.d.ts +23 -23
  103. package/src/widgets/grid/TreeNode.scss +88 -88
  104. package/src/widgets/grid/variables.scss +133 -133
  105. package/src/widgets/nav/LinkButton.js +128 -128
  106. package/src/widgets/nav/Menu.scss +74 -74
  107. package/src/widgets/overlay/Dropdown.js +612 -612
  108. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  109. package/src/widgets/overlay/Overlay.d.ts +73 -73
  110. package/src/widgets/overlay/Window.js +202 -202
  111. package/src/widgets/overlay/captureMouse.js +124 -124
  112. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  113. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  114. package/src/widgets/overlay/index.d.ts +11 -11
  115. package/src/widgets/overlay/index.js +11 -11
  116. package/src/widgets/variables.scss +144 -144
@@ -1,132 +1,132 @@
1
- import { StringTemplate } from "./StringTemplate";
2
- import assert from "assert";
3
-
4
- describe("StringTemplate", function () {
5
- describe("#compile()", function () {
6
- it("returns a selector", function () {
7
- var e = StringTemplate.compile("Hello {person.name}");
8
- var state = {
9
- person: {
10
- name: "Jim",
11
- },
12
- };
13
- assert.equal(e(state), "Hello Jim");
14
- });
15
-
16
- it("allows empty strings", function () {
17
- let e = StringTemplate.compile("");
18
- assert.equal(e(), "");
19
- });
20
-
21
- it("properly encodes ' and \"", function () {
22
- var e = StringTemplate.compile('It\'s "working"!');
23
- assert.equal(e({}), 'It\'s "working"!');
24
- });
25
-
26
- it("allows \\ before a binding", function () {
27
- var e = StringTemplate.compile("t\\{person.name}");
28
- assert.equal(e({ person: { name: "Ogi" } }), "t\\Ogi");
29
- });
30
-
31
- it("supports multi-line strings", function () {
32
- var e = StringTemplate.compile("a\nb");
33
- assert.equal(e(), "a\nb");
34
-
35
- var e = StringTemplate.compile("a\r\nb");
36
- assert.equal(e(), "a\r\nb");
37
- });
38
- });
39
-
40
- describe("double brackets are used to escape brackets", function () {
41
- it("double brackets are preserved", function () {
42
- var e = StringTemplate.compile("Hello {{person.name}}");
43
- var state = {
44
- person: {
45
- name: "Jim",
46
- },
47
- };
48
- assert.equal(e(state), "Hello {person.name}");
49
- });
50
-
51
- it("triple brackets are converted to single brackets and a binding", function () {
52
- var e = StringTemplate.compile("Hello {{{person.name}}}");
53
- var state = {
54
- person: {
55
- name: "Jim",
56
- },
57
- };
58
- assert.equal(e(state), "Hello {Jim}");
59
- });
60
-
61
- it("open brackets are ignored", function () {
62
- var e = StringTemplate.compile("B { A");
63
- assert.equal(e({}), "B { A");
64
- });
65
- });
66
-
67
- describe("supports formatting", function () {
68
- it("with colon", function () {
69
- var e = StringTemplate.compile("{str:suffix;kg}");
70
- assert.equal(e({ str: "5" }), "5kg");
71
- });
72
-
73
- it("with multiple formats", function () {
74
- var e = StringTemplate.compile("{str:suffix;kg:wrap;(;)}");
75
- assert.equal(e({ str: "5" }), "(5kg)");
76
- });
77
-
78
- it("with null values", function () {
79
- var e = StringTemplate.compile("{str:suffix;kg:|N/A}");
80
- assert.equal(e({ str: null }), "N/A");
81
- });
82
-
83
- it("of null values", function () {
84
- var e = StringTemplate.compile("{str|N/A}");
85
- assert.equal(e({ str: null }), "N/A");
86
- });
87
- });
88
-
89
- describe("properly handles backslashes", function () {
90
- it("in a string", function () {
91
- var e = StringTemplate.compile("a\\b");
92
- assert.equal(e(), "a\\b");
93
- });
94
-
95
- it("before a special character", function () {
96
- var e = StringTemplate.compile("\\t");
97
- assert.equal(e(), "\\t");
98
- });
99
- });
100
-
101
- describe("supports expressions", function () {
102
- it("using []", function () {
103
- var e = StringTemplate.compile("1 + 2 = {[1+2]}");
104
- assert.equal(e(), "1 + 2 = 3");
105
- });
106
-
107
- it("using %", function () {
108
- var e = StringTemplate.compile("1 + 2 = %{1+2}");
109
- assert.equal(e(), "1 + 2 = 3");
110
- });
111
-
112
- it("with subexpressions", function () {
113
- var e = StringTemplate.compile("1 + 2 = {[%{1+2}]}");
114
- assert.equal(e(), "1 + 2 = 3");
115
- });
116
-
117
- it("with a conditional operator", function () {
118
- var e = StringTemplate.compile("1 + 2 = {[true ? 3 : 2]:s}");
119
- assert.equal(e(), "1 + 2 = 3");
120
- });
121
-
122
- it("with sub-expression formatting", function () {
123
- var e = StringTemplate.compile("{[!!{person.age} ? {person.age:suffix; years old} : 'Age unknown']}");
124
- var state = {
125
- person: {
126
- age: 32,
127
- },
128
- };
129
- assert.equal(e(state), "32 years old");
130
- });
131
- });
132
- });
1
+ import { StringTemplate } from "./StringTemplate";
2
+ import assert from "assert";
3
+
4
+ describe("StringTemplate", function () {
5
+ describe("#compile()", function () {
6
+ it("returns a selector", function () {
7
+ var e = StringTemplate.compile("Hello {person.name}");
8
+ var state = {
9
+ person: {
10
+ name: "Jim",
11
+ },
12
+ };
13
+ assert.equal(e(state), "Hello Jim");
14
+ });
15
+
16
+ it("allows empty strings", function () {
17
+ let e = StringTemplate.compile("");
18
+ assert.equal(e(), "");
19
+ });
20
+
21
+ it("properly encodes ' and \"", function () {
22
+ var e = StringTemplate.compile('It\'s "working"!');
23
+ assert.equal(e({}), 'It\'s "working"!');
24
+ });
25
+
26
+ it("allows \\ before a binding", function () {
27
+ var e = StringTemplate.compile("t\\{person.name}");
28
+ assert.equal(e({ person: { name: "Ogi" } }), "t\\Ogi");
29
+ });
30
+
31
+ it("supports multi-line strings", function () {
32
+ var e = StringTemplate.compile("a\nb");
33
+ assert.equal(e(), "a\nb");
34
+
35
+ var e = StringTemplate.compile("a\r\nb");
36
+ assert.equal(e(), "a\r\nb");
37
+ });
38
+ });
39
+
40
+ describe("double brackets are used to escape brackets", function () {
41
+ it("double brackets are preserved", function () {
42
+ var e = StringTemplate.compile("Hello {{person.name}}");
43
+ var state = {
44
+ person: {
45
+ name: "Jim",
46
+ },
47
+ };
48
+ assert.equal(e(state), "Hello {person.name}");
49
+ });
50
+
51
+ it("triple brackets are converted to single brackets and a binding", function () {
52
+ var e = StringTemplate.compile("Hello {{{person.name}}}");
53
+ var state = {
54
+ person: {
55
+ name: "Jim",
56
+ },
57
+ };
58
+ assert.equal(e(state), "Hello {Jim}");
59
+ });
60
+
61
+ it("open brackets are ignored", function () {
62
+ var e = StringTemplate.compile("B { A");
63
+ assert.equal(e({}), "B { A");
64
+ });
65
+ });
66
+
67
+ describe("supports formatting", function () {
68
+ it("with colon", function () {
69
+ var e = StringTemplate.compile("{str:suffix;kg}");
70
+ assert.equal(e({ str: "5" }), "5kg");
71
+ });
72
+
73
+ it("with multiple formats", function () {
74
+ var e = StringTemplate.compile("{str:suffix;kg:wrap;(;)}");
75
+ assert.equal(e({ str: "5" }), "(5kg)");
76
+ });
77
+
78
+ it("with null values", function () {
79
+ var e = StringTemplate.compile("{str:suffix;kg:|N/A}");
80
+ assert.equal(e({ str: null }), "N/A");
81
+ });
82
+
83
+ it("of null values", function () {
84
+ var e = StringTemplate.compile("{str|N/A}");
85
+ assert.equal(e({ str: null }), "N/A");
86
+ });
87
+ });
88
+
89
+ describe("properly handles backslashes", function () {
90
+ it("in a string", function () {
91
+ var e = StringTemplate.compile("a\\b");
92
+ assert.equal(e(), "a\\b");
93
+ });
94
+
95
+ it("before a special character", function () {
96
+ var e = StringTemplate.compile("\\t");
97
+ assert.equal(e(), "\\t");
98
+ });
99
+ });
100
+
101
+ describe("supports expressions", function () {
102
+ it("using []", function () {
103
+ var e = StringTemplate.compile("1 + 2 = {[1+2]}");
104
+ assert.equal(e(), "1 + 2 = 3");
105
+ });
106
+
107
+ it("using %", function () {
108
+ var e = StringTemplate.compile("1 + 2 = %{1+2}");
109
+ assert.equal(e(), "1 + 2 = 3");
110
+ });
111
+
112
+ it("with subexpressions", function () {
113
+ var e = StringTemplate.compile("1 + 2 = {[%{1+2}]}");
114
+ assert.equal(e(), "1 + 2 = 3");
115
+ });
116
+
117
+ it("with a conditional operator", function () {
118
+ var e = StringTemplate.compile("1 + 2 = {[true ? 3 : 2]:s}");
119
+ assert.equal(e(), "1 + 2 = 3");
120
+ });
121
+
122
+ it("with sub-expression formatting", function () {
123
+ var e = StringTemplate.compile("{[!!{person.age} ? {person.age:suffix; years old} : 'Age unknown']}");
124
+ var state = {
125
+ person: {
126
+ age: 32,
127
+ },
128
+ };
129
+ assert.equal(e(state), "32 years old");
130
+ });
131
+ });
132
+ });
@@ -1,132 +1,132 @@
1
- import { Binding } from "./Binding";
2
- import { Expression } from "./Expression";
3
- import { StringTemplate } from "./StringTemplate";
4
- import { createStructuredSelector } from "../data/createStructuredSelector";
5
- import { getSelector } from "../data/getSelector";
6
- import { isFunction } from "../util/isFunction";
7
- import { isUndefined } from "../util/isUndefined";
8
- import { isDefined } from "../util/isDefined";
9
- import { isArray } from "../util/isArray";
10
- import { isAccessorChain } from "./createAccessorModelProxy";
11
- import { isString } from "../util/isString";
12
-
13
- function defaultValue(pv) {
14
- if (typeof pv == "object" && pv && pv.structured) return pv.defaultValue;
15
-
16
- return pv;
17
- }
18
-
19
- function getSelectorConfig(props, values, nameMap) {
20
- let functions = {},
21
- structures = {},
22
- defaultValues = {},
23
- constants,
24
- p,
25
- v,
26
- pv,
27
- constant = true;
28
-
29
- for (p in props) {
30
- v = values[p];
31
- pv = props[p];
32
-
33
- if (isUndefined(v) && pv && (pv.bind || pv.tpl || pv.expr)) v = pv;
34
-
35
- if (v === null) {
36
- if (!constants) constants = {};
37
- constants[p] = null;
38
- } else if (typeof v == "object") {
39
- if (v.bind) {
40
- if (isUndefined(v.defaultValue) && v != pv) v.defaultValue = defaultValue(pv);
41
- if (isDefined(v.defaultValue)) defaultValues[v.bind] = v.defaultValue;
42
- nameMap[p] = v.bind;
43
- functions[p] = Binding.get(v.bind).value;
44
- constant = false;
45
- } else if (v.expr) {
46
- functions[p] = Expression.get(v.expr);
47
- constant = false;
48
- } else if (v.get) {
49
- functions[p] = v.get;
50
- constant = false;
51
- } else if (isString(v.tpl)) {
52
- functions[p] = StringTemplate.get(v.tpl);
53
- constant = false;
54
- } else if (pv && typeof pv == "object" && pv.structured) {
55
- if (isArray(v)) functions[p] = getSelector(v);
56
- else {
57
- let s = getSelectorConfig(v, v, {});
58
- structures[p] = s;
59
- Object.assign(defaultValues, s.defaultValues);
60
- }
61
- constant = false;
62
- } else {
63
- if (!constants) constants = {};
64
- constants[p] = v;
65
- }
66
- } else if (isFunction(v)) {
67
- if (isAccessorChain(v)) {
68
- let path = v.toString();
69
- nameMap[p] = path;
70
- functions[p] = Binding.get(path).value;
71
- } else functions[p] = v;
72
- constant = false;
73
- } else {
74
- if (isUndefined(v)) {
75
- if (isUndefined(pv)) continue;
76
- v = defaultValue(pv);
77
- }
78
-
79
- if (isUndefined(v)) continue;
80
-
81
- if (!constants) constants = {};
82
-
83
- constants[p] = v;
84
- }
85
- }
86
-
87
- return {
88
- functions,
89
- structures,
90
- defaultValues,
91
- constants,
92
- constant,
93
- };
94
- }
95
-
96
- function createSelector({ functions, structures, constants, defaultValues }) {
97
- let selector = {};
98
-
99
- for (let n in functions) {
100
- selector[n] = functions[n];
101
- }
102
-
103
- for (let n in structures) selector[n] = createSelector(structures[n]);
104
-
105
- return createStructuredSelector(selector, constants);
106
- }
107
-
108
- export class StructuredSelector {
109
- constructor({ props, values }) {
110
- this.nameMap = {};
111
- this.config = getSelectorConfig(props, values, this.nameMap);
112
- }
113
-
114
- init(store) {
115
- store.init(this.config.defaultValues);
116
- }
117
-
118
- create(memoize = true) {
119
- let selector = createSelector(this.config);
120
- if (memoize && selector.memoize) return selector.memoize();
121
- return selector;
122
- }
123
-
124
- createStoreSelector() {
125
- if (this.config.constant) {
126
- let result = { ...this.config.constants };
127
- return () => result;
128
- }
129
- let selector = this.create();
130
- return (store) => selector(store.getData());
131
- }
132
- }
1
+ import { Binding } from "./Binding";
2
+ import { Expression } from "./Expression";
3
+ import { StringTemplate } from "./StringTemplate";
4
+ import { createStructuredSelector } from "../data/createStructuredSelector";
5
+ import { getSelector } from "../data/getSelector";
6
+ import { isFunction } from "../util/isFunction";
7
+ import { isUndefined } from "../util/isUndefined";
8
+ import { isDefined } from "../util/isDefined";
9
+ import { isArray } from "../util/isArray";
10
+ import { isAccessorChain } from "./createAccessorModelProxy";
11
+ import { isString } from "../util/isString";
12
+
13
+ function defaultValue(pv) {
14
+ if (typeof pv == "object" && pv && pv.structured) return pv.defaultValue;
15
+
16
+ return pv;
17
+ }
18
+
19
+ function getSelectorConfig(props, values, nameMap) {
20
+ let functions = {},
21
+ structures = {},
22
+ defaultValues = {},
23
+ constants,
24
+ p,
25
+ v,
26
+ pv,
27
+ constant = true;
28
+
29
+ for (p in props) {
30
+ v = values[p];
31
+ pv = props[p];
32
+
33
+ if (isUndefined(v) && pv && (pv.bind || pv.tpl || pv.expr)) v = pv;
34
+
35
+ if (v === null) {
36
+ if (!constants) constants = {};
37
+ constants[p] = null;
38
+ } else if (typeof v == "object") {
39
+ if (v.bind) {
40
+ if (isUndefined(v.defaultValue) && v != pv) v.defaultValue = defaultValue(pv);
41
+ if (isDefined(v.defaultValue)) defaultValues[v.bind] = v.defaultValue;
42
+ nameMap[p] = v.bind;
43
+ functions[p] = Binding.get(v.bind).value;
44
+ constant = false;
45
+ } else if (v.expr) {
46
+ functions[p] = Expression.get(v.expr);
47
+ constant = false;
48
+ } else if (v.get) {
49
+ functions[p] = v.get;
50
+ constant = false;
51
+ } else if (isString(v.tpl)) {
52
+ functions[p] = StringTemplate.get(v.tpl);
53
+ constant = false;
54
+ } else if (pv && typeof pv == "object" && pv.structured) {
55
+ if (isArray(v)) functions[p] = getSelector(v);
56
+ else {
57
+ let s = getSelectorConfig(v, v, {});
58
+ structures[p] = s;
59
+ Object.assign(defaultValues, s.defaultValues);
60
+ }
61
+ constant = false;
62
+ } else {
63
+ if (!constants) constants = {};
64
+ constants[p] = v;
65
+ }
66
+ } else if (isFunction(v)) {
67
+ if (isAccessorChain(v)) {
68
+ let path = v.toString();
69
+ nameMap[p] = path;
70
+ functions[p] = Binding.get(path).value;
71
+ } else functions[p] = v;
72
+ constant = false;
73
+ } else {
74
+ if (isUndefined(v)) {
75
+ if (isUndefined(pv)) continue;
76
+ v = defaultValue(pv);
77
+ }
78
+
79
+ if (isUndefined(v)) continue;
80
+
81
+ if (!constants) constants = {};
82
+
83
+ constants[p] = v;
84
+ }
85
+ }
86
+
87
+ return {
88
+ functions,
89
+ structures,
90
+ defaultValues,
91
+ constants,
92
+ constant,
93
+ };
94
+ }
95
+
96
+ function createSelector({ functions, structures, constants, defaultValues }) {
97
+ let selector = {};
98
+
99
+ for (let n in functions) {
100
+ selector[n] = functions[n];
101
+ }
102
+
103
+ for (let n in structures) selector[n] = createSelector(structures[n]);
104
+
105
+ return createStructuredSelector(selector, constants);
106
+ }
107
+
108
+ export class StructuredSelector {
109
+ constructor({ props, values }) {
110
+ this.nameMap = {};
111
+ this.config = getSelectorConfig(props, values, this.nameMap);
112
+ }
113
+
114
+ init(store) {
115
+ store.init(this.config.defaultValues);
116
+ }
117
+
118
+ create(memoize = true) {
119
+ let selector = createSelector(this.config);
120
+ if (memoize && selector.memoize) return selector.memoize();
121
+ return selector;
122
+ }
123
+
124
+ createStoreSelector() {
125
+ if (this.config.constant) {
126
+ let result = { ...this.config.constants };
127
+ return () => result;
128
+ }
129
+ let selector = this.create();
130
+ return (store) => selector(store.getData());
131
+ }
132
+ }
@@ -1,4 +1,4 @@
1
- import { Record, AccessorChain } from "../core";
1
+ import { AccessorChain } from "../core";
2
2
  import { Binding } from "./Binding";
3
3
  import { Ref } from "./Ref";
4
4
 
@@ -14,20 +14,22 @@ export interface ViewConfig {
14
14
  sealed?: boolean;
15
15
  }
16
16
 
17
- export interface ViewMethods<D = Record> {
17
+ export interface ViewMethods<D = Record<string, any>> {
18
18
  getData(): D;
19
19
 
20
20
  init(path: Path, value: any): boolean;
21
- init<V>(path: AccessorChain<V>, value: V | any): boolean;
21
+ init<V>(path: AccessorChain<V>, value: V): boolean;
22
22
 
23
23
  set(path: Path, value: any): boolean;
24
- set(changes: Record): boolean;
25
- set<V>(path: AccessorChain<V>, value: V | any): boolean;
24
+ set<T extends Record<string, any>>(changes: T): boolean;
25
+ set<V>(path: AccessorChain<V>, value: V): boolean;
26
26
 
27
27
  get(path: Path): any;
28
28
  get(paths: Path[]): any[];
29
29
  get(...paths: Path[]): any[];
30
30
  get<V>(path: AccessorChain<V>): V;
31
+ get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
32
+ get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
31
33
 
32
34
  /**
33
35
  * Removes data from the Store.
@@ -38,19 +40,29 @@ export interface ViewMethods<D = Record> {
38
40
  delete(paths: Path[]): boolean;
39
41
  delete(...paths: Path[]): boolean;
40
42
  delete<V>(path: AccessorChain<V>): boolean;
43
+ delete<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
44
+ delete<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
41
45
 
42
46
  toggle(path: Path): boolean;
43
47
 
44
48
  update(updateFn: (currentValue: D, ...args) => D, ...args): boolean;
45
49
  update(path: Path, updateFn: (currentValue: any, ...args) => any, ...args): boolean;
46
- update<V>(path: AccessorChain<V>, updateFn: (currentValue: V, ...args) => V, ...args): boolean;
50
+ update<V, A extends any[]>(
51
+ path: AccessorChain<V>,
52
+ updateFn: (currentValue: V, ...args: A) => V,
53
+ ...args: A
54
+ ): boolean;
47
55
 
48
56
  /**
49
57
  * Mutates the content of the store using Immer
50
58
  */
51
59
  mutate(updateFn: (currentValue: D, ...args) => D, ...args): boolean;
52
60
  mutate(path: Path, updateFn: (currentValue: any, ...args) => any, ...args): boolean;
53
- mutate<V>(path: AccessorChain<V>, updateFn: (currentValue: V, ...args) => V, ...args): boolean;
61
+ mutate<V, A extends any[]>(
62
+ path: AccessorChain<V>,
63
+ updateFn: (currentValue: V, ...args: A) => void,
64
+ ...args: A
65
+ ): boolean;
54
66
 
55
67
  ref<T = any>(path: string | AccessorChain<T>, defaultValue?: T): Ref<T>;
56
68
  }
@@ -64,8 +76,8 @@ export class View<D = any> implements ViewMethods<D> {
64
76
  init<V>(path: AccessorChain<V>, value: V): boolean;
65
77
 
66
78
  set(path: Path, value: any): boolean;
67
- set(changes: Record): boolean;
68
- set<V>(path: AccessorChain<V>, value: V | any): boolean;
79
+ set<T extends Record<string, any>>(changes: T): boolean;
80
+ set<V>(path: AccessorChain<V>, value: V): boolean;
69
81
 
70
82
  /**
71
83
  * Copies the value stored under the `from` path and saves it under the `to` path.
@@ -87,6 +99,8 @@ export class View<D = any> implements ViewMethods<D> {
87
99
  delete(paths: Path[]): boolean;
88
100
  delete(...paths: Path[]): boolean;
89
101
  delete<V>(path: AccessorChain<V>): boolean;
102
+ delete<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
103
+ delete<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
90
104
 
91
105
  clear(): void;
92
106
 
@@ -94,17 +108,27 @@ export class View<D = any> implements ViewMethods<D> {
94
108
  get(paths: Path[]): any;
95
109
  get(...paths: Path[]): any;
96
110
  get<V>(path: AccessorChain<V>): V;
111
+ get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
112
+ get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
97
113
 
98
114
  toggle(path: Path): boolean;
99
115
  toggle(path: AccessorChain<boolean>): boolean;
100
116
 
101
117
  update(updateFn: (currentValue: D, ...args) => any, ...args): boolean;
102
118
  update(path: Path, updateFn: (currentValue: any, ...args) => any, ...args): boolean;
103
- update<V>(path: AccessorChain<V>, updateFn: (currentValue: V, ...args) => V, ...args): boolean;
119
+ update<V, A extends any[]>(
120
+ path: AccessorChain<V>,
121
+ updateFn: (currentValue: V, ...args: A) => V,
122
+ ...args: A
123
+ ): boolean;
104
124
 
105
125
  mutate(updateFn: (currentValue: D, ...args) => void, ...args): boolean;
106
126
  mutate(path: Path, updateFn: (currentValue: any, ...args) => void, ...args): boolean;
107
- mutate<V>(path: AccessorChain<V>, updateFn: (currentValue: V, ...args) => void, ...args): boolean;
127
+ mutate<V, A extends any[]>(
128
+ path: AccessorChain<V>,
129
+ updateFn: (currentValue: V, ...args: A) => void,
130
+ ...args: A
131
+ ): boolean;
108
132
 
109
133
  /**
110
134
  * `batch` method can be used to perform multiple Store operations silently
@@ -121,7 +145,7 @@ export class View<D = any> implements ViewMethods<D> {
121
145
 
122
146
  subscribe(callback: (changes?) => void): () => void;
123
147
 
124
- load(data: Record): boolean;
148
+ load(data: Record<string, any>): boolean;
125
149
 
126
150
  dispatch(action): void;
127
151
 
@@ -1,11 +1,11 @@
1
- import assert from "assert";
2
- import { createAccessorModelProxy } from "./createAccessorModelProxy";
3
- import { getAccessor } from "./getAccessor";
4
-
5
- describe("getAccessor", function () {
6
- it("works with accessor chains", function () {
7
- let m = createAccessorModelProxy();
8
- let accessor = getAccessor(m.a.b);
9
- assert(typeof accessor.set == "function");
10
- });
11
- });
1
+ import assert from "assert";
2
+ import { createAccessorModelProxy } from "./createAccessorModelProxy";
3
+ import { getAccessor } from "./getAccessor";
4
+
5
+ describe("getAccessor", function () {
6
+ it("works with accessor chains", function () {
7
+ let m = createAccessorModelProxy();
8
+ let accessor = getAccessor(m.a.b);
9
+ assert(typeof accessor.set == "function");
10
+ });
11
+ });