@onereach/billing-shared 31.1.1-beta.12522.0 → 31.1.1-beta.12589.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 (57) hide show
  1. package/dist/cjs/enums/index.js +1 -0
  2. package/dist/cjs/enums/index.js.map +1 -1
  3. package/dist/cjs/enums/usage-compaction.js +35 -0
  4. package/dist/cjs/enums/usage-compaction.js.map +1 -0
  5. package/dist/cjs/types/index.js +1 -0
  6. package/dist/cjs/types/index.js.map +1 -1
  7. package/dist/cjs/types/usage-compaction.js +3 -0
  8. package/dist/cjs/types/usage-compaction.js.map +1 -0
  9. package/dist/cjs/utils/exact-numeric.constants.js +9 -0
  10. package/dist/cjs/utils/exact-numeric.constants.js.map +1 -0
  11. package/dist/cjs/utils/exact-numeric.js +164 -0
  12. package/dist/cjs/utils/exact-numeric.js.map +1 -0
  13. package/dist/cjs/utils/exact-numeric.types.js +3 -0
  14. package/dist/cjs/utils/exact-numeric.types.js.map +1 -0
  15. package/dist/cjs/utils/index.js +1 -0
  16. package/dist/cjs/utils/index.js.map +1 -1
  17. package/dist/esm/enums/index.js +1 -0
  18. package/dist/esm/enums/index.js.map +1 -1
  19. package/dist/esm/enums/usage-compaction.js +32 -0
  20. package/dist/esm/enums/usage-compaction.js.map +1 -0
  21. package/dist/esm/types/index.js +1 -0
  22. package/dist/esm/types/index.js.map +1 -1
  23. package/dist/esm/types/usage-compaction.js +2 -0
  24. package/dist/esm/types/usage-compaction.js.map +1 -0
  25. package/dist/esm/utils/exact-numeric.constants.js +6 -0
  26. package/dist/esm/utils/exact-numeric.constants.js.map +1 -0
  27. package/dist/esm/utils/exact-numeric.js +158 -0
  28. package/dist/esm/utils/exact-numeric.js.map +1 -0
  29. package/dist/esm/utils/exact-numeric.types.js +2 -0
  30. package/dist/esm/utils/exact-numeric.types.js.map +1 -0
  31. package/dist/esm/utils/index.js +1 -0
  32. package/dist/esm/utils/index.js.map +1 -1
  33. package/dist/types/enums/index.d.ts +1 -0
  34. package/dist/types/enums/index.d.ts.map +1 -1
  35. package/dist/types/enums/usage-compaction.d.ts +28 -0
  36. package/dist/types/enums/usage-compaction.d.ts.map +1 -0
  37. package/dist/types/types/index.d.ts +1 -0
  38. package/dist/types/types/index.d.ts.map +1 -1
  39. package/dist/types/types/usage-compaction.d.ts +11 -0
  40. package/dist/types/types/usage-compaction.d.ts.map +1 -0
  41. package/dist/types/utils/exact-numeric.constants.d.ts +4 -0
  42. package/dist/types/utils/exact-numeric.constants.d.ts.map +1 -0
  43. package/dist/types/utils/exact-numeric.d.ts +6 -0
  44. package/dist/types/utils/exact-numeric.d.ts.map +1 -0
  45. package/dist/types/utils/exact-numeric.types.d.ts +6 -0
  46. package/dist/types/utils/exact-numeric.types.d.ts.map +1 -0
  47. package/dist/types/utils/index.d.ts +1 -0
  48. package/dist/types/utils/index.d.ts.map +1 -1
  49. package/package.json +1 -1
  50. package/src/enums/index.ts +1 -0
  51. package/src/enums/usage-compaction.ts +30 -0
  52. package/src/types/index.ts +1 -0
  53. package/src/types/usage-compaction.ts +12 -0
  54. package/src/utils/exact-numeric.constants.ts +5 -0
  55. package/src/utils/exact-numeric.ts +199 -0
  56. package/src/utils/exact-numeric.types.ts +5 -0
  57. package/src/utils/index.ts +1 -0
@@ -31,4 +31,5 @@ __exportStar(require("./sku-status"), exports);
31
31
  __exportStar(require("./customer-account-action"), exports);
32
32
  __exportStar(require("./environment-status"), exports);
33
33
  __exportStar(require("./billing-domain"), exports);
34
+ __exportStar(require("./usage-compaction"), exports);
34
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,2CAAyB;AACzB,kDAAgC;AAChC,6CAA2B;AAC3B,0CAAwB;AACxB,uDAAqC;AACrC,yDAAuC;AACvC,kDAAgC;AAChC,sDAAoC;AACpC,4CAA0B;AAC1B,qDAAmC;AACnC,6CAA2B;AAC3B,gDAA8B;AAC9B,+CAA6B;AAC7B,4DAA0C;AAC1C,uDAAqC;AACrC,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,2CAAyB;AACzB,kDAAgC;AAChC,6CAA2B;AAC3B,0CAAwB;AACxB,uDAAqC;AACrC,yDAAuC;AACvC,kDAAgC;AAChC,sDAAoC;AACpC,4CAA0B;AAC1B,qDAAmC;AACnC,6CAA2B;AAC3B,gDAA8B;AAC9B,+CAA6B;AAC7B,4DAA0C;AAC1C,uDAAqC;AACrC,mDAAiC;AACjC,qDAAmC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UsageCompactionItemStatus = exports.UsageCompactionRunStatus = exports.UsageCompactionRunMode = exports.UsageGranularity = void 0;
4
+ var UsageGranularity;
5
+ (function (UsageGranularity) {
6
+ UsageGranularity["HOUR"] = "hour";
7
+ UsageGranularity["DAY"] = "day";
8
+ })(UsageGranularity || (exports.UsageGranularity = UsageGranularity = {}));
9
+ var UsageCompactionRunMode;
10
+ (function (UsageCompactionRunMode) {
11
+ UsageCompactionRunMode["DRY_RUN"] = "dry-run";
12
+ UsageCompactionRunMode["BACKFILL"] = "backfill";
13
+ UsageCompactionRunMode["SCHEDULED"] = "scheduled";
14
+ UsageCompactionRunMode["RECOMPILE"] = "recompile";
15
+ UsageCompactionRunMode["REPAIR"] = "repair";
16
+ })(UsageCompactionRunMode || (exports.UsageCompactionRunMode = UsageCompactionRunMode = {}));
17
+ var UsageCompactionRunStatus;
18
+ (function (UsageCompactionRunStatus) {
19
+ UsageCompactionRunStatus["QUEUED"] = "queued";
20
+ UsageCompactionRunStatus["PROCESSING"] = "processing";
21
+ UsageCompactionRunStatus["COMPLETED"] = "completed";
22
+ UsageCompactionRunStatus["PARTIAL"] = "partial";
23
+ UsageCompactionRunStatus["FAILED"] = "failed";
24
+ UsageCompactionRunStatus["CANCELLED"] = "cancelled";
25
+ })(UsageCompactionRunStatus || (exports.UsageCompactionRunStatus = UsageCompactionRunStatus = {}));
26
+ var UsageCompactionItemStatus;
27
+ (function (UsageCompactionItemStatus) {
28
+ UsageCompactionItemStatus["QUEUED"] = "queued";
29
+ UsageCompactionItemStatus["PROCESSING"] = "processing";
30
+ UsageCompactionItemStatus["VALIDATED"] = "validated";
31
+ UsageCompactionItemStatus["COMPLETED"] = "completed";
32
+ UsageCompactionItemStatus["FAILED"] = "failed";
33
+ UsageCompactionItemStatus["SKIPPED"] = "skipped";
34
+ })(UsageCompactionItemStatus || (exports.UsageCompactionItemStatus = UsageCompactionItemStatus = {}));
35
+ //# sourceMappingURL=usage-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.js","sourceRoot":"","sources":["../../../src/enums/usage-compaction.ts"],"names":[],"mappings":";;;AAAA,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,iCAAa,CAAA;IACb,+BAAW,CAAA;AACb,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,6CAAmB,CAAA;IACnB,+CAAqB,CAAA;IACrB,iDAAuB,CAAA;IACvB,iDAAuB,CAAA;IACvB,2CAAiB,CAAA;AACnB,CAAC,EANW,sBAAsB,sCAAtB,sBAAsB,QAMjC;AAED,IAAY,wBAOX;AAPD,WAAY,wBAAwB;IAClC,6CAAiB,CAAA;IACjB,qDAAyB,CAAA;IACzB,mDAAuB,CAAA;IACvB,+CAAmB,CAAA;IACnB,6CAAiB,CAAA;IACjB,mDAAuB,CAAA;AACzB,CAAC,EAPW,wBAAwB,wCAAxB,wBAAwB,QAOnC;AAED,IAAY,yBAOX;AAPD,WAAY,yBAAyB;IACnC,8CAAiB,CAAA;IACjB,sDAAyB,CAAA;IACzB,oDAAuB,CAAA;IACvB,oDAAuB,CAAA;IACvB,8CAAiB,CAAA;IACjB,gDAAmB,CAAA;AACrB,CAAC,EAPW,yBAAyB,yCAAzB,yBAAyB,QAOpC"}
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./common"), exports);
18
18
  __exportStar(require("./billing-domain"), exports);
19
19
  __exportStar(require("./customer-account-actions"), exports);
20
+ __exportStar(require("./usage-compaction"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,mDAAiC;AACjC,6DAA2C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,mDAAiC;AACjC,6DAA2C;AAC3C,qDAAmC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=usage-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.js","sourceRoot":"","sources":["../../../src/types/usage-compaction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXACT_NUMERIC_MAX_INPUT_LENGTH = exports.EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS = exports.EXACT_NUMERIC_MAX_INTEGER_DIGITS = void 0;
4
+ exports.EXACT_NUMERIC_MAX_INTEGER_DIGITS = 131072;
5
+ exports.EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS = 16383;
6
+ exports.EXACT_NUMERIC_MAX_INPUT_LENGTH = exports.EXACT_NUMERIC_MAX_INTEGER_DIGITS
7
+ + exports.EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS
8
+ + 32;
9
+ //# sourceMappingURL=exact-numeric.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.constants.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gCAAgC,GAAG,MAAO,CAAC;AAC3C,QAAA,mCAAmC,GAAG,KAAM,CAAC;AAC7C,QAAA,8BAA8B,GAAG,wCAAgC;MAC1E,2CAAmC;MACnC,EAAE,CAAC"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toExactNumeric = toExactNumeric;
4
+ exports.addExactNumeric = addExactNumeric;
5
+ exports.sumExactNumeric = sumExactNumeric;
6
+ exports.compareExactNumeric = compareExactNumeric;
7
+ var exact_numeric_constants_1 = require("./exact-numeric.constants");
8
+ function toExactNumeric(value) {
9
+ var _a, _b, _c;
10
+ if (typeof value === 'number' && !Number.isFinite(value)) {
11
+ throw new Error('Exact numeric value must be finite');
12
+ }
13
+ var input = String(value).trim();
14
+ if (!input || input.length > exact_numeric_constants_1.EXACT_NUMERIC_MAX_INPUT_LENGTH) {
15
+ throw new Error('Exact numeric value is invalid');
16
+ }
17
+ var match = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/.exec(input);
18
+ if (!match || (!match[2] && !match[3])) {
19
+ throw new Error('Exact numeric value is invalid');
20
+ }
21
+ var sign = match[1] === '-' ? '-' : '';
22
+ var integerPart = (_a = match[2]) !== null && _a !== void 0 ? _a : '';
23
+ var fractionalPart = (_b = match[3]) !== null && _b !== void 0 ? _b : '';
24
+ var digits = "".concat(integerPart).concat(fractionalPart);
25
+ if (/^0+$/.test(digits)) {
26
+ return '0';
27
+ }
28
+ var exponentText = (_c = match[4]) !== null && _c !== void 0 ? _c : '0';
29
+ var normalizedExponentText = exponentText.replace(/^([+-]?)0+(?=\d)/, '$1');
30
+ if (normalizedExponentText.replace(/^[+-]/, '').length > 6) {
31
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
32
+ }
33
+ var exponent = Number(normalizedExponentText);
34
+ var maximumShift = exact_numeric_constants_1.EXACT_NUMERIC_MAX_INTEGER_DIGITS
35
+ + exact_numeric_constants_1.EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS;
36
+ if (exponent > maximumShift || exponent < -maximumShift) {
37
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
38
+ }
39
+ var decimalIndex = integerPart.length + exponent;
40
+ var expanded;
41
+ if (decimalIndex <= 0) {
42
+ expanded = "0.".concat('0'.repeat(-decimalIndex)).concat(digits);
43
+ }
44
+ else if (decimalIndex >= digits.length) {
45
+ expanded = "".concat(digits).concat('0'.repeat(decimalIndex - digits.length));
46
+ }
47
+ else {
48
+ expanded = "".concat(digits.slice(0, decimalIndex), ".").concat(digits.slice(decimalIndex));
49
+ }
50
+ var _d = expanded.split('.'), expandedIntegerPart = _d[0], _e = _d[1], expandedFractionalPart = _e === void 0 ? '' : _e;
51
+ var normalizedIntegerPart = expandedIntegerPart.replace(/^0+(?=\d)/, '');
52
+ var normalizedFractionalPart = expandedFractionalPart.replace(/0+$/, '');
53
+ if (normalizedIntegerPart.length > exact_numeric_constants_1.EXACT_NUMERIC_MAX_INTEGER_DIGITS
54
+ || normalizedFractionalPart.length > exact_numeric_constants_1.EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS) {
55
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
56
+ }
57
+ var normalized = normalizedFractionalPart
58
+ ? "".concat(normalizedIntegerPart, ".").concat(normalizedFractionalPart)
59
+ : normalizedIntegerPart;
60
+ return "".concat(sign).concat(normalized);
61
+ }
62
+ function addExactNumeric(left, right) {
63
+ var leftValue = parseExactNumeric(left);
64
+ var rightValue = parseExactNumeric(right);
65
+ var scale = Math.max(leftValue.scale, rightValue.scale);
66
+ var leftDigits = alignScale(leftValue, scale);
67
+ var rightDigits = alignScale(rightValue, scale);
68
+ if (leftValue.sign === 0)
69
+ return formatExactNumeric(rightDigits, scale, rightValue.sign);
70
+ if (rightValue.sign === 0)
71
+ return formatExactNumeric(leftDigits, scale, leftValue.sign);
72
+ if (leftValue.sign === rightValue.sign) {
73
+ return formatExactNumeric(addUnsigned(leftDigits, rightDigits), scale, leftValue.sign);
74
+ }
75
+ var comparison = compareUnsigned(leftDigits, rightDigits);
76
+ if (comparison === 0)
77
+ return '0';
78
+ return comparison > 0
79
+ ? formatExactNumeric(subtractUnsigned(leftDigits, rightDigits), scale, leftValue.sign)
80
+ : formatExactNumeric(subtractUnsigned(rightDigits, leftDigits), scale, rightValue.sign);
81
+ }
82
+ function sumExactNumeric(values) {
83
+ return values.reduce(addExactNumeric, '0');
84
+ }
85
+ function compareExactNumeric(left, right) {
86
+ var leftValue = parseExactNumeric(left);
87
+ var rightValue = parseExactNumeric(right);
88
+ if (leftValue.sign !== rightValue.sign) {
89
+ return leftValue.sign < rightValue.sign ? -1 : 1;
90
+ }
91
+ if (leftValue.sign === 0)
92
+ return 0;
93
+ var scale = Math.max(leftValue.scale, rightValue.scale);
94
+ var comparison = compareUnsigned(alignScale(leftValue, scale), alignScale(rightValue, scale));
95
+ return leftValue.sign === 1 ? comparison : -comparison;
96
+ }
97
+ function parseExactNumeric(value) {
98
+ var canonical = toExactNumeric(value);
99
+ var isNegative = canonical.startsWith('-');
100
+ var unsigned = isNegative ? canonical.slice(1) : canonical;
101
+ var _a = unsigned.split('.'), integerPart = _a[0], _b = _a[1], fractionalPart = _b === void 0 ? '' : _b;
102
+ var digits = "".concat(integerPart).concat(fractionalPart).replace(/^0+/, '') || '0';
103
+ return {
104
+ digits: digits,
105
+ scale: fractionalPart.length,
106
+ sign: digits === '0' ? 0 : isNegative ? -1 : 1,
107
+ };
108
+ }
109
+ function alignScale(value, scale) {
110
+ return "".concat(value.digits).concat('0'.repeat(scale - value.scale));
111
+ }
112
+ function formatExactNumeric(digits, scale, sign) {
113
+ var normalizedDigits = digits.replace(/^0+/, '') || '0';
114
+ if (normalizedDigits === '0' || sign === 0)
115
+ return '0';
116
+ var signPrefix = sign === -1 ? '-' : '';
117
+ if (scale === 0)
118
+ return "".concat(signPrefix).concat(normalizedDigits);
119
+ var paddedDigits = normalizedDigits.padStart(scale + 1, '0');
120
+ var decimalIndex = paddedDigits.length - scale;
121
+ return toExactNumeric("".concat(signPrefix).concat(paddedDigits.slice(0, decimalIndex), ".").concat(paddedDigits.slice(decimalIndex)));
122
+ }
123
+ function compareUnsigned(left, right) {
124
+ var normalizedLeft = left.replace(/^0+/, '') || '0';
125
+ var normalizedRight = right.replace(/^0+/, '') || '0';
126
+ if (normalizedLeft.length !== normalizedRight.length) {
127
+ return normalizedLeft.length < normalizedRight.length ? -1 : 1;
128
+ }
129
+ if (normalizedLeft === normalizedRight)
130
+ return 0;
131
+ return normalizedLeft < normalizedRight ? -1 : 1;
132
+ }
133
+ function addUnsigned(left, right) {
134
+ var length = Math.max(left.length, right.length);
135
+ var leftDigits = left.padStart(length, '0');
136
+ var rightDigits = right.padStart(length, '0');
137
+ var result = new Array(length + 1).fill('0');
138
+ var carry = 0;
139
+ for (var index = length - 1; index >= 0; index -= 1) {
140
+ var sum = Number(leftDigits[index]) + Number(rightDigits[index]) + carry;
141
+ result[index + 1] = String(sum % 10);
142
+ carry = Math.floor(sum / 10);
143
+ }
144
+ result[0] = String(carry);
145
+ return result.join('').replace(/^0+/, '') || '0';
146
+ }
147
+ function subtractUnsigned(left, right) {
148
+ var rightDigits = right.padStart(left.length, '0');
149
+ var result = new Array(left.length).fill('0');
150
+ var borrow = 0;
151
+ for (var index = left.length - 1; index >= 0; index -= 1) {
152
+ var difference = Number(left[index]) - Number(rightDigits[index]) - borrow;
153
+ if (difference < 0) {
154
+ difference += 10;
155
+ borrow = 1;
156
+ }
157
+ else {
158
+ borrow = 0;
159
+ }
160
+ result[index] = String(difference);
161
+ }
162
+ return result.join('').replace(/^0+/, '') || '0';
163
+ }
164
+ //# sourceMappingURL=exact-numeric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=exact-numeric.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.types.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.types.ts"],"names":[],"mappings":""}
@@ -21,4 +21,5 @@ __exportStar(require("./format-date"), exports);
21
21
  __exportStar(require("./escape-csv-value"), exports);
22
22
  __exportStar(require("./build-csv-file-name"), exports);
23
23
  __exportStar(require("./build-csv-file-string"), exports);
24
+ __exportStar(require("./exact-numeric"), exports);
24
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,qDAAmC;AACnC,yCAAuB;AACvB,gDAA8B;AAC9B,qDAAmC;AACnC,wDAAsC;AACtC,0DAAwC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,qDAAmC;AACnC,yCAAuB;AACvB,gDAA8B;AAC9B,qDAAmC;AACnC,wDAAsC;AACtC,0DAAwC;AACxC,kDAAgC"}
@@ -15,4 +15,5 @@ export * from './sku-status';
15
15
  export * from './customer-account-action';
16
16
  export * from './environment-status';
17
17
  export * from './billing-domain';
18
+ export * from './usage-compaction';
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,32 @@
1
+ export var UsageGranularity;
2
+ (function (UsageGranularity) {
3
+ UsageGranularity["HOUR"] = "hour";
4
+ UsageGranularity["DAY"] = "day";
5
+ })(UsageGranularity || (UsageGranularity = {}));
6
+ export var UsageCompactionRunMode;
7
+ (function (UsageCompactionRunMode) {
8
+ UsageCompactionRunMode["DRY_RUN"] = "dry-run";
9
+ UsageCompactionRunMode["BACKFILL"] = "backfill";
10
+ UsageCompactionRunMode["SCHEDULED"] = "scheduled";
11
+ UsageCompactionRunMode["RECOMPILE"] = "recompile";
12
+ UsageCompactionRunMode["REPAIR"] = "repair";
13
+ })(UsageCompactionRunMode || (UsageCompactionRunMode = {}));
14
+ export var UsageCompactionRunStatus;
15
+ (function (UsageCompactionRunStatus) {
16
+ UsageCompactionRunStatus["QUEUED"] = "queued";
17
+ UsageCompactionRunStatus["PROCESSING"] = "processing";
18
+ UsageCompactionRunStatus["COMPLETED"] = "completed";
19
+ UsageCompactionRunStatus["PARTIAL"] = "partial";
20
+ UsageCompactionRunStatus["FAILED"] = "failed";
21
+ UsageCompactionRunStatus["CANCELLED"] = "cancelled";
22
+ })(UsageCompactionRunStatus || (UsageCompactionRunStatus = {}));
23
+ export var UsageCompactionItemStatus;
24
+ (function (UsageCompactionItemStatus) {
25
+ UsageCompactionItemStatus["QUEUED"] = "queued";
26
+ UsageCompactionItemStatus["PROCESSING"] = "processing";
27
+ UsageCompactionItemStatus["VALIDATED"] = "validated";
28
+ UsageCompactionItemStatus["COMPLETED"] = "completed";
29
+ UsageCompactionItemStatus["FAILED"] = "failed";
30
+ UsageCompactionItemStatus["SKIPPED"] = "skipped";
31
+ })(UsageCompactionItemStatus || (UsageCompactionItemStatus = {}));
32
+ //# sourceMappingURL=usage-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.js","sourceRoot":"","sources":["../../../src/enums/usage-compaction.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,iCAAa,CAAA;IACb,+BAAW,CAAA;AACb,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,CAAN,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,6CAAmB,CAAA;IACnB,+CAAqB,CAAA;IACrB,iDAAuB,CAAA;IACvB,iDAAuB,CAAA;IACvB,2CAAiB,CAAA;AACnB,CAAC,EANW,sBAAsB,KAAtB,sBAAsB,QAMjC;AAED,MAAM,CAAN,IAAY,wBAOX;AAPD,WAAY,wBAAwB;IAClC,6CAAiB,CAAA;IACjB,qDAAyB,CAAA;IACzB,mDAAuB,CAAA;IACvB,+CAAmB,CAAA;IACnB,6CAAiB,CAAA;IACjB,mDAAuB,CAAA;AACzB,CAAC,EAPW,wBAAwB,KAAxB,wBAAwB,QAOnC;AAED,MAAM,CAAN,IAAY,yBAOX;AAPD,WAAY,yBAAyB;IACnC,8CAAiB,CAAA;IACjB,sDAAyB,CAAA;IACzB,oDAAuB,CAAA;IACvB,oDAAuB,CAAA;IACvB,8CAAiB,CAAA;IACjB,gDAAmB,CAAA;AACrB,CAAC,EAPW,yBAAyB,KAAzB,yBAAyB,QAOpC"}
@@ -1,4 +1,5 @@
1
1
  export * from './common';
2
2
  export * from './billing-domain';
3
3
  export * from './customer-account-actions';
4
+ export * from './usage-compaction';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usage-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.js","sourceRoot":"","sources":["../../../src/types/usage-compaction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export const EXACT_NUMERIC_MAX_INTEGER_DIGITS = 131072;
2
+ export const EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS = 16383;
3
+ export const EXACT_NUMERIC_MAX_INPUT_LENGTH = EXACT_NUMERIC_MAX_INTEGER_DIGITS
4
+ + EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS
5
+ + 32;
6
+ //# sourceMappingURL=exact-numeric.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.constants.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAO,CAAC;AACxD,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAM,CAAC;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,gCAAgC;MAC1E,mCAAmC;MACnC,EAAE,CAAC"}
@@ -0,0 +1,158 @@
1
+ import { EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS, EXACT_NUMERIC_MAX_INPUT_LENGTH, EXACT_NUMERIC_MAX_INTEGER_DIGITS, } from './exact-numeric.constants';
2
+ export function toExactNumeric(value) {
3
+ var _a, _b, _c;
4
+ if (typeof value === 'number' && !Number.isFinite(value)) {
5
+ throw new Error('Exact numeric value must be finite');
6
+ }
7
+ const input = String(value).trim();
8
+ if (!input || input.length > EXACT_NUMERIC_MAX_INPUT_LENGTH) {
9
+ throw new Error('Exact numeric value is invalid');
10
+ }
11
+ const match = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/.exec(input);
12
+ if (!match || (!match[2] && !match[3])) {
13
+ throw new Error('Exact numeric value is invalid');
14
+ }
15
+ const sign = match[1] === '-' ? '-' : '';
16
+ const integerPart = (_a = match[2]) !== null && _a !== void 0 ? _a : '';
17
+ const fractionalPart = (_b = match[3]) !== null && _b !== void 0 ? _b : '';
18
+ const digits = `${integerPart}${fractionalPart}`;
19
+ if (/^0+$/.test(digits)) {
20
+ return '0';
21
+ }
22
+ const exponentText = (_c = match[4]) !== null && _c !== void 0 ? _c : '0';
23
+ const normalizedExponentText = exponentText.replace(/^([+-]?)0+(?=\d)/, '$1');
24
+ if (normalizedExponentText.replace(/^[+-]/, '').length > 6) {
25
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
26
+ }
27
+ const exponent = Number(normalizedExponentText);
28
+ const maximumShift = EXACT_NUMERIC_MAX_INTEGER_DIGITS
29
+ + EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS;
30
+ if (exponent > maximumShift || exponent < -maximumShift) {
31
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
32
+ }
33
+ const decimalIndex = integerPart.length + exponent;
34
+ let expanded;
35
+ if (decimalIndex <= 0) {
36
+ expanded = `0.${'0'.repeat(-decimalIndex)}${digits}`;
37
+ }
38
+ else if (decimalIndex >= digits.length) {
39
+ expanded = `${digits}${'0'.repeat(decimalIndex - digits.length)}`;
40
+ }
41
+ else {
42
+ expanded = `${digits.slice(0, decimalIndex)}.${digits.slice(decimalIndex)}`;
43
+ }
44
+ const [expandedIntegerPart, expandedFractionalPart = ''] = expanded.split('.');
45
+ const normalizedIntegerPart = expandedIntegerPart.replace(/^0+(?=\d)/, '');
46
+ const normalizedFractionalPart = expandedFractionalPart.replace(/0+$/, '');
47
+ if (normalizedIntegerPart.length > EXACT_NUMERIC_MAX_INTEGER_DIGITS
48
+ || normalizedFractionalPart.length > EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS) {
49
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
50
+ }
51
+ const normalized = normalizedFractionalPart
52
+ ? `${normalizedIntegerPart}.${normalizedFractionalPart}`
53
+ : normalizedIntegerPart;
54
+ return `${sign}${normalized}`;
55
+ }
56
+ export function addExactNumeric(left, right) {
57
+ const leftValue = parseExactNumeric(left);
58
+ const rightValue = parseExactNumeric(right);
59
+ const scale = Math.max(leftValue.scale, rightValue.scale);
60
+ const leftDigits = alignScale(leftValue, scale);
61
+ const rightDigits = alignScale(rightValue, scale);
62
+ if (leftValue.sign === 0)
63
+ return formatExactNumeric(rightDigits, scale, rightValue.sign);
64
+ if (rightValue.sign === 0)
65
+ return formatExactNumeric(leftDigits, scale, leftValue.sign);
66
+ if (leftValue.sign === rightValue.sign) {
67
+ return formatExactNumeric(addUnsigned(leftDigits, rightDigits), scale, leftValue.sign);
68
+ }
69
+ const comparison = compareUnsigned(leftDigits, rightDigits);
70
+ if (comparison === 0)
71
+ return '0';
72
+ return comparison > 0
73
+ ? formatExactNumeric(subtractUnsigned(leftDigits, rightDigits), scale, leftValue.sign)
74
+ : formatExactNumeric(subtractUnsigned(rightDigits, leftDigits), scale, rightValue.sign);
75
+ }
76
+ export function sumExactNumeric(values) {
77
+ return values.reduce(addExactNumeric, '0');
78
+ }
79
+ export function compareExactNumeric(left, right) {
80
+ const leftValue = parseExactNumeric(left);
81
+ const rightValue = parseExactNumeric(right);
82
+ if (leftValue.sign !== rightValue.sign) {
83
+ return leftValue.sign < rightValue.sign ? -1 : 1;
84
+ }
85
+ if (leftValue.sign === 0)
86
+ return 0;
87
+ const scale = Math.max(leftValue.scale, rightValue.scale);
88
+ const comparison = compareUnsigned(alignScale(leftValue, scale), alignScale(rightValue, scale));
89
+ return leftValue.sign === 1 ? comparison : -comparison;
90
+ }
91
+ function parseExactNumeric(value) {
92
+ const canonical = toExactNumeric(value);
93
+ const isNegative = canonical.startsWith('-');
94
+ const unsigned = isNegative ? canonical.slice(1) : canonical;
95
+ const [integerPart, fractionalPart = ''] = unsigned.split('.');
96
+ const digits = `${integerPart}${fractionalPart}`.replace(/^0+/, '') || '0';
97
+ return {
98
+ digits,
99
+ scale: fractionalPart.length,
100
+ sign: digits === '0' ? 0 : isNegative ? -1 : 1,
101
+ };
102
+ }
103
+ function alignScale(value, scale) {
104
+ return `${value.digits}${'0'.repeat(scale - value.scale)}`;
105
+ }
106
+ function formatExactNumeric(digits, scale, sign) {
107
+ const normalizedDigits = digits.replace(/^0+/, '') || '0';
108
+ if (normalizedDigits === '0' || sign === 0)
109
+ return '0';
110
+ const signPrefix = sign === -1 ? '-' : '';
111
+ if (scale === 0)
112
+ return `${signPrefix}${normalizedDigits}`;
113
+ const paddedDigits = normalizedDigits.padStart(scale + 1, '0');
114
+ const decimalIndex = paddedDigits.length - scale;
115
+ return toExactNumeric(`${signPrefix}${paddedDigits.slice(0, decimalIndex)}.${paddedDigits.slice(decimalIndex)}`);
116
+ }
117
+ function compareUnsigned(left, right) {
118
+ const normalizedLeft = left.replace(/^0+/, '') || '0';
119
+ const normalizedRight = right.replace(/^0+/, '') || '0';
120
+ if (normalizedLeft.length !== normalizedRight.length) {
121
+ return normalizedLeft.length < normalizedRight.length ? -1 : 1;
122
+ }
123
+ if (normalizedLeft === normalizedRight)
124
+ return 0;
125
+ return normalizedLeft < normalizedRight ? -1 : 1;
126
+ }
127
+ function addUnsigned(left, right) {
128
+ const length = Math.max(left.length, right.length);
129
+ const leftDigits = left.padStart(length, '0');
130
+ const rightDigits = right.padStart(length, '0');
131
+ const result = new Array(length + 1).fill('0');
132
+ let carry = 0;
133
+ for (let index = length - 1; index >= 0; index -= 1) {
134
+ const sum = Number(leftDigits[index]) + Number(rightDigits[index]) + carry;
135
+ result[index + 1] = String(sum % 10);
136
+ carry = Math.floor(sum / 10);
137
+ }
138
+ result[0] = String(carry);
139
+ return result.join('').replace(/^0+/, '') || '0';
140
+ }
141
+ function subtractUnsigned(left, right) {
142
+ const rightDigits = right.padStart(left.length, '0');
143
+ const result = new Array(left.length).fill('0');
144
+ let borrow = 0;
145
+ for (let index = left.length - 1; index >= 0; index -= 1) {
146
+ let difference = Number(left[index]) - Number(rightDigits[index]) - borrow;
147
+ if (difference < 0) {
148
+ difference += 10;
149
+ borrow = 1;
150
+ }
151
+ else {
152
+ borrow = 0;
153
+ }
154
+ result[index] = String(difference);
155
+ }
156
+ return result.join('').replace(/^0+/, '') || '0';
157
+ }
158
+ //# sourceMappingURL=exact-numeric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exact-numeric.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.types.js","sourceRoot":"","sources":["../../../src/utils/exact-numeric.types.ts"],"names":[],"mappings":""}
@@ -5,4 +5,5 @@ export * from './format-date';
5
5
  export * from './escape-csv-value';
6
6
  export * from './build-csv-file-name';
7
7
  export * from './build-csv-file-string';
8
+ export * from './exact-numeric';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC"}
@@ -15,4 +15,5 @@ export * from './sku-status';
15
15
  export * from './customer-account-action';
16
16
  export * from './environment-status';
17
17
  export * from './billing-domain';
18
+ export * from './usage-compaction';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export declare enum UsageGranularity {
2
+ HOUR = "hour",
3
+ DAY = "day"
4
+ }
5
+ export declare enum UsageCompactionRunMode {
6
+ DRY_RUN = "dry-run",
7
+ BACKFILL = "backfill",
8
+ SCHEDULED = "scheduled",
9
+ RECOMPILE = "recompile",
10
+ REPAIR = "repair"
11
+ }
12
+ export declare enum UsageCompactionRunStatus {
13
+ QUEUED = "queued",
14
+ PROCESSING = "processing",
15
+ COMPLETED = "completed",
16
+ PARTIAL = "partial",
17
+ FAILED = "failed",
18
+ CANCELLED = "cancelled"
19
+ }
20
+ export declare enum UsageCompactionItemStatus {
21
+ QUEUED = "queued",
22
+ PROCESSING = "processing",
23
+ VALIDATED = "validated",
24
+ COMPLETED = "completed",
25
+ FAILED = "failed",
26
+ SKIPPED = "skipped"
27
+ }
28
+ //# sourceMappingURL=usage-compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.d.ts","sourceRoot":"","sources":["../../../src/enums/usage-compaction.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED,oBAAY,sBAAsB;IAChC,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,oBAAY,wBAAwB;IAClC,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED,oBAAY,yBAAyB;IACnC,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB"}
@@ -1,4 +1,5 @@
1
1
  export * from './common';
2
2
  export * from './billing-domain';
3
3
  export * from './customer-account-actions';
4
+ export * from './usage-compaction';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CategoryNamespace } from '../enums/category-namespace';
2
+ import type { DataSourceProvider } from '../enums/customer-usage';
3
+ export type ExactNumeric = string;
4
+ export interface UsageCompactionScope {
5
+ readonly sourceProvider: DataSourceProvider;
6
+ readonly sourceId: string;
7
+ readonly eventType: CategoryNamespace;
8
+ readonly dayFrom: Date;
9
+ readonly dayTo: Date;
10
+ }
11
+ //# sourceMappingURL=usage-compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-compaction.d.ts","sourceRoot":"","sources":["../../../src/types/usage-compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB"}
@@ -0,0 +1,4 @@
1
+ export declare const EXACT_NUMERIC_MAX_INTEGER_DIGITS = 131072;
2
+ export declare const EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS = 16383;
3
+ export declare const EXACT_NUMERIC_MAX_INPUT_LENGTH: number;
4
+ //# sourceMappingURL=exact-numeric.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.constants.d.ts","sourceRoot":"","sources":["../../../src/utils/exact-numeric.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gCAAgC,SAAU,CAAC;AACxD,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAC1D,eAAO,MAAM,8BAA8B,QAErC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ExactNumeric } from '../types/usage-compaction';
2
+ export declare function toExactNumeric(value: number | string): ExactNumeric;
3
+ export declare function addExactNumeric(left: ExactNumeric, right: ExactNumeric): ExactNumeric;
4
+ export declare function sumExactNumeric(values: readonly ExactNumeric[]): ExactNumeric;
5
+ export declare function compareExactNumeric(left: ExactNumeric, right: ExactNumeric): number;
6
+ //# sourceMappingURL=exact-numeric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.d.ts","sourceRoot":"","sources":["../../../src/utils/exact-numeric.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAS9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CA6DnE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,YAAY,GAClB,YAAY,CAoBd;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAE7E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAgBnF"}
@@ -0,0 +1,6 @@
1
+ export interface ParsedExactNumeric {
2
+ readonly digits: string;
3
+ readonly scale: number;
4
+ readonly sign: -1 | 0 | 1;
5
+ }
6
+ //# sourceMappingURL=exact-numeric.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-numeric.types.d.ts","sourceRoot":"","sources":["../../../src/utils/exact-numeric.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC3B"}
@@ -5,4 +5,5 @@ export * from './format-date';
5
5
  export * from './escape-csv-value';
6
6
  export * from './build-csv-file-name';
7
7
  export * from './build-csv-file-string';
8
+ export * from './exact-numeric';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onereach/billing-shared",
3
- "version": "31.1.1-beta.12522.0",
3
+ "version": "31.1.1-beta.12589.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -15,3 +15,4 @@ export * from './sku-status';
15
15
  export * from './customer-account-action';
16
16
  export * from './environment-status';
17
17
  export * from './billing-domain';
18
+ export * from './usage-compaction';
@@ -0,0 +1,30 @@
1
+ export enum UsageGranularity {
2
+ HOUR = 'hour',
3
+ DAY = 'day',
4
+ }
5
+
6
+ export enum UsageCompactionRunMode {
7
+ DRY_RUN = 'dry-run',
8
+ BACKFILL = 'backfill',
9
+ SCHEDULED = 'scheduled',
10
+ RECOMPILE = 'recompile',
11
+ REPAIR = 'repair',
12
+ }
13
+
14
+ export enum UsageCompactionRunStatus {
15
+ QUEUED = 'queued',
16
+ PROCESSING = 'processing',
17
+ COMPLETED = 'completed',
18
+ PARTIAL = 'partial',
19
+ FAILED = 'failed',
20
+ CANCELLED = 'cancelled',
21
+ }
22
+
23
+ export enum UsageCompactionItemStatus {
24
+ QUEUED = 'queued',
25
+ PROCESSING = 'processing',
26
+ VALIDATED = 'validated',
27
+ COMPLETED = 'completed',
28
+ FAILED = 'failed',
29
+ SKIPPED = 'skipped',
30
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './common';
2
2
  export * from './billing-domain';
3
3
  export * from './customer-account-actions';
4
+ export * from './usage-compaction';
@@ -0,0 +1,12 @@
1
+ import type { CategoryNamespace } from '../enums/category-namespace';
2
+ import type { DataSourceProvider } from '../enums/customer-usage';
3
+
4
+ export type ExactNumeric = string;
5
+
6
+ export interface UsageCompactionScope {
7
+ readonly sourceProvider: DataSourceProvider;
8
+ readonly sourceId: string;
9
+ readonly eventType: CategoryNamespace;
10
+ readonly dayFrom: Date;
11
+ readonly dayTo: Date;
12
+ }
@@ -0,0 +1,5 @@
1
+ export const EXACT_NUMERIC_MAX_INTEGER_DIGITS = 131_072;
2
+ export const EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS = 16_383;
3
+ export const EXACT_NUMERIC_MAX_INPUT_LENGTH = EXACT_NUMERIC_MAX_INTEGER_DIGITS
4
+ + EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS
5
+ + 32;
@@ -0,0 +1,199 @@
1
+ import type { ExactNumeric } from '../types/usage-compaction';
2
+
3
+ import {
4
+ EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS,
5
+ EXACT_NUMERIC_MAX_INPUT_LENGTH,
6
+ EXACT_NUMERIC_MAX_INTEGER_DIGITS,
7
+ } from './exact-numeric.constants';
8
+ import type { ParsedExactNumeric } from './exact-numeric.types';
9
+
10
+ export function toExactNumeric(value: number | string): ExactNumeric {
11
+ if (typeof value === 'number' && !Number.isFinite(value)) {
12
+ throw new Error('Exact numeric value must be finite');
13
+ }
14
+
15
+ const input = String(value).trim();
16
+ if (!input || input.length > EXACT_NUMERIC_MAX_INPUT_LENGTH) {
17
+ throw new Error('Exact numeric value is invalid');
18
+ }
19
+
20
+ const match = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/.exec(input);
21
+ if (!match || (!match[2] && !match[3])) {
22
+ throw new Error('Exact numeric value is invalid');
23
+ }
24
+
25
+ const sign = match[1] === '-' ? '-' : '';
26
+ const integerPart = match[2] ?? '';
27
+ const fractionalPart = match[3] ?? '';
28
+ const digits = `${integerPart}${fractionalPart}`;
29
+
30
+ if (/^0+$/.test(digits)) {
31
+ return '0';
32
+ }
33
+
34
+ const exponentText = match[4] ?? '0';
35
+ const normalizedExponentText = exponentText.replace(/^([+-]?)0+(?=\d)/, '$1');
36
+ if (normalizedExponentText.replace(/^[+-]/, '').length > 6) {
37
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
38
+ }
39
+ const exponent = Number(normalizedExponentText);
40
+ const maximumShift = EXACT_NUMERIC_MAX_INTEGER_DIGITS
41
+ + EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS;
42
+ if (exponent > maximumShift || exponent < -maximumShift) {
43
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
44
+ }
45
+
46
+ const decimalIndex = integerPart.length + exponent;
47
+ let expanded: string;
48
+
49
+ if (decimalIndex <= 0) {
50
+ expanded = `0.${'0'.repeat(-decimalIndex)}${digits}`;
51
+ } else if (decimalIndex >= digits.length) {
52
+ expanded = `${digits}${'0'.repeat(decimalIndex - digits.length)}`;
53
+ } else {
54
+ expanded = `${digits.slice(0, decimalIndex)}.${digits.slice(decimalIndex)}`;
55
+ }
56
+
57
+ const [expandedIntegerPart, expandedFractionalPart = ''] = expanded.split('.');
58
+ const normalizedIntegerPart = expandedIntegerPart.replace(/^0+(?=\d)/, '');
59
+ const normalizedFractionalPart = expandedFractionalPart.replace(/0+$/, '');
60
+
61
+ if (normalizedIntegerPart.length > EXACT_NUMERIC_MAX_INTEGER_DIGITS
62
+ || normalizedFractionalPart.length > EXACT_NUMERIC_MAX_FRACTIONAL_DIGITS) {
63
+ throw new Error('Exact numeric value exceeds PostgreSQL NUMERIC limits');
64
+ }
65
+
66
+ const normalized = normalizedFractionalPart
67
+ ? `${normalizedIntegerPart}.${normalizedFractionalPart}`
68
+ : normalizedIntegerPart;
69
+
70
+ return `${sign}${normalized}`;
71
+ }
72
+
73
+ export function addExactNumeric(
74
+ left: ExactNumeric,
75
+ right: ExactNumeric,
76
+ ): ExactNumeric {
77
+ const leftValue = parseExactNumeric(left);
78
+ const rightValue = parseExactNumeric(right);
79
+ const scale = Math.max(leftValue.scale, rightValue.scale);
80
+ const leftDigits = alignScale(leftValue, scale);
81
+ const rightDigits = alignScale(rightValue, scale);
82
+
83
+ if (leftValue.sign === 0) return formatExactNumeric(rightDigits, scale, rightValue.sign);
84
+ if (rightValue.sign === 0) return formatExactNumeric(leftDigits, scale, leftValue.sign);
85
+
86
+ if (leftValue.sign === rightValue.sign) {
87
+ return formatExactNumeric(addUnsigned(leftDigits, rightDigits), scale, leftValue.sign);
88
+ }
89
+
90
+ const comparison = compareUnsigned(leftDigits, rightDigits);
91
+ if (comparison === 0) return '0';
92
+
93
+ return comparison > 0
94
+ ? formatExactNumeric(subtractUnsigned(leftDigits, rightDigits), scale, leftValue.sign)
95
+ : formatExactNumeric(subtractUnsigned(rightDigits, leftDigits), scale, rightValue.sign);
96
+ }
97
+
98
+ export function sumExactNumeric(values: readonly ExactNumeric[]): ExactNumeric {
99
+ return values.reduce<ExactNumeric>(addExactNumeric, '0');
100
+ }
101
+
102
+ export function compareExactNumeric(left: ExactNumeric, right: ExactNumeric): number {
103
+ const leftValue = parseExactNumeric(left);
104
+ const rightValue = parseExactNumeric(right);
105
+
106
+ if (leftValue.sign !== rightValue.sign) {
107
+ return leftValue.sign < rightValue.sign ? -1 : 1;
108
+ }
109
+ if (leftValue.sign === 0) return 0;
110
+
111
+ const scale = Math.max(leftValue.scale, rightValue.scale);
112
+ const comparison = compareUnsigned(
113
+ alignScale(leftValue, scale),
114
+ alignScale(rightValue, scale),
115
+ );
116
+
117
+ return leftValue.sign === 1 ? comparison : -comparison;
118
+ }
119
+
120
+ function parseExactNumeric(value: ExactNumeric): ParsedExactNumeric {
121
+ const canonical = toExactNumeric(value);
122
+ const isNegative = canonical.startsWith('-');
123
+ const unsigned = isNegative ? canonical.slice(1) : canonical;
124
+ const [integerPart, fractionalPart = ''] = unsigned.split('.');
125
+ const digits = `${integerPart}${fractionalPart}`.replace(/^0+/, '') || '0';
126
+
127
+ return {
128
+ digits,
129
+ scale: fractionalPart.length,
130
+ sign: digits === '0' ? 0 : isNegative ? -1 : 1,
131
+ };
132
+ }
133
+
134
+ function alignScale(value: ParsedExactNumeric, scale: number): string {
135
+ return `${value.digits}${'0'.repeat(scale - value.scale)}`;
136
+ }
137
+
138
+ function formatExactNumeric(digits: string, scale: number, sign: -1 | 0 | 1): ExactNumeric {
139
+ const normalizedDigits = digits.replace(/^0+/, '') || '0';
140
+ if (normalizedDigits === '0' || sign === 0) return '0';
141
+
142
+ const signPrefix = sign === -1 ? '-' : '';
143
+ if (scale === 0) return `${signPrefix}${normalizedDigits}`;
144
+
145
+ const paddedDigits = normalizedDigits.padStart(scale + 1, '0');
146
+ const decimalIndex = paddedDigits.length - scale;
147
+
148
+ return toExactNumeric(
149
+ `${signPrefix}${paddedDigits.slice(0, decimalIndex)}.${paddedDigits.slice(decimalIndex)}`,
150
+ );
151
+ }
152
+
153
+ function compareUnsigned(left: string, right: string): number {
154
+ const normalizedLeft = left.replace(/^0+/, '') || '0';
155
+ const normalizedRight = right.replace(/^0+/, '') || '0';
156
+
157
+ if (normalizedLeft.length !== normalizedRight.length) {
158
+ return normalizedLeft.length < normalizedRight.length ? -1 : 1;
159
+ }
160
+ if (normalizedLeft === normalizedRight) return 0;
161
+
162
+ return normalizedLeft < normalizedRight ? -1 : 1;
163
+ }
164
+
165
+ function addUnsigned(left: string, right: string): string {
166
+ const length = Math.max(left.length, right.length);
167
+ const leftDigits = left.padStart(length, '0');
168
+ const rightDigits = right.padStart(length, '0');
169
+ const result = new Array<string>(length + 1).fill('0');
170
+ let carry = 0;
171
+
172
+ for (let index = length - 1;index >= 0;index -= 1) {
173
+ const sum = Number(leftDigits[index]) + Number(rightDigits[index]) + carry;
174
+ result[index + 1] = String(sum % 10);
175
+ carry = Math.floor(sum / 10);
176
+ }
177
+ result[0] = String(carry);
178
+
179
+ return result.join('').replace(/^0+/, '') || '0';
180
+ }
181
+
182
+ function subtractUnsigned(left: string, right: string): string {
183
+ const rightDigits = right.padStart(left.length, '0');
184
+ const result = new Array<string>(left.length).fill('0');
185
+ let borrow = 0;
186
+
187
+ for (let index = left.length - 1;index >= 0;index -= 1) {
188
+ let difference = Number(left[index]) - Number(rightDigits[index]) - borrow;
189
+ if (difference < 0) {
190
+ difference += 10;
191
+ borrow = 1;
192
+ } else {
193
+ borrow = 0;
194
+ }
195
+ result[index] = String(difference);
196
+ }
197
+
198
+ return result.join('').replace(/^0+/, '') || '0';
199
+ }
@@ -0,0 +1,5 @@
1
+ export interface ParsedExactNumeric {
2
+ readonly digits: string;
3
+ readonly scale: number;
4
+ readonly sign: -1 | 0 | 1;
5
+ }
@@ -5,3 +5,4 @@ export * from './format-date';
5
5
  export * from './escape-csv-value';
6
6
  export * from './build-csv-file-name';
7
7
  export * from './build-csv-file-string';
8
+ export * from './exact-numeric';