@utiliread/primitives 1.0.0-74 → 1.0.0-77
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.map +1 -1
- package/dist/cjs/number-formatter.js +2 -4
- package/dist/cjs/number-formatter.js.map +1 -1
- package/dist/cjs/number-formatter.spec.js +461 -47
- package/dist/cjs/number-formatter.spec.js.map +1 -1
- package/dist/cjs/precision-number.js +8 -2
- package/dist/cjs/precision-number.js.map +1 -1
- package/dist/cjs/precision-number.spec.js +1 -1
- package/dist/cjs/precision-number.spec.js.map +1 -1
- package/dist/cjs/register-convention.js +4 -2
- package/dist/cjs/register-convention.js.map +1 -1
- package/dist/cjs/register-convention.spec.js +1 -1
- package/dist/cjs/register-convention.spec.js.map +1 -1
- package/dist/cjs/register-library.js +4 -2
- package/dist/cjs/register-library.js.map +1 -1
- package/dist/cjs/register-library.spec.js +3 -3
- package/dist/cjs/register-library.spec.js.map +1 -1
- package/dist/cjs/repository.js.map +1 -1
- package/dist/cjs/repository.spec.js +1 -1
- package/dist/cjs/repository.spec.js.map +1 -1
- package/dist/cjs/step.js +14 -10
- package/dist/cjs/step.js.map +1 -1
- package/dist/cjs/step.spec.js +2 -2
- package/dist/cjs/step.spec.js.map +1 -1
- package/dist/cjs/unit-id.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/number-formatter.js +2 -4
- package/dist/esm/number-formatter.js.map +1 -1
- package/dist/esm/number-formatter.spec.js +462 -48
- package/dist/esm/number-formatter.spec.js.map +1 -1
- package/dist/esm/precision-number.js +8 -2
- package/dist/esm/precision-number.js.map +1 -1
- package/dist/esm/precision-number.spec.js +1 -1
- package/dist/esm/precision-number.spec.js.map +1 -1
- package/dist/esm/register-convention.d.ts +1 -1
- package/dist/esm/register-convention.js +4 -2
- package/dist/esm/register-convention.js.map +1 -1
- package/dist/esm/register-convention.spec.js +1 -1
- package/dist/esm/register-convention.spec.js.map +1 -1
- package/dist/esm/register-definition.d.ts +1 -1
- package/dist/esm/register-library.js +4 -2
- package/dist/esm/register-library.js.map +1 -1
- package/dist/esm/register-library.spec.js +3 -3
- package/dist/esm/register-library.spec.js.map +1 -1
- package/dist/esm/repository.js.map +1 -1
- package/dist/esm/repository.spec.js +1 -1
- package/dist/esm/repository.spec.js.map +1 -1
- package/dist/esm/step.js +14 -10
- package/dist/esm/step.js.map +1 -1
- package/dist/esm/step.spec.js +2 -2
- package/dist/esm/step.spec.js.map +1 -1
- package/dist/esm/unit-id.js.map +1 -1
- package/locales/da/aggregates.json +7 -7
- package/locales/da/consumption-types.json +6 -6
- package/locales/da/measures.json +15 -15
- package/locales/da/registers.json +362 -221
- package/locales/da/units.json +92 -92
- package/locales/en/aggregates.json +7 -7
- package/locales/en/consumption-types.json +6 -6
- package/locales/en/measures.json +15 -15
- package/locales/en/registers.json +371 -221
- package/locales/en/units.json +92 -92
- package/package.json +7 -11
- package/src/aggregate-id.ts +8 -8
- package/src/consumption-type-id.ts +7 -7
- package/src/index.ts +39 -35
- package/src/measure-id.ts +14 -14
- package/src/number-formatter.spec.ts +509 -65
- package/src/number-formatter.ts +43 -20
- package/src/optional.ts +1 -1
- package/src/precision-number.spec.ts +28 -28
- package/src/precision-number.ts +44 -36
- package/src/register-convention.spec.ts +14 -5
- package/src/register-convention.ts +14 -5
- package/src/register-definition.ts +23 -23
- package/src/register-id.ts +266 -327
- package/src/register-library.spec.ts +5 -5
- package/src/register-library.ts +13 -7
- package/src/register-pack.ts +1 -1
- package/src/register-utils.ts +1 -1
- package/src/repository.spec.ts +20 -20
- package/src/repository.ts +24 -24
- package/src/step.spec.ts +13 -6
- package/src/step.ts +45 -37
- package/src/time-or-rule.ts +17 -17
- package/src/unit-id.ts +98 -119
- package/tsconfig.json +1 -0
- package/web-test-runner.config.mjs +7 -0
- package/karma.config.js +0 -32
package/src/number-formatter.ts
CHANGED
|
@@ -38,50 +38,73 @@ class Formatter {
|
|
|
38
38
|
: value.toPrecision(precision);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
public toLocalePrecision(
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
public toLocalePrecision(
|
|
42
|
+
value: number,
|
|
43
|
+
precision: number,
|
|
44
|
+
maxDecimals?: number,
|
|
45
|
+
) {
|
|
46
|
+
return this.toPrecision(value, precision, maxDecimals).replace(
|
|
47
|
+
invariantDecimalSeparator,
|
|
48
|
+
localeDecimalSeparator,
|
|
49
|
+
);
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
public toFixed(value: number, precision: number, maxDecimals?: number) {
|
|
47
53
|
const parts = this.getParts(value, precision, maxDecimals);
|
|
48
54
|
if (parts.noOfCoefficientDecimals < parts.exponent) {
|
|
49
|
-
const number = parts.invariantCoefficientString.replace(
|
|
55
|
+
const number = parts.invariantCoefficientString.replace(
|
|
56
|
+
invariantDecimalSeparator,
|
|
57
|
+
"",
|
|
58
|
+
);
|
|
50
59
|
const zeros = parts.exponent - parts.noOfCoefficientDecimals;
|
|
51
60
|
return `${number}${"0".repeat(zeros)}`;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
61
|
+
} else {
|
|
54
62
|
return parts.invariantPrecisionString;
|
|
55
63
|
}
|
|
56
64
|
}
|
|
57
65
|
|
|
58
|
-
public toLocaleFixed(
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
public toLocaleFixed(
|
|
67
|
+
value: number,
|
|
68
|
+
precision: number,
|
|
69
|
+
maxDecimals?: number,
|
|
70
|
+
) {
|
|
71
|
+
return this.toFixed(value, precision, maxDecimals).replace(
|
|
72
|
+
invariantDecimalSeparator,
|
|
73
|
+
localeDecimalSeparator,
|
|
74
|
+
);
|
|
61
75
|
}
|
|
62
76
|
|
|
63
|
-
public getParts(
|
|
77
|
+
public getParts(
|
|
78
|
+
value: number,
|
|
79
|
+
precision: number,
|
|
80
|
+
maxDecimals?: number,
|
|
81
|
+
): Parts {
|
|
64
82
|
const precisionString = this.toPrecision(value, precision, maxDecimals);
|
|
65
83
|
if (precisionString.indexOf("e") >= 0) {
|
|
66
84
|
const match = /(.*)e([\+-]\d+)$/.exec(precisionString)!;
|
|
67
85
|
const coefficientString = match[1];
|
|
68
86
|
const exponent = parseInt(match[2]);
|
|
69
|
-
const decimalSeparatorIndex = coefficientString.indexOf(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
87
|
+
const decimalSeparatorIndex = coefficientString.indexOf(
|
|
88
|
+
invariantDecimalSeparator,
|
|
89
|
+
);
|
|
90
|
+
const noOfCoefficientDecimals =
|
|
91
|
+
decimalSeparatorIndex >= 0
|
|
92
|
+
? coefficientString.length - decimalSeparatorIndex - 1
|
|
93
|
+
: 0;
|
|
73
94
|
return {
|
|
74
95
|
invariantPrecisionString: precisionString,
|
|
75
96
|
invariantCoefficientString: coefficientString,
|
|
76
97
|
exponent,
|
|
77
98
|
noOfCoefficientDecimals,
|
|
78
99
|
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
} else {
|
|
101
|
+
const decimalSeparatorIndex = precisionString.indexOf(
|
|
102
|
+
invariantDecimalSeparator,
|
|
103
|
+
);
|
|
104
|
+
const noOfCoefficientDecimals =
|
|
105
|
+
decimalSeparatorIndex >= 0
|
|
106
|
+
? precisionString.length - decimalSeparatorIndex - 1
|
|
107
|
+
: 0;
|
|
85
108
|
return {
|
|
86
109
|
invariantPrecisionString: precisionString,
|
|
87
110
|
invariantCoefficientString: precisionString,
|
package/src/optional.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
|
|
1
|
+
export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
describe("precision-number", () => {
|
|
5
|
-
it("should not parse ''", () => {
|
|
6
|
-
const number = PrecisionNumber.parse("");
|
|
7
|
-
expect(Number.isNaN(number.value)).to.equal(true);
|
|
8
|
-
expect(number.precision).to.equal(0);
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it("should parse '1'", () => {
|
|
12
|
-
const number = PrecisionNumber.parse("1");
|
|
13
|
-
expect(number.value).to.equal(1);
|
|
14
|
-
expect(number.precision).to.equal(1);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("should parse '1.'", () => {
|
|
18
|
-
const number = PrecisionNumber.parse("1.");
|
|
19
|
-
expect(number.value).to.equal(1);
|
|
20
|
-
expect(number.precision).to.equal(2);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("should parse '1.0'", () => {
|
|
24
|
-
const number = PrecisionNumber.parse("1.0");
|
|
25
|
-
expect(number.value).to.equal(1);
|
|
26
|
-
expect(number.precision).to.equal(2);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
1
|
+
import { PrecisionNumber } from "./precision-number";
|
|
2
|
+
import { expect } from "@esm-bundle/chai";
|
|
3
|
+
|
|
4
|
+
describe("precision-number", () => {
|
|
5
|
+
it("should not parse ''", () => {
|
|
6
|
+
const number = PrecisionNumber.parse("");
|
|
7
|
+
expect(Number.isNaN(number.value)).to.equal(true);
|
|
8
|
+
expect(number.precision).to.equal(0);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("should parse '1'", () => {
|
|
12
|
+
const number = PrecisionNumber.parse("1");
|
|
13
|
+
expect(number.value).to.equal(1);
|
|
14
|
+
expect(number.precision).to.equal(1);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should parse '1.'", () => {
|
|
18
|
+
const number = PrecisionNumber.parse("1.");
|
|
19
|
+
expect(number.value).to.equal(1);
|
|
20
|
+
expect(number.precision).to.equal(2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should parse '1.0'", () => {
|
|
24
|
+
const number = PrecisionNumber.parse("1.0");
|
|
25
|
+
expect(number.value).to.equal(1);
|
|
26
|
+
expect(number.precision).to.equal(2);
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/precision-number.ts
CHANGED
|
@@ -1,36 +1,44 @@
|
|
|
1
|
-
import { invariantDecimalSeparator } from ".";
|
|
2
|
-
import { localeDecimalSeparator, NumberFormatter } from "./number-formatter";
|
|
3
|
-
|
|
4
|
-
export class PrecisionNumber {
|
|
5
|
-
constructor(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return NumberFormatter.
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return NumberFormatter.
|
|
35
|
-
}
|
|
36
|
-
|
|
1
|
+
import { invariantDecimalSeparator } from ".";
|
|
2
|
+
import { localeDecimalSeparator, NumberFormatter } from "./number-formatter";
|
|
3
|
+
|
|
4
|
+
export class PrecisionNumber {
|
|
5
|
+
constructor(
|
|
6
|
+
public value: number,
|
|
7
|
+
public precision: number,
|
|
8
|
+
) {}
|
|
9
|
+
|
|
10
|
+
static parse(input: string) {
|
|
11
|
+
let normalized = input
|
|
12
|
+
.trim()
|
|
13
|
+
.replace(",", ".")
|
|
14
|
+
.replace(localeDecimalSeparator, invariantDecimalSeparator);
|
|
15
|
+
if (normalized.endsWith(invariantDecimalSeparator)) {
|
|
16
|
+
normalized += "0";
|
|
17
|
+
}
|
|
18
|
+
const precision = normalized
|
|
19
|
+
.replace(".", "")
|
|
20
|
+
.replace("+", "")
|
|
21
|
+
.replace("-", "").length;
|
|
22
|
+
return new PrecisionNumber(parseFloat(normalized), precision);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
toString() {
|
|
26
|
+
return this.value.toString();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
toFixed() {
|
|
30
|
+
return NumberFormatter.toFixed(this.value, this.precision);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
toPrecision() {
|
|
34
|
+
return NumberFormatter.toPrecision(this.value, this.precision);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
toLocaleFixed() {
|
|
38
|
+
return NumberFormatter.toLocaleFixed(this.value, this.precision);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
toLocalePrecision() {
|
|
42
|
+
return NumberFormatter.toLocalePrecision(this.value, this.precision);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
1
|
import { RegisterConvention } from "./register-convention";
|
|
2
|
+
import { expect } from "@esm-bundle/chai";
|
|
3
3
|
|
|
4
4
|
describe("getAggregate", () => {
|
|
5
5
|
it("instant register is instant", () => {
|
|
@@ -27,17 +27,26 @@ describe("toInstant", () => {
|
|
|
27
27
|
|
|
28
28
|
describe("toAggregate", () => {
|
|
29
29
|
it("should convert instant to aggregate", () => {
|
|
30
|
-
const registerId = RegisterConvention.toAggregate(
|
|
30
|
+
const registerId = RegisterConvention.toAggregate(
|
|
31
|
+
"flowTemperature",
|
|
32
|
+
"avg",
|
|
33
|
+
);
|
|
31
34
|
expect(registerId).to.equal("avgFlowTemperature");
|
|
32
35
|
});
|
|
33
36
|
|
|
34
37
|
it("should convert aggregate to same aggregate", () => {
|
|
35
|
-
const registerId = RegisterConvention.toAggregate(
|
|
38
|
+
const registerId = RegisterConvention.toAggregate(
|
|
39
|
+
"avgFlowTemperature",
|
|
40
|
+
"avg",
|
|
41
|
+
);
|
|
36
42
|
expect(registerId).to.equal("avgFlowTemperature");
|
|
37
43
|
});
|
|
38
44
|
|
|
39
45
|
it("should convert aggregate to other aggregate", () => {
|
|
40
|
-
const registerId = RegisterConvention.toAggregate(
|
|
46
|
+
const registerId = RegisterConvention.toAggregate(
|
|
47
|
+
"avgFlowTemperature",
|
|
48
|
+
"min",
|
|
49
|
+
);
|
|
41
50
|
expect(registerId).to.equal("minFlowTemperature");
|
|
42
51
|
});
|
|
43
|
-
});
|
|
52
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RegisterDefinition } from "
|
|
1
|
+
import { RegisterDefinition } from "./register-definition";
|
|
2
2
|
import { AggregateId } from "./aggregate-id";
|
|
3
3
|
import { RegisterId } from "./register-id";
|
|
4
4
|
import { getRegisterId } from "./register-utils";
|
|
@@ -40,22 +40,31 @@ class Convention {
|
|
|
40
40
|
return registerId;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
toAggregate(
|
|
43
|
+
toAggregate(
|
|
44
|
+
register: RegisterId | RegisterDefinition,
|
|
45
|
+
aggregate: AggregateId,
|
|
46
|
+
) {
|
|
44
47
|
const instantRegisterId = this.toInstant(register);
|
|
45
48
|
if (aggregate === "instant") {
|
|
46
49
|
return instantRegisterId;
|
|
47
50
|
}
|
|
48
51
|
const prefix = aggregatePrefixes[aggregate];
|
|
49
|
-
return <RegisterId>(
|
|
52
|
+
return <RegisterId>(
|
|
53
|
+
(prefix +
|
|
54
|
+
instantRegisterId[0].toUpperCase() +
|
|
55
|
+
instantRegisterId.substr(1))
|
|
56
|
+
);
|
|
50
57
|
}
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
export function isPrefix(registerId: RegisterId, prefix: string) {
|
|
54
|
-
return
|
|
61
|
+
return (
|
|
62
|
+
registerId.startsWith(prefix) && isUppercase(registerId[prefix.length])
|
|
63
|
+
);
|
|
55
64
|
}
|
|
56
65
|
|
|
57
66
|
function isUppercase(input: string) {
|
|
58
67
|
return input.toUpperCase() === input;
|
|
59
68
|
}
|
|
60
69
|
|
|
61
|
-
export const RegisterConvention = new Convention();
|
|
70
|
+
export const RegisterConvention = new Convention();
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
-
}
|
|
1
|
+
import { AggregateId } from "./aggregate-id";
|
|
2
|
+
import { MeasureId } from "./measure-id";
|
|
3
|
+
import { RegisterId } from "./register-id";
|
|
4
|
+
import { UnitId } from "./unit-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
|
+
}
|