@utiliread/primitives 1.0.0-144 → 1.0.0-146

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 (121) hide show
  1. package/dist/csv.d.ts +3 -3
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/src/aggregate-id.ts +9 -9
  6. package/src/breakdown-rule.spec.ts +61 -61
  7. package/src/breakdown-rule.ts +58 -58
  8. package/src/csv.spec.ts +42 -34
  9. package/src/csv.ts +9 -9
  10. package/src/cursor-navigation-state.spec.ts +194 -194
  11. package/src/cursor-navigation-state.ts +168 -168
  12. package/src/index.ts +61 -61
  13. package/src/measure-id.ts +17 -17
  14. package/src/measures/duration.ts +11 -11
  15. package/src/measures/energy.ts +13 -13
  16. package/src/measures/humidity.ts +3 -3
  17. package/src/measures/infocode.ts +3 -3
  18. package/src/measures/mass-flow.ts +19 -19
  19. package/src/measures/mass.ts +10 -10
  20. package/src/measures/noise.ts +5 -5
  21. package/src/measures/power.ts +23 -23
  22. package/src/measures/pressure.ts +9 -9
  23. package/src/measures/reactive-energy.ts +7 -7
  24. package/src/measures/reactive-power.ts +3 -3
  25. package/src/measures/temperature.ts +9 -9
  26. package/src/measures/time.ts +3 -3
  27. package/src/measures/volume-flow.ts +25 -25
  28. package/src/measures/volume.ts +3 -3
  29. package/src/medium.spec.ts +12 -12
  30. package/src/medium.ts +47 -47
  31. package/src/number-formatter.spec.ts +549 -549
  32. package/src/number-formatter.ts +118 -118
  33. package/src/optional.ts +1 -1
  34. package/src/precision-number.spec.ts +251 -251
  35. package/src/precision-number.ts +123 -123
  36. package/src/register-convention.spec.ts +52 -52
  37. package/src/register-convention.ts +70 -70
  38. package/src/register-definition.ts +23 -23
  39. package/src/register-id.ts +288 -288
  40. package/src/register-library.spec.ts +41 -41
  41. package/src/register-library.ts +64 -64
  42. package/src/register-pack.ts +5 -5
  43. package/src/register-utils.ts +6 -6
  44. package/src/registers/acoustic-noise.ts +52 -52
  45. package/src/registers/ambient-temperature.ts +52 -52
  46. package/src/registers/axioma-infocode.ts +16 -16
  47. package/src/registers/consumer.ts +17 -17
  48. package/src/registers/cooling-energy-inlet.ts +23 -23
  49. package/src/registers/cooling-energy-outlet.ts +23 -23
  50. package/src/registers/cooling-energy.ts +23 -23
  51. package/src/registers/cooling.ts +113 -113
  52. package/src/registers/device-addresses-kamdraft.ts +14 -14
  53. package/src/registers/device-addresses-msisdn.ts +14 -14
  54. package/src/registers/device-addresses-tchlr.ts +14 -14
  55. package/src/registers/device-addresses-wmbus.ts +17 -17
  56. package/src/registers/device-date-time.ts +9 -9
  57. package/src/registers/device-date.ts +9 -9
  58. package/src/registers/device-nominal-diameter.ts +9 -9
  59. package/src/registers/device-permanent-volume-flow.ts +9 -9
  60. package/src/registers/device-registers.ts +9 -9
  61. package/src/registers/device-samples.ts +37 -37
  62. package/src/registers/device-software-version.ts +8 -8
  63. package/src/registers/device-time.ts +9 -9
  64. package/src/registers/device.ts +16 -16
  65. package/src/registers/diehl-infocode.ts +44 -44
  66. package/src/registers/electrical-energy.ts +23 -23
  67. package/src/registers/energy-inlet.ts +23 -23
  68. package/src/registers/energy-outlet.ts +23 -23
  69. package/src/registers/error-operating-time.ts +23 -23
  70. package/src/registers/flow-temperature-aux.ts +52 -52
  71. package/src/registers/flow-temperature-inlet.ts +52 -52
  72. package/src/registers/flow-temperature-outlet.ts +52 -52
  73. package/src/registers/flow-temperature.ts +52 -52
  74. package/src/registers/heat-energy-inlet.ts +65 -65
  75. package/src/registers/heat-energy-outlet.ts +65 -65
  76. package/src/registers/heat-energy.ts +65 -65
  77. package/src/registers/index.ts +71 -71
  78. package/src/registers/infocode.ts +70 -70
  79. package/src/registers/kamstrup-module-type.ts +8 -8
  80. package/src/registers/kamstrup-multical-infocode.ts +58 -58
  81. package/src/registers/landis-gyr-infocode.ts +23 -23
  82. package/src/registers/landis-gyr-mbus-status.ts +23 -23
  83. package/src/registers/mass-flow-inlet.ts +52 -52
  84. package/src/registers/mass-flow-outlet.ts +52 -52
  85. package/src/registers/mass-flow.ts +52 -52
  86. package/src/registers/mass-inlet.ts +23 -23
  87. package/src/registers/mass-outlet.ts +23 -23
  88. package/src/registers/mass.ts +23 -23
  89. package/src/registers/mbus-format-string-signature.ts +8 -8
  90. package/src/registers/none.ts +8 -8
  91. package/src/registers/operating-time.ts +23 -23
  92. package/src/registers/place.ts +31 -31
  93. package/src/registers/power-inlet.ts +52 -52
  94. package/src/registers/power-outlet.ts +52 -52
  95. package/src/registers/power.ts +52 -52
  96. package/src/registers/pressure-inlet.ts +52 -52
  97. package/src/registers/pressure-outlet.ts +52 -52
  98. package/src/registers/pressure.ts +52 -52
  99. package/src/registers/radiator-temperature.ts +52 -52
  100. package/src/registers/reactive-energy.ts +23 -23
  101. package/src/registers/relative-humidity.ts +8 -8
  102. package/src/registers/remaining-battery-time.ts +23 -23
  103. package/src/registers/time-last-exact-overhearing-arrived.ts +19 -19
  104. package/src/registers/time-last-installation-mounted.ts +19 -19
  105. package/src/registers/time-last-possible-candidate-overhearing-arrived.ts +21 -21
  106. package/src/registers/time-last-sampled.ts +19 -19
  107. package/src/registers/time.ts +45 -45
  108. package/src/registers/volume-flow-inlet.ts +52 -52
  109. package/src/registers/volume-flow-outlet.ts +52 -52
  110. package/src/registers/volume-flow.ts +52 -52
  111. package/src/registers/volume-inlet.ts +23 -23
  112. package/src/registers/volume-outlet.ts +23 -23
  113. package/src/registers/volume-pulse-input-a.ts +23 -23
  114. package/src/registers/volume-pulse-input-b.ts +23 -23
  115. package/src/registers/volume.ts +23 -23
  116. package/src/repository.spec.ts +30 -30
  117. package/src/repository.ts +26 -26
  118. package/src/step.spec.ts +37 -37
  119. package/src/step.ts +45 -45
  120. package/src/time-or-rule.ts +42 -42
  121. package/src/unit-id.ts +108 -108
@@ -1,194 +1,194 @@
1
- import { expect } from "chai";
2
-
3
- import { CursorNavigationState } from "./cursor-navigation-state";
4
-
5
- describe("CursorNavigationState", () => {
6
- it("tracks forward navigation and infers totals from the last page", () => {
7
- const state = new CursorNavigationState({ limit: 2 });
8
-
9
- state.visitPage("", {
10
- items: [1, 2],
11
- nextCursor: "page-2",
12
- hasMore: true,
13
- });
14
-
15
- expect(state.pageNumber).to.equal(1);
16
- expect(state.firstItemNumber).to.equal(1);
17
- expect(state.lastItemNumber).to.equal(2);
18
- expect(state.nextCursor).to.equal("page-2");
19
- expect(state.previousCursor).to.equal("");
20
- expect(state.currentIsFirst).to.equal(true);
21
- expect(state.currentIsLast).to.equal(false);
22
- expect(state.toString()).to.equal("1-2 / ?");
23
-
24
- state.visitPage("page-2", {
25
- items: [3, 4],
26
- nextCursor: "page-3",
27
- hasMore: true,
28
- });
29
-
30
- expect(state.pageNumber).to.equal(2);
31
- expect(state.firstItemNumber).to.equal(3);
32
- expect(state.lastItemNumber).to.equal(4);
33
- expect(state.nextCursor).to.equal("page-3");
34
- expect(state.previousCursor).to.equal("");
35
-
36
- state.visitPage("page-3", {
37
- items: [5],
38
- nextCursor: null,
39
- hasMore: false,
40
- });
41
-
42
- expect(state.pageNumber).to.equal(3);
43
- expect(state.firstItemNumber).to.equal(5);
44
- expect(state.lastItemNumber).to.equal(5);
45
- expect(state.totalCount).to.equal(5);
46
- expect(state.pageCount).to.equal(3);
47
- expect(state.nextCursor).to.equal("page-3");
48
- expect(state.previousCursor).to.equal("page-2");
49
- expect(state.currentIsLast).to.equal(true);
50
- expect(state.toString()).to.equal("5-5 / 5");
51
- });
52
-
53
- it("uses the visited cursor chain when navigating back to earlier pages", () => {
54
- const state = new CursorNavigationState({ limit: 2 });
55
-
56
- state.visitPage("", {
57
- items: [1, 2],
58
- nextCursor: "page-2",
59
- hasMore: true,
60
- });
61
- state.visitPage("page-2", {
62
- items: [3, 4],
63
- nextCursor: "page-3",
64
- hasMore: true,
65
- });
66
- state.visitPage("page-3", {
67
- items: [5],
68
- nextCursor: null,
69
- hasMore: false,
70
- });
71
-
72
- state.visitPage("", {
73
- items: [1, 2],
74
- nextCursor: "page-2",
75
- hasMore: true,
76
- });
77
-
78
- expect(state.pageNumber).to.equal(1);
79
- expect(state.firstItemNumber).to.equal(1);
80
- expect(state.lastItemNumber).to.equal(2);
81
- expect(state.previousCursor).to.equal("");
82
- expect(state.nextCursor).to.equal("page-2");
83
- expect(state.currentIsFirst).to.equal(true);
84
- expect(state.currentIsLast).to.equal(false);
85
- expect(state.totalCount).to.equal(5);
86
- });
87
-
88
- it("tracks per-cursor item counts without regressing the future cursor", () => {
89
- const state = new CursorNavigationState({ limit: 2 });
90
-
91
- state.visitPage("", {
92
- items: [1, 2],
93
- nextCursor: "page-2",
94
- hasMore: true,
95
- });
96
-
97
- state.visitPage("page-2", {
98
- items: [3, 4],
99
- nextCursor: "page-3",
100
- hasMore: true,
101
- });
102
-
103
- state.visitPage("", {
104
- items: [1],
105
- nextCursor: null,
106
- hasMore: false,
107
- });
108
-
109
- expect(state.firstItemNumber).to.equal(1);
110
- expect(state.lastItemNumber).to.equal(1);
111
- expect(state.futureCursor).to.equal("page-3");
112
- expect(state.nextCursor).to.equal("page-2");
113
- expect(state.currentIsLast).to.equal(false);
114
- expect(state.totalCount).to.equal(null);
115
-
116
- state.visitPage("page-2", {
117
- items: [2],
118
- nextCursor: "page-3",
119
- hasMore: true,
120
- });
121
-
122
- expect(state.firstItemNumber).to.equal(2);
123
- expect(state.lastItemNumber).to.equal(2);
124
- expect(state.nextCursor).to.equal("page-3");
125
-
126
- state.visitPage("page-3", {
127
- items: [3],
128
- nextCursor: null,
129
- hasMore: false,
130
- });
131
-
132
- expect(state.totalCount).to.equal(3);
133
- expect(state.pageCount).to.equal(2);
134
- expect(state.firstItemNumber).to.equal(3);
135
- expect(state.lastItemNumber).to.equal(3);
136
- expect(state.currentIsLast).to.equal(true);
137
- expect(state.toString()).to.equal("3-3 / 3");
138
- });
139
-
140
- it("supports starting from an intermediate cursor with forward-only navigation", () => {
141
- const state = new CursorNavigationState({ limit: 2 });
142
-
143
- state.visitPage("page-2", {
144
- items: [3, 4],
145
- nextCursor: "page-3",
146
- hasMore: true,
147
- });
148
-
149
- expect(state.pageNumber).to.equal(0);
150
- expect(state.firstItemNumber).to.equal(0);
151
- expect(state.lastItemNumber).to.equal(0);
152
- expect(state.previousCursor).to.equal("");
153
- expect(state.nextCursor).to.equal("page-3");
154
- expect(state.currentIsFirst).to.equal(false);
155
- expect(state.currentIsLast).to.equal(false);
156
- expect(state.totalCount).to.equal(null);
157
- expect(state.toString()).to.equal("... / ?");
158
-
159
- state.visitPage("page-3", {
160
- items: [5],
161
- nextCursor: null,
162
- hasMore: false,
163
- });
164
-
165
- // Still zero/unknown since we never visited the first page
166
- expect(state.pageNumber).to.equal(0);
167
- expect(state.firstItemNumber).to.equal(0);
168
- expect(state.lastItemNumber).to.equal(0);
169
- expect(state.previousCursor).to.equal("");
170
- expect(state.nextCursor).to.equal("page-3");
171
- expect(state.currentIsLast).to.equal(true);
172
- expect(state.totalCount).to.equal(null);
173
- expect(state.toString()).to.equal("... / ?");
174
- });
175
-
176
- it("reports zero-based item ranges for an empty result set", () => {
177
- const state = new CursorNavigationState({ limit: 10 });
178
-
179
- state.visitPage("", {
180
- items: [],
181
- nextCursor: null,
182
- hasMore: false,
183
- });
184
-
185
- expect(state.pageNumber).to.equal(1);
186
- expect(state.pageCount).to.equal(0);
187
- expect(state.totalCount).to.equal(0);
188
- expect(state.firstItemNumber).to.equal(0);
189
- expect(state.lastItemNumber).to.equal(0);
190
- expect(state.currentIsFirst).to.equal(true);
191
- expect(state.currentIsLast).to.equal(true);
192
- expect(state.toString()).to.equal("0-0 / 0");
193
- });
194
- });
1
+ import { expect } from "chai";
2
+
3
+ import { CursorNavigationState } from "./cursor-navigation-state";
4
+
5
+ describe("CursorNavigationState", () => {
6
+ it("tracks forward navigation and infers totals from the last page", () => {
7
+ const state = new CursorNavigationState({ limit: 2 });
8
+
9
+ state.visitPage("", {
10
+ items: [1, 2],
11
+ nextCursor: "page-2",
12
+ hasMore: true,
13
+ });
14
+
15
+ expect(state.pageNumber).to.equal(1);
16
+ expect(state.firstItemNumber).to.equal(1);
17
+ expect(state.lastItemNumber).to.equal(2);
18
+ expect(state.nextCursor).to.equal("page-2");
19
+ expect(state.previousCursor).to.equal("");
20
+ expect(state.currentIsFirst).to.equal(true);
21
+ expect(state.currentIsLast).to.equal(false);
22
+ expect(state.toString()).to.equal("1-2 / ?");
23
+
24
+ state.visitPage("page-2", {
25
+ items: [3, 4],
26
+ nextCursor: "page-3",
27
+ hasMore: true,
28
+ });
29
+
30
+ expect(state.pageNumber).to.equal(2);
31
+ expect(state.firstItemNumber).to.equal(3);
32
+ expect(state.lastItemNumber).to.equal(4);
33
+ expect(state.nextCursor).to.equal("page-3");
34
+ expect(state.previousCursor).to.equal("");
35
+
36
+ state.visitPage("page-3", {
37
+ items: [5],
38
+ nextCursor: null,
39
+ hasMore: false,
40
+ });
41
+
42
+ expect(state.pageNumber).to.equal(3);
43
+ expect(state.firstItemNumber).to.equal(5);
44
+ expect(state.lastItemNumber).to.equal(5);
45
+ expect(state.totalCount).to.equal(5);
46
+ expect(state.pageCount).to.equal(3);
47
+ expect(state.nextCursor).to.equal("page-3");
48
+ expect(state.previousCursor).to.equal("page-2");
49
+ expect(state.currentIsLast).to.equal(true);
50
+ expect(state.toString()).to.equal("5-5 / 5");
51
+ });
52
+
53
+ it("uses the visited cursor chain when navigating back to earlier pages", () => {
54
+ const state = new CursorNavigationState({ limit: 2 });
55
+
56
+ state.visitPage("", {
57
+ items: [1, 2],
58
+ nextCursor: "page-2",
59
+ hasMore: true,
60
+ });
61
+ state.visitPage("page-2", {
62
+ items: [3, 4],
63
+ nextCursor: "page-3",
64
+ hasMore: true,
65
+ });
66
+ state.visitPage("page-3", {
67
+ items: [5],
68
+ nextCursor: null,
69
+ hasMore: false,
70
+ });
71
+
72
+ state.visitPage("", {
73
+ items: [1, 2],
74
+ nextCursor: "page-2",
75
+ hasMore: true,
76
+ });
77
+
78
+ expect(state.pageNumber).to.equal(1);
79
+ expect(state.firstItemNumber).to.equal(1);
80
+ expect(state.lastItemNumber).to.equal(2);
81
+ expect(state.previousCursor).to.equal("");
82
+ expect(state.nextCursor).to.equal("page-2");
83
+ expect(state.currentIsFirst).to.equal(true);
84
+ expect(state.currentIsLast).to.equal(false);
85
+ expect(state.totalCount).to.equal(5);
86
+ });
87
+
88
+ it("tracks per-cursor item counts without regressing the future cursor", () => {
89
+ const state = new CursorNavigationState({ limit: 2 });
90
+
91
+ state.visitPage("", {
92
+ items: [1, 2],
93
+ nextCursor: "page-2",
94
+ hasMore: true,
95
+ });
96
+
97
+ state.visitPage("page-2", {
98
+ items: [3, 4],
99
+ nextCursor: "page-3",
100
+ hasMore: true,
101
+ });
102
+
103
+ state.visitPage("", {
104
+ items: [1],
105
+ nextCursor: null,
106
+ hasMore: false,
107
+ });
108
+
109
+ expect(state.firstItemNumber).to.equal(1);
110
+ expect(state.lastItemNumber).to.equal(1);
111
+ expect(state.futureCursor).to.equal("page-3");
112
+ expect(state.nextCursor).to.equal("page-2");
113
+ expect(state.currentIsLast).to.equal(false);
114
+ expect(state.totalCount).to.equal(null);
115
+
116
+ state.visitPage("page-2", {
117
+ items: [2],
118
+ nextCursor: "page-3",
119
+ hasMore: true,
120
+ });
121
+
122
+ expect(state.firstItemNumber).to.equal(2);
123
+ expect(state.lastItemNumber).to.equal(2);
124
+ expect(state.nextCursor).to.equal("page-3");
125
+
126
+ state.visitPage("page-3", {
127
+ items: [3],
128
+ nextCursor: null,
129
+ hasMore: false,
130
+ });
131
+
132
+ expect(state.totalCount).to.equal(3);
133
+ expect(state.pageCount).to.equal(2);
134
+ expect(state.firstItemNumber).to.equal(3);
135
+ expect(state.lastItemNumber).to.equal(3);
136
+ expect(state.currentIsLast).to.equal(true);
137
+ expect(state.toString()).to.equal("3-3 / 3");
138
+ });
139
+
140
+ it("supports starting from an intermediate cursor with forward-only navigation", () => {
141
+ const state = new CursorNavigationState({ limit: 2 });
142
+
143
+ state.visitPage("page-2", {
144
+ items: [3, 4],
145
+ nextCursor: "page-3",
146
+ hasMore: true,
147
+ });
148
+
149
+ expect(state.pageNumber).to.equal(0);
150
+ expect(state.firstItemNumber).to.equal(0);
151
+ expect(state.lastItemNumber).to.equal(0);
152
+ expect(state.previousCursor).to.equal("");
153
+ expect(state.nextCursor).to.equal("page-3");
154
+ expect(state.currentIsFirst).to.equal(false);
155
+ expect(state.currentIsLast).to.equal(false);
156
+ expect(state.totalCount).to.equal(null);
157
+ expect(state.toString()).to.equal("... / ?");
158
+
159
+ state.visitPage("page-3", {
160
+ items: [5],
161
+ nextCursor: null,
162
+ hasMore: false,
163
+ });
164
+
165
+ // Still zero/unknown since we never visited the first page
166
+ expect(state.pageNumber).to.equal(0);
167
+ expect(state.firstItemNumber).to.equal(0);
168
+ expect(state.lastItemNumber).to.equal(0);
169
+ expect(state.previousCursor).to.equal("");
170
+ expect(state.nextCursor).to.equal("page-3");
171
+ expect(state.currentIsLast).to.equal(true);
172
+ expect(state.totalCount).to.equal(null);
173
+ expect(state.toString()).to.equal("... / ?");
174
+ });
175
+
176
+ it("reports zero-based item ranges for an empty result set", () => {
177
+ const state = new CursorNavigationState({ limit: 10 });
178
+
179
+ state.visitPage("", {
180
+ items: [],
181
+ nextCursor: null,
182
+ hasMore: false,
183
+ });
184
+
185
+ expect(state.pageNumber).to.equal(1);
186
+ expect(state.pageCount).to.equal(0);
187
+ expect(state.totalCount).to.equal(0);
188
+ expect(state.firstItemNumber).to.equal(0);
189
+ expect(state.lastItemNumber).to.equal(0);
190
+ expect(state.currentIsFirst).to.equal(true);
191
+ expect(state.currentIsLast).to.equal(true);
192
+ expect(state.toString()).to.equal("0-0 / 0");
193
+ });
194
+ });