@utiliread/primitives 1.0.0-6 → 1.0.0-60
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.
- package/dist/cjs/index.js +17 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/measure-id.js +3 -0
- package/dist/cjs/measure-id.js.map +1 -0
- package/dist/cjs/number-formatter.js +66 -39
- package/dist/cjs/number-formatter.js.map +1 -1
- package/dist/cjs/number-formatter.spec.js +94 -0
- package/dist/cjs/number-formatter.spec.js.map +1 -0
- package/dist/cjs/optional.js +3 -0
- package/dist/cjs/optional.js.map +1 -0
- package/dist/cjs/precision-number.js +36 -0
- package/dist/cjs/precision-number.js.map +1 -0
- package/dist/cjs/precision-number.spec.js +27 -0
- package/dist/cjs/precision-number.spec.js.map +1 -0
- package/dist/cjs/register-convention.js +56 -0
- package/dist/cjs/register-convention.js.map +1 -0
- package/dist/cjs/register-convention.spec.js +39 -0
- package/dist/cjs/register-convention.spec.js.map +1 -0
- package/dist/cjs/register-library.js +31 -22
- package/dist/cjs/register-library.js.map +1 -1
- package/dist/cjs/register-library.spec.js +20 -13
- package/dist/cjs/register-library.spec.js.map +1 -1
- package/dist/cjs/register-utils.js +8 -0
- package/dist/cjs/register-utils.js.map +1 -0
- package/dist/cjs/repository.js +26 -0
- package/dist/cjs/repository.js.map +1 -0
- package/dist/cjs/repository.spec.js +21 -0
- package/dist/cjs/repository.spec.js.map +1 -0
- package/dist/cjs/step.js +41 -0
- package/dist/cjs/step.js.map +1 -0
- package/dist/cjs/step.spec.js +29 -0
- package/dist/cjs/step.spec.js.map +1 -0
- package/dist/cjs/time-or-rule.js +19 -0
- package/dist/cjs/time-or-rule.js.map +1 -0
- package/dist/cjs/unit-id.js.map +1 -1
- package/dist/esm/index.d.ts +15 -7
- package/dist/esm/index.js +8 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/measure-id.d.ts +1 -0
- package/dist/esm/measure-id.js +2 -0
- package/dist/esm/measure-id.js.map +1 -0
- package/dist/esm/number-formatter.d.ts +9 -0
- package/dist/esm/number-formatter.js +69 -42
- package/dist/esm/number-formatter.js.map +1 -1
- package/dist/esm/{register-converter.spec.d.ts → number-formatter.spec.d.ts} +0 -0
- package/dist/esm/number-formatter.spec.js +92 -0
- package/dist/esm/number-formatter.spec.js.map +1 -0
- package/dist/esm/optional.d.ts +1 -0
- package/dist/esm/optional.js +2 -0
- package/dist/esm/optional.js.map +1 -0
- package/dist/esm/precision-number.d.ts +11 -0
- package/dist/esm/precision-number.js +32 -0
- package/dist/esm/precision-number.js.map +1 -0
- package/dist/esm/precision-number.spec.d.ts +1 -0
- package/dist/esm/precision-number.spec.js +25 -0
- package/dist/esm/precision-number.spec.js.map +1 -0
- package/dist/esm/register-convention.d.ts +14 -0
- package/dist/esm/register-convention.js +52 -0
- package/dist/esm/register-convention.js.map +1 -0
- package/dist/esm/register-convention.spec.d.ts +1 -0
- package/dist/esm/register-convention.spec.js +37 -0
- package/dist/esm/register-convention.spec.js.map +1 -0
- package/dist/esm/register-definition.d.ts +4 -0
- package/dist/esm/register-id.d.ts +1 -1
- package/dist/esm/register-library.d.ts +4 -0
- package/dist/esm/register-library.js +32 -23
- package/dist/esm/register-library.js.map +1 -1
- package/dist/esm/register-library.spec.js +16 -9
- package/dist/esm/register-library.spec.js.map +1 -1
- package/dist/esm/register-utils.d.ts +3 -0
- package/dist/esm/register-utils.js +4 -0
- package/dist/esm/register-utils.js.map +1 -0
- package/dist/esm/repository.d.ts +9 -0
- package/dist/esm/repository.js +22 -0
- package/dist/esm/repository.js.map +1 -0
- package/dist/esm/repository.spec.d.ts +1 -0
- package/dist/esm/repository.spec.js +19 -0
- package/dist/esm/repository.spec.js.map +1 -0
- package/dist/esm/step.d.ts +15 -0
- package/dist/esm/step.js +38 -0
- package/dist/esm/step.js.map +1 -0
- package/dist/esm/step.spec.d.ts +1 -0
- package/dist/esm/step.spec.js +27 -0
- package/dist/esm/step.spec.js.map +1 -0
- package/dist/esm/time-or-rule.d.ts +7 -0
- package/dist/esm/time-or-rule.js +16 -0
- package/dist/esm/time-or-rule.js.map +1 -0
- package/dist/esm/unit-id.d.ts +1 -1
- package/dist/esm/unit-id.js +1 -1
- package/dist/esm/unit-id.js.map +1 -1
- package/karma.config.js +11 -14
- package/locales/da/aggregates.json +8 -0
- package/locales/da/consumption-types.json +7 -0
- package/locales/da/measures.json +15 -0
- package/locales/da/registers.json +198 -0
- package/locales/da/units.json +90 -0
- package/locales/en/aggregates.json +8 -0
- package/locales/en/consumption-types.json +7 -0
- package/locales/en/measures.json +15 -0
- package/locales/en/registers.json +198 -0
- package/locales/en/units.json +90 -0
- package/package.json +11 -4
- package/src/aggregate-id.ts +9 -9
- package/src/consumption-type-id.ts +8 -8
- package/src/index.ts +29 -11
- package/src/measure-id.ts +14 -0
- package/src/number-formatter.spec.ts +99 -0
- package/src/number-formatter.ts +88 -52
- package/src/optional.ts +1 -0
- package/src/precision-number.spec.ts +28 -0
- package/src/precision-number.ts +36 -0
- package/src/register-convention.spec.ts +43 -0
- package/src/register-convention.ts +61 -0
- package/src/register-definition.ts +23 -10
- package/src/register-id.ts +80 -6
- package/src/register-library.spec.ts +41 -33
- package/src/register-library.ts +57 -37
- package/src/register-pack.ts +5 -5
- package/src/register-utils.ts +6 -0
- package/src/repository.spec.ts +20 -0
- package/src/repository.ts +24 -0
- package/src/step.spec.ts +30 -0
- package/src/step.ts +37 -0
- package/src/time-or-rule.ts +17 -0
- package/src/unit-id.ts +126 -100
- package/tsconfig.cjs.json +7 -8
- package/tsconfig.json +15 -14
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/base.css +0 -224
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/block-navigation.js +0 -79
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/favicon.png +0 -0
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/index.html +0 -96
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.css +0 -1
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.js +0 -2
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sort-arrow-sprite.png +0 -0
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sorter.js +0 -170
- package/dist/cjs/register-converter.js +0 -47
- package/dist/cjs/register-converter.js.map +0 -1
- package/dist/cjs/register-converter.spec.js +0 -29
- package/dist/cjs/register-converter.spec.js.map +0 -1
- package/dist/esm/register-converter.d.ts +0 -9
- package/dist/esm/register-converter.js +0 -44
- package/dist/esm/register-converter.js.map +0 -1
- package/dist/esm/register-converter.spec.js +0 -27
- package/dist/esm/register-converter.spec.js.map +0 -1
- package/src/register-converter.spec.ts +0 -31
- package/src/register-converter.ts +0 -48
|
@@ -1,10 +1,23 @@
|
|
|
1
|
-
import { UnitId } from ".";
|
|
2
|
-
import { AggregateId } from "./aggregate-id";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { UnitId } from ".";
|
|
2
|
+
import { AggregateId } from "./aggregate-id";
|
|
3
|
+
import { MeasureId } from "./measure-id";
|
|
4
|
+
import { RegisterId } from "./register-id";
|
|
5
|
+
|
|
6
|
+
export interface RegisterDefinition {
|
|
7
|
+
/// The id of the register
|
|
8
|
+
id: RegisterId;
|
|
9
|
+
/// The register measure
|
|
10
|
+
measure: MeasureId;
|
|
11
|
+
/// The aggregate of the register
|
|
12
|
+
aggregate: AggregateId;
|
|
13
|
+
/// The possible register units
|
|
14
|
+
units: ReadonlyArray<UnitId>;
|
|
15
|
+
/// Whether the register can only be resolved by "present value".
|
|
16
|
+
immediate?: true;
|
|
17
|
+
/// An optional concise register name.
|
|
18
|
+
/// Only used for custom registers as locales exist for standard registers.
|
|
19
|
+
name?: string;
|
|
20
|
+
/// An optional register description.
|
|
21
|
+
/// Only used for custom registers as locales exist for standard registers.
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
package/src/register-id.ts
CHANGED
|
@@ -1,146 +1,214 @@
|
|
|
1
1
|
export type RegisterId =
|
|
2
2
|
"none" |
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
"heatEnergy" |
|
|
5
5
|
"diffHeatEnergy" |
|
|
6
|
+
"cntHeatEnergy" |
|
|
6
7
|
|
|
7
8
|
"heatEnergyVolumeInInlet" |
|
|
8
9
|
"diffHeatEnergyVolumeInInlet" |
|
|
10
|
+
"cntHeatEnergyVolumeInInlet" |
|
|
9
11
|
|
|
10
12
|
"heatEnergyVolumeInOutlet" |
|
|
11
13
|
"diffHeatEnergyVolumeInOutlet" |
|
|
14
|
+
"cntHeatEnergyVolumeInOutlet" |
|
|
12
15
|
|
|
13
16
|
"coolingEnergy" |
|
|
14
17
|
"diffCoolingEnergy" |
|
|
18
|
+
"cntCoolingEnergy" |
|
|
15
19
|
|
|
16
20
|
"coolingEnergyVolumeInInlet" |
|
|
17
21
|
"diffCoolingEnergyVolumeInInlet" |
|
|
22
|
+
"cntCoolingEnergyVolumeInInlet" |
|
|
18
23
|
|
|
19
24
|
"coolingEnergyVolumeInOutlet" |
|
|
20
25
|
"diffCoolingEnergyVolumeInOutlet" |
|
|
26
|
+
"cntCoolingEnergyVolumeInOutlet" |
|
|
21
27
|
|
|
22
28
|
"electricalEnergy" |
|
|
23
29
|
"diffElectricalEnergy" |
|
|
30
|
+
"cntElectricalEnergy" |
|
|
24
31
|
|
|
25
32
|
"reactiveEnergy" |
|
|
26
33
|
"diffReactiveEnergy" |
|
|
34
|
+
"cntReactiveEnergy" |
|
|
27
35
|
|
|
28
36
|
"volume" |
|
|
29
37
|
"diffVolume" |
|
|
38
|
+
"cntVolume" |
|
|
30
39
|
|
|
31
40
|
"inletVolume" |
|
|
32
41
|
"diffInletVolume" |
|
|
42
|
+
"cntInletVolume" |
|
|
33
43
|
|
|
34
44
|
"outletVolume" |
|
|
35
45
|
"diffOutletVolume" |
|
|
46
|
+
"cntOutletVolume" |
|
|
36
47
|
|
|
37
48
|
"pulseInputAVolume" |
|
|
38
49
|
"diffPulseInputAVolume" |
|
|
50
|
+
"cntPulseInputAVolume" |
|
|
39
51
|
|
|
40
52
|
"pulseInputBVolume" |
|
|
41
53
|
"diffPulseInputBVolume" |
|
|
54
|
+
"cntPulseInputBVolume" |
|
|
42
55
|
|
|
43
56
|
"mass" |
|
|
44
57
|
"diffMass" |
|
|
58
|
+
"cntMass" |
|
|
45
59
|
|
|
46
60
|
"inletMass" |
|
|
47
61
|
"diffInletMass" |
|
|
62
|
+
"cntInletMass" |
|
|
48
63
|
|
|
49
64
|
"outletMass" |
|
|
50
65
|
"diffOutletMass" |
|
|
66
|
+
"cntOutletMass" |
|
|
51
67
|
|
|
52
68
|
"power" |
|
|
53
69
|
"maxPower" |
|
|
54
70
|
"minPower" |
|
|
55
71
|
"avgPower" |
|
|
72
|
+
"sumPower" |
|
|
73
|
+
"cntPower" |
|
|
74
|
+
"ssqPower" |
|
|
56
75
|
|
|
57
76
|
"inletPower" |
|
|
58
77
|
"maxInletPower" |
|
|
59
78
|
"minInletPower" |
|
|
60
79
|
"avgInletPower" |
|
|
80
|
+
"sumInletPower" |
|
|
81
|
+
"cntInletPower" |
|
|
82
|
+
"ssqInletPower" |
|
|
61
83
|
|
|
62
84
|
"outletPower" |
|
|
63
85
|
"maxOutletPower" |
|
|
64
86
|
"minOutletPower" |
|
|
65
87
|
"avgOutletPower" |
|
|
88
|
+
"sumOutletPower" |
|
|
89
|
+
"cntOutletPower" |
|
|
90
|
+
"ssqOutletPower" |
|
|
66
91
|
|
|
67
92
|
"volumeFlow" |
|
|
68
93
|
"maxVolumeFlow" |
|
|
69
94
|
"minVolumeFlow" |
|
|
70
95
|
"avgVolumeFlow" |
|
|
96
|
+
"sumVolumeFlow" |
|
|
97
|
+
"cntVolumeFlow" |
|
|
98
|
+
"ssqVolumeFlow" |
|
|
71
99
|
|
|
72
100
|
"inletVolumeFlow" |
|
|
73
101
|
"maxInletVolumeFlow" |
|
|
74
102
|
"minInletVolumeFlow" |
|
|
75
103
|
"avgInletVolumeFlow" |
|
|
104
|
+
"sumInletVolumeFlow" |
|
|
105
|
+
"cntInletVolumeFlow" |
|
|
106
|
+
"ssqInletVolumeFlow" |
|
|
76
107
|
|
|
77
108
|
"outletVolumeFlow" |
|
|
78
109
|
"maxOutletVolumeFlow" |
|
|
79
110
|
"minOutletVolumeFlow" |
|
|
80
111
|
"avgOutletVolumeFlow" |
|
|
112
|
+
"sumOutletVolumeFlow" |
|
|
113
|
+
"cntOutletVolumeFlow" |
|
|
114
|
+
"ssqOutletVolumeFlow" |
|
|
81
115
|
|
|
82
116
|
"massFlow" |
|
|
83
117
|
"maxMassFlow" |
|
|
84
118
|
"minMassFlow" |
|
|
85
119
|
"avgMassFlow" |
|
|
120
|
+
"sumMassFlow" |
|
|
121
|
+
"cntMassFlow" |
|
|
122
|
+
"ssqMassFlow" |
|
|
86
123
|
|
|
87
124
|
"inletMassFlow" |
|
|
88
125
|
"maxInletMassFlow" |
|
|
89
126
|
"minInletMassFlow" |
|
|
90
127
|
"avgInletMassFlow" |
|
|
128
|
+
"sumInletMassFlow" |
|
|
129
|
+
"cntInletMassFlow" |
|
|
130
|
+
"ssqInletMassFlow" |
|
|
91
131
|
|
|
92
132
|
"outletMassFlow" |
|
|
93
133
|
"maxOutletMassFlow" |
|
|
94
134
|
"minOutletMassFlow" |
|
|
95
135
|
"avgOutletMassFlow" |
|
|
136
|
+
"sumOutletMassFlow" |
|
|
137
|
+
"cntOutletMassFlow" |
|
|
138
|
+
"ssqOutletMassFlow" |
|
|
96
139
|
|
|
97
140
|
"flowTemperature" |
|
|
98
141
|
"maxFlowTemperature" |
|
|
99
142
|
"minFlowTemperature" |
|
|
100
143
|
"avgFlowTemperature" |
|
|
144
|
+
"sumFlowTemperature" |
|
|
145
|
+
"cntFlowTemperature" |
|
|
146
|
+
"ssqFlowTemperature" |
|
|
101
147
|
|
|
102
148
|
"inletFlowTemperature" |
|
|
103
149
|
"maxInletFlowTemperature" |
|
|
104
150
|
"minInletFlowTemperature" |
|
|
105
151
|
"avgInletFlowTemperature" |
|
|
152
|
+
"sumInletFlowTemperature" |
|
|
153
|
+
"cntInletFlowTemperature" |
|
|
154
|
+
"ssqInletFlowTemperature" |
|
|
106
155
|
|
|
107
156
|
"outletFlowTemperature" |
|
|
108
157
|
"maxOutletFlowTemperature" |
|
|
109
158
|
"minOutletFlowTemperature" |
|
|
110
159
|
"avgOutletFlowTemperature" |
|
|
160
|
+
"sumOutletFlowTemperature" |
|
|
161
|
+
"cntOutletFlowTemperature" |
|
|
162
|
+
"ssqOutletFlowTemperature" |
|
|
111
163
|
|
|
112
164
|
"inletMinusOutletFlowTemperatureDifference" |
|
|
113
165
|
"maxInletMinusOutletFlowTemperatureDifference" |
|
|
114
166
|
"minInletMinusOutletFlowTemperatureDifference" |
|
|
115
167
|
"avgInletMinusOutletFlowTemperatureDifference" |
|
|
168
|
+
"sumInletMinusOutletFlowTemperatureDifference" |
|
|
169
|
+
"cntInletMinusOutletFlowTemperatureDifference" |
|
|
170
|
+
"ssqInletMinusOutletFlowTemperatureDifference" |
|
|
116
171
|
|
|
117
172
|
"outletMinusInletFlowTemperatureDifference" |
|
|
118
173
|
"maxOutletMinusInletFlowTemperatureDifference" |
|
|
119
174
|
"minOutletMinusInletFlowTemperatureDifference" |
|
|
120
175
|
"avgOutletMinusInletFlowTemperatureDifference" |
|
|
176
|
+
"sumOutletMinusInletFlowTemperatureDifference" |
|
|
177
|
+
"cntOutletMinusInletFlowTemperatureDifference" |
|
|
178
|
+
"ssqOutletMinusInletFlowTemperatureDifference" |
|
|
121
179
|
|
|
122
180
|
"ambientTemperature" |
|
|
123
181
|
"maxAmbientTemperature" |
|
|
124
182
|
"minAmbientTemperature" |
|
|
125
183
|
"avgAmbientTemperature" |
|
|
184
|
+
"sumAmbientTemperature" |
|
|
185
|
+
"cntAmbientTemperature" |
|
|
186
|
+
"ssqAmbientTemperature" |
|
|
126
187
|
|
|
127
188
|
"radiatorTemperature" |
|
|
128
189
|
"maxRadiatorTemperature" |
|
|
129
190
|
"minRadiatorTemperature" |
|
|
130
191
|
"avgRadiatorTemperature" |
|
|
192
|
+
"sumRadiatorTemperature" |
|
|
193
|
+
"cntRadiatorTemperature" |
|
|
194
|
+
"ssqRadiatorTemperature" |
|
|
131
195
|
|
|
132
196
|
"relativeHumidity" |
|
|
133
197
|
|
|
134
198
|
"kamstrupE8Inlet" |
|
|
135
199
|
"diffKamstrupE8Inlet" |
|
|
200
|
+
"cntKamstrupE8Inlet" |
|
|
136
201
|
"kamstrupE9Outlet" |
|
|
137
202
|
"diffKamstrupE9Outlet" |
|
|
203
|
+
"cntKamstrupE9Outlet" |
|
|
138
204
|
|
|
139
205
|
"operatingTime" |
|
|
140
206
|
"diffOperatingTime" |
|
|
207
|
+
"cntOperatingTime" |
|
|
141
208
|
|
|
142
209
|
"remainingBatteryTime" |
|
|
143
210
|
"diffRemainingBatteryTime" |
|
|
211
|
+
"cntRemainingBatteryTime" |
|
|
144
212
|
|
|
145
213
|
"deviceDate" |
|
|
146
214
|
"deviceTime" |
|
|
@@ -151,14 +219,19 @@ export type RegisterId =
|
|
|
151
219
|
|
|
152
220
|
"timeSinceLastPossibleCandidateOverhearingArrived" |
|
|
153
221
|
"timeAtLastPossibleCandidateOverhearingArrived" |
|
|
154
|
-
|
|
222
|
+
|
|
155
223
|
"timeSinceLastSampled" |
|
|
156
224
|
"timeAtLastSampled" |
|
|
157
|
-
|
|
225
|
+
|
|
158
226
|
"timeSinceLastInstallationMounted" |
|
|
159
227
|
"timeAtLastInstallationMounted" |
|
|
160
228
|
|
|
161
229
|
"basetime" |
|
|
230
|
+
"instantTime" |
|
|
231
|
+
"periodStartTime" |
|
|
232
|
+
"periodEndTime" |
|
|
233
|
+
"instantOrPeriodStartTime" |
|
|
234
|
+
"instantOrPeriodEndTime" |
|
|
162
235
|
|
|
163
236
|
"device" |
|
|
164
237
|
"wMBusDeviceAddresses" |
|
|
@@ -170,6 +243,7 @@ export type RegisterId =
|
|
|
170
243
|
"consumptionZone" |
|
|
171
244
|
|
|
172
245
|
"mBusFormatStringSignature" |
|
|
246
|
+
"deviceSoftwareVersion" |
|
|
173
247
|
|
|
174
248
|
"kamstrupMulticalInfocodeType1" |
|
|
175
249
|
"kamstrupMulticalInfocodeType2" |
|
|
@@ -177,7 +251,7 @@ export type RegisterId =
|
|
|
177
251
|
"kamstrupMulticalInfocodeType4" |
|
|
178
252
|
"kamstrupMulticalInfocode" |
|
|
179
253
|
"kamstrupModuleType" |
|
|
180
|
-
|
|
254
|
+
|
|
181
255
|
"diehlInfocodeType1" |
|
|
182
256
|
"diehlInfocode" |
|
|
183
257
|
|
|
@@ -187,5 +261,5 @@ export type RegisterId =
|
|
|
187
261
|
"landisGyrInfocodeType1" |
|
|
188
262
|
"landisGyrInfocodeType2" |
|
|
189
263
|
"landisGyrInfocode" |
|
|
190
|
-
|
|
191
|
-
"infocode";
|
|
264
|
+
|
|
265
|
+
"infocode";
|
|
@@ -1,33 +1,41 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
|
-
import { RegisterDefinition } from ".";
|
|
3
|
-
import { RegisterLibrary } from "./register-library";
|
|
4
|
-
|
|
5
|
-
const volume: RegisterDefinition = {
|
|
6
|
-
id: "volume",
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { RegisterDefinition } from ".";
|
|
3
|
+
import { RegisterLibrary } from "./register-library";
|
|
4
|
+
|
|
5
|
+
const volume: RegisterDefinition = {
|
|
6
|
+
id: "volume",
|
|
7
|
+
measure: "volume",
|
|
8
|
+
aggregate: "instant",
|
|
9
|
+
units: ["cubicMeter"]
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe("library", () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
RegisterLibrary.reset();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should get added definition", () => {
|
|
18
|
+
RegisterLibrary.add(volume);
|
|
19
|
+
const definition = RegisterLibrary.get("volume");
|
|
20
|
+
expect(definition.id).to.equal("volume");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should add all definitions in pack", () => {
|
|
24
|
+
RegisterLibrary.add({
|
|
25
|
+
someRandomKey: volume
|
|
26
|
+
});
|
|
27
|
+
const definition = RegisterLibrary.get("volume");
|
|
28
|
+
expect(definition.id).to.equal("volume");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should throw when getting not added register", () => {
|
|
32
|
+
expect(() => RegisterLibrary.get("volume")).to.throw();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should return all definitions when invoking all()", () => {
|
|
36
|
+
RegisterLibrary.add(volume);
|
|
37
|
+
RegisterLibrary.add(volume); // Only added once.
|
|
38
|
+
const all = RegisterLibrary.all();
|
|
39
|
+
expect(all.length).to.equal(1);
|
|
40
|
+
})
|
|
41
|
+
});
|
package/src/register-library.ts
CHANGED
|
@@ -1,37 +1,57 @@
|
|
|
1
|
-
import { RegisterDefinition } from "./register-definition";
|
|
2
|
-
import { RegisterId } from "./register-id";
|
|
3
|
-
import { RegisterPack } from "./register-pack";
|
|
4
|
-
|
|
5
|
-
class Library {
|
|
6
|
-
private definitions: Partial<{ [id in RegisterId]: RegisterDefinition }> = {};
|
|
7
|
-
public add(...definitions: (RegisterDefinition | RegisterPack)[]) {
|
|
8
|
-
for (const definition of definitions) {
|
|
9
|
-
if (isDefinition(definition)) {
|
|
10
|
-
this.
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
for (const definitionInPack of Object.values(definition)) {
|
|
14
|
-
this.
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public
|
|
29
|
-
this.definitions
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
import { RegisterDefinition } from "./register-definition";
|
|
2
|
+
import { RegisterId } from "./register-id";
|
|
3
|
+
import { RegisterPack } from "./register-pack";
|
|
4
|
+
|
|
5
|
+
class Library {
|
|
6
|
+
private definitions: Partial<{ [id in RegisterId]: RegisterDefinition }> = {};
|
|
7
|
+
public add(...definitions: (RegisterDefinition | RegisterPack)[]) {
|
|
8
|
+
for (const definition of definitions) {
|
|
9
|
+
if (isDefinition(definition)) {
|
|
10
|
+
this.tryAdd(definition);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
for (const definitionInPack of Object.values(definition)) {
|
|
14
|
+
this.tryAdd(definitionInPack);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private tryAdd(definition: RegisterDefinition) {
|
|
21
|
+
if (!this.definitions[definition.id]) {
|
|
22
|
+
this.definitions[definition.id] = definition;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public has(id: RegisterId) {
|
|
29
|
+
return !!this.definitions[id];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public tryGet(id: RegisterId) {
|
|
33
|
+
return this.definitions[id];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public get(id: RegisterId) {
|
|
37
|
+
const definition = this.definitions[id];
|
|
38
|
+
if (!definition) {
|
|
39
|
+
throw new Error(`Defintion was not loaded for register ${id}`);
|
|
40
|
+
}
|
|
41
|
+
return definition;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public all() {
|
|
45
|
+
return Object.values(this.definitions).map(x => x!);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public reset() {
|
|
49
|
+
this.definitions = {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isDefinition(definitionOrPack: RegisterDefinition | RegisterPack): definitionOrPack is RegisterDefinition {
|
|
54
|
+
return !!(definitionOrPack.id && definitionOrPack.aggregate && definitionOrPack.units);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const RegisterLibrary = new Library();
|
package/src/register-pack.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RegisterDefinition } from "./register-definition";
|
|
2
|
-
|
|
3
|
-
export interface RegisterPack {
|
|
4
|
-
[key: string]: RegisterDefinition;
|
|
5
|
-
}
|
|
1
|
+
import { RegisterDefinition } from "./register-definition";
|
|
2
|
+
|
|
3
|
+
export interface RegisterPack {
|
|
4
|
+
[key: string]: RegisterDefinition;
|
|
5
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { Repository } from "./repository";
|
|
3
|
+
|
|
4
|
+
describe("ctor", () => {
|
|
5
|
+
it("creates", () => {
|
|
6
|
+
expect(Repository("gpkv", "gjoel")).to.equal("gpkv/gjoel");
|
|
7
|
+
expect(Repository("gpkv/gjoel")).to.equal("gpkv/gjoel");
|
|
8
|
+
});
|
|
9
|
+
it("throws if wrong format", () => {
|
|
10
|
+
expect(() => Repository("invalid")).to.throw();
|
|
11
|
+
})
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe("split", () => {
|
|
15
|
+
it("splits into correct parts", () => {
|
|
16
|
+
const { team, name } = Repository.split(Repository("gpkv", "gjoel"));
|
|
17
|
+
expect(team).to.equal("gpkv");
|
|
18
|
+
expect(name).to.equal("gjoel");
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// This is clearly not correct but it provides some amazing type safety
|
|
2
|
+
export type Repository = "some/repo";
|
|
3
|
+
|
|
4
|
+
export function Repository(repo: string): Repository;
|
|
5
|
+
export function Repository(team: string, name: string): Repository;
|
|
6
|
+
export function Repository(repoOrTeam: string, name?: string): Repository {
|
|
7
|
+
if (name) {
|
|
8
|
+
return <Repository>`${repoOrTeam}/${name}`;
|
|
9
|
+
} else if (repoOrTeam.indexOf("/") > 0) {
|
|
10
|
+
return <Repository>repoOrTeam;
|
|
11
|
+
} else {
|
|
12
|
+
throw new TypeError("Invalid repository format");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export namespace Repository {
|
|
17
|
+
export function split(repo: Repository) {
|
|
18
|
+
const parts = repo.split("/");
|
|
19
|
+
return {
|
|
20
|
+
team: parts[0],
|
|
21
|
+
name: parts[1],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
package/src/step.spec.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
3
|
+
import { DayOfWeek, Step } from "./step";
|
|
4
|
+
|
|
5
|
+
describe("startOf", () => {
|
|
6
|
+
it("returns start of day", () => {
|
|
7
|
+
const dt = DateTime.fromISO("2020-01-11T05:00:00+01:00");
|
|
8
|
+
const result = Step.startOf(dt, "day");
|
|
9
|
+
expect(+result).to.equal(+DateTime.fromISO("2020-01-11T00:00:00+01:00"));
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("returns previous monday from saturday", () => {
|
|
13
|
+
const dt = DateTime.fromISO("2020-01-11T05:00:00+01:00");
|
|
14
|
+
const result = Step.startOf(dt, "week", DayOfWeek.Monday);
|
|
15
|
+
expect(+result).to.equal(+DateTime.fromISO("2020-01-06T00:00:00+01:00"));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("returns same monday from monday with hour", () => {
|
|
19
|
+
const dt = DateTime.fromISO("2020-01-13T05:00:00+01:00");
|
|
20
|
+
const result = Step.startOf(dt, "week", DayOfWeek.Monday);
|
|
21
|
+
expect(+result).to.equal(+DateTime.fromISO("2020-01-13T00:00:00+01:00"));
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("asDuration", () => {
|
|
26
|
+
it("should return equivalent duration", () => {
|
|
27
|
+
const duration = Step.asDuration("week");
|
|
28
|
+
expect(duration.days).to.equal(7);
|
|
29
|
+
});
|
|
30
|
+
});
|
package/src/step.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DateTime, Duration } from "luxon";
|
|
2
|
+
|
|
3
|
+
export type Step = "hour" | "day" | "week" | "month" | "year";
|
|
4
|
+
|
|
5
|
+
export enum DayOfWeek {
|
|
6
|
+
Monday = 1,
|
|
7
|
+
Tuesday = 2,
|
|
8
|
+
Wednesday = 3,
|
|
9
|
+
Thursday = 4,
|
|
10
|
+
Friday = 5,
|
|
11
|
+
Saturday = 6,
|
|
12
|
+
Sunday = 7,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export namespace Step {
|
|
16
|
+
export function startOf(dateTime: DateTime, step: Step, firstDayOfWeek?: DayOfWeek): DateTime {
|
|
17
|
+
if (step === "week") {
|
|
18
|
+
const value = dateTime.startOf("day").set({ weekday: firstDayOfWeek ?? DayOfWeek.Monday });
|
|
19
|
+
return value > dateTime
|
|
20
|
+
? value.minus({ days: 7 })
|
|
21
|
+
: value;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return dateTime.startOf(step);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function asDuration(step: Step, amount = 1): Duration {
|
|
29
|
+
switch (step) {
|
|
30
|
+
case "hour": return Duration.fromObject({ hours: amount });
|
|
31
|
+
case "day": return Duration.fromObject({ days: amount });
|
|
32
|
+
case "week": return Duration.fromObject({ days: 7 * amount });
|
|
33
|
+
case "month": return Duration.fromObject({ months: amount });
|
|
34
|
+
case "year": return Duration.fromObject({ years: amount });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
|
|
3
|
+
export type TimeOrRule = Date | DateTime | string;
|
|
4
|
+
|
|
5
|
+
export namespace TimeOrRule {
|
|
6
|
+
export function isTime(input: TimeOrRule): input is Date | DateTime {
|
|
7
|
+
return typeof input !== "string";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function isRule(input: TimeOrRule): input is string {
|
|
11
|
+
return typeof input === "string";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function asJSON(input: TimeOrRule) {
|
|
15
|
+
return isRule(input) ? input : input.toJSON();
|
|
16
|
+
}
|
|
17
|
+
}
|