@powerhousedao/shared 6.0.0-dev.105 → 6.0.0-dev.106
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/analytics/index.d.ts +42 -4
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +307 -4
- package/dist/analytics/index.js.map +1 -1
- package/dist/clis/index.d.mts +1271 -0
- package/dist/clis/index.d.mts.map +1 -0
- package/dist/clis/index.mjs +6801 -0
- package/dist/clis/index.mjs.map +1 -0
- package/dist/connect/index.d.ts +866 -1
- package/dist/connect/index.d.ts.map +1 -1
- package/dist/connect/index.js +254 -1
- package/dist/connect/index.js.map +1 -1
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +41 -0
- package/dist/constants.js.map +1 -0
- package/dist/document-drive/index.d.ts +546 -0
- package/dist/document-drive/index.d.ts.map +1 -0
- package/dist/document-drive/index.js +956 -0
- package/dist/document-drive/index.js.map +1 -0
- package/dist/document-model/index.d.ts +3 -5
- package/dist/document-model/index.js +3408 -2
- package/dist/document-model/index.js.map +1 -1
- package/dist/index-dg_xL7sp.d.ts +567 -0
- package/dist/index-dg_xL7sp.d.ts.map +1 -0
- package/dist/processors/index.d.ts +2 -5
- package/dist/processors/index.js +116 -3
- package/dist/processors/index.js.map +1 -1
- package/dist/registry/index.d.ts +46 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +0 -0
- package/dist/types-DWXYsIF1.d.ts +158 -0
- package/dist/types-DWXYsIF1.d.ts.map +1 -0
- package/dist/types-faUXKACL.d.ts +2153 -0
- package/dist/types-faUXKACL.d.ts.map +1 -0
- package/package.json +44 -4
- package/dist/analytics/analytics-path.d.ts +0 -36
- package/dist/analytics/analytics-path.d.ts.map +0 -1
- package/dist/analytics/analytics-path.js +0 -170
- package/dist/analytics/analytics-path.js.map +0 -1
- package/dist/analytics/analytics-period.d.ts +0 -40
- package/dist/analytics/analytics-period.d.ts.map +0 -1
- package/dist/analytics/analytics-period.js +0 -204
- package/dist/analytics/analytics-period.js.map +0 -1
- package/dist/analytics/constants.d.ts +0 -35
- package/dist/analytics/constants.d.ts.map +0 -1
- package/dist/analytics/constants.js +0 -40
- package/dist/analytics/constants.js.map +0 -1
- package/dist/analytics/types.d.ts +0 -85
- package/dist/analytics/types.d.ts.map +0 -1
- package/dist/analytics/types.js +0 -2
- package/dist/analytics/types.js.map +0 -1
- package/dist/connect/env-config.d.ts +0 -862
- package/dist/connect/env-config.d.ts.map +0 -1
- package/dist/connect/env-config.js +0 -525
- package/dist/connect/env-config.js.map +0 -1
- package/dist/document-model/core/actions.d.ts +0 -62
- package/dist/document-model/core/actions.d.ts.map +0 -1
- package/dist/document-model/core/actions.js +0 -2
- package/dist/document-model/core/actions.js.map +0 -1
- package/dist/document-model/core/constants.d.ts +0 -6
- package/dist/document-model/core/constants.d.ts.map +0 -1
- package/dist/document-model/core/constants.js +0 -8
- package/dist/document-model/core/constants.js.map +0 -1
- package/dist/document-model/core/documents.d.ts +0 -102
- package/dist/document-model/core/documents.d.ts.map +0 -1
- package/dist/document-model/core/documents.js +0 -2
- package/dist/document-model/core/documents.js.map +0 -1
- package/dist/document-model/core/operations.d.ts +0 -74
- package/dist/document-model/core/operations.d.ts.map +0 -1
- package/dist/document-model/core/operations.js +0 -2
- package/dist/document-model/core/operations.js.map +0 -1
- package/dist/document-model/core/ph-types.d.ts +0 -7
- package/dist/document-model/core/ph-types.d.ts.map +0 -1
- package/dist/document-model/core/ph-types.js +0 -2
- package/dist/document-model/core/ph-types.js.map +0 -1
- package/dist/document-model/core/signatures.d.ts +0 -52
- package/dist/document-model/core/signatures.d.ts.map +0 -1
- package/dist/document-model/core/signatures.js +0 -2
- package/dist/document-model/core/signatures.js.map +0 -1
- package/dist/document-model/core/state.d.ts +0 -38
- package/dist/document-model/core/state.d.ts.map +0 -1
- package/dist/document-model/core/state.js +0 -2
- package/dist/document-model/core/state.js.map +0 -1
- package/dist/document-model/core/types.d.ts +0 -533
- package/dist/document-model/core/types.d.ts.map +0 -1
- package/dist/document-model/core/types.js +0 -2
- package/dist/document-model/core/types.js.map +0 -1
- package/dist/document-model/core/upgrades.d.ts +0 -24
- package/dist/document-model/core/upgrades.d.ts.map +0 -1
- package/dist/document-model/core/upgrades.js +0 -2
- package/dist/document-model/core/upgrades.js.map +0 -1
- package/dist/document-model/index.d.ts.map +0 -1
- package/dist/document-model/types.d.ts +0 -97
- package/dist/document-model/types.d.ts.map +0 -1
- package/dist/document-model/types.js +0 -2
- package/dist/document-model/types.js.map +0 -1
- package/dist/processors/constants.d.ts +0 -4
- package/dist/processors/constants.d.ts.map +0 -1
- package/dist/processors/constants.js +0 -4
- package/dist/processors/constants.js.map +0 -1
- package/dist/processors/drive-analytics/document-processor.d.ts +0 -10
- package/dist/processors/drive-analytics/document-processor.d.ts.map +0 -1
- package/dist/processors/drive-analytics/document-processor.js +0 -43
- package/dist/processors/drive-analytics/document-processor.js.map +0 -1
- package/dist/processors/drive-analytics/drive-processor.d.ts +0 -10
- package/dist/processors/drive-analytics/drive-processor.d.ts.map +0 -1
- package/dist/processors/drive-analytics/drive-processor.js +0 -85
- package/dist/processors/drive-analytics/drive-processor.js.map +0 -1
- package/dist/processors/drive-analytics/index.d.ts +0 -10
- package/dist/processors/drive-analytics/index.d.ts.map +0 -1
- package/dist/processors/drive-analytics/index.js +0 -28
- package/dist/processors/drive-analytics/index.js.map +0 -1
- package/dist/processors/drive-analytics/types.d.ts +0 -3
- package/dist/processors/drive-analytics/types.d.ts.map +0 -1
- package/dist/processors/drive-analytics/types.js +0 -2
- package/dist/processors/drive-analytics/types.js.map +0 -1
- package/dist/processors/index.d.ts.map +0 -1
- package/dist/processors/relational/types.d.ts +0 -72
- package/dist/processors/relational/types.d.ts.map +0 -1
- package/dist/processors/relational/types.js +0 -45
- package/dist/processors/relational/types.js.map +0 -1
- package/dist/processors/relational/utils.d.ts +0 -29
- package/dist/processors/relational/utils.d.ts.map +0 -1
- package/dist/processors/relational/utils.js +0 -67
- package/dist/processors/relational/utils.js.map +0 -1
- package/dist/processors/types.d.ts +0 -90
- package/dist/processors/types.d.ts.map +0 -1
- package/dist/processors/types.js +0 -2
- package/dist/processors/types.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,5 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { _ as AnalyticsMetric, a as AnalyticsSeriesInput, b as CompoundOperator, c as CompoundAnalyticsExpression, d as ConversionMetric, f as IAnalyticsStore, g as AnalyticsGranularity, h as AnalyticsPathSegment, i as AnalyticsSeries, l as CompoundAnalyticsInputs, m as AnalyticsPath, n as AnalyticsOperand, o as AnalyticsSeriesQuery, p as MultiCurrencyConversion, r as AnalyticsQuery, s as AnalyticsUpdateCallback, t as AnalyticsDimension, u as CompoundAnalyticsQuery, v as AnalyticsPeriodType, y as AnalyticsSerializerTypes } from "../types-DWXYsIF1.js";
|
|
2
|
+
|
|
3
|
+
//#region analytics/analytics-period.d.ts
|
|
4
|
+
declare class AnalyticsPeriod {
|
|
5
|
+
get type(): AnalyticsPeriodType;
|
|
6
|
+
get year(): number;
|
|
7
|
+
get quarter(): number | null;
|
|
8
|
+
get month(): number | null;
|
|
9
|
+
private _type;
|
|
10
|
+
private _year;
|
|
11
|
+
private _quarter;
|
|
12
|
+
private _month;
|
|
13
|
+
toJSON(): {
|
|
14
|
+
_t: AnalyticsSerializerTypes;
|
|
15
|
+
_v: string;
|
|
16
|
+
};
|
|
17
|
+
static fromString(period: string): AnalyticsPeriod;
|
|
18
|
+
static fillRange(p1: AnalyticsPeriod | string, p2: AnalyticsPeriod | string): AnalyticsPeriod[];
|
|
19
|
+
static normalizeQuarters(year: number, quarter: number): PeriodTriple;
|
|
20
|
+
static normalizeMonths(year: number, month: number): PeriodTriple;
|
|
21
|
+
constructor(year: number, quarter?: number, month?: number);
|
|
22
|
+
equals(period: AnalyticsPeriod | string): boolean;
|
|
23
|
+
toString(): string;
|
|
24
|
+
startAsSqlDate(): string;
|
|
25
|
+
comesAfter(period: AnalyticsPeriod): boolean;
|
|
26
|
+
comesBefore(period: AnalyticsPeriod): boolean;
|
|
27
|
+
contains(period: AnalyticsPeriod): boolean;
|
|
28
|
+
firstMonth(): AnalyticsPeriod;
|
|
29
|
+
lastMonth(): AnalyticsPeriod;
|
|
30
|
+
nextPeriod(n?: number): AnalyticsPeriod;
|
|
31
|
+
previousPeriod(n?: number): AnalyticsPeriod;
|
|
32
|
+
private _start;
|
|
33
|
+
private _end;
|
|
34
|
+
private _getNumericComparator;
|
|
35
|
+
private _addPeriods;
|
|
36
|
+
private _initAsYear;
|
|
37
|
+
private _initAsQuarter;
|
|
38
|
+
private _initAsMonth;
|
|
39
|
+
}
|
|
40
|
+
type PeriodTriple = [number, number | undefined, number | undefined];
|
|
41
|
+
//#endregion
|
|
42
|
+
export { AnalyticsDimension, AnalyticsGranularity, AnalyticsMetric, AnalyticsOperand, AnalyticsPath, AnalyticsPathSegment, AnalyticsPeriod, AnalyticsPeriodType, AnalyticsQuery, AnalyticsSerializerTypes, AnalyticsSeries, AnalyticsSeriesInput, AnalyticsSeriesQuery, AnalyticsUpdateCallback, CompoundAnalyticsExpression, CompoundAnalyticsInputs, CompoundAnalyticsQuery, CompoundOperator, ConversionMetric, IAnalyticsStore, MultiCurrencyConversion };
|
|
5
43
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../analytics/analytics-period.ts"],"mappings":";;;cAEa,eAAA;EAAA,IACP,IAAA,CAAA,GAAQ,mBAAA;EAAA,IAGR,IAAA,CAAA;EAAA,IAGA,OAAA,CAAA;EAAA,IAGA,KAAA,CAAA;EAAA,QAII,KAAA;EAAA,QACA,KAAA;EAAA,QACA,QAAA;EAAA,QACA,MAAA;EAED,MAAA,CAAA;;;;SAOO,UAAA,CAAW,MAAA,WAAiB,eAAA;EAAA,OA2B5B,SAAA,CACZ,EAAA,EAAI,eAAA,WACJ,EAAA,EAAI,eAAA,YACH,eAAA;EAAA,OA0BW,iBAAA,CAAkB,IAAA,UAAc,OAAA,WAAkB,YAAA;EAAA,OAMlD,eAAA,CAAgB,IAAA,UAAc,KAAA,WAAgB,YAAA;cAOzC,IAAA,UAAc,OAAA,WAAkB,KAAA;EAY5C,MAAA,CAAO,MAAA,EAAQ,eAAA;EAOf,QAAA,CAAA;EAgBA,cAAA,CAAA;EAsBA,UAAA,CAAW,MAAA,EAAQ,eAAA;EAInB,WAAA,CAAY,MAAA,EAAQ,eAAA;EAIpB,QAAA,CAAS,MAAA,EAAQ,eAAA;EAIjB,UAAA,CAAA,GAAc,eAAA;EAUd,SAAA,CAAA,GAAa,eAAA;EAUb,UAAA,CAAW,CAAA,YAAgB,eAAA;EAI3B,cAAA,CAAe,CAAA,YAAgB,eAAA;EAAA,QAI9B,MAAA;EAAA,QAIA,IAAA;EAAA,QAIA,qBAAA;EAAA,QAYA,WAAA;EAAA,QAsBA,WAAA;EAAA,QAQA,cAAA;EAAA,QASA,YAAA;AAAA;AAAA,KAuBL,YAAA"}
|
package/dist/analytics/index.js
CHANGED
|
@@ -1,5 +1,308 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
//#region analytics/constants.ts
|
|
2
|
+
let AnalyticsSerializerTypes = /* @__PURE__ */ function(AnalyticsSerializerTypes) {
|
|
3
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPath"] = 0] = "AnalyticsPath";
|
|
4
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPathSegment"] = 1] = "AnalyticsPathSegment";
|
|
5
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPeriod"] = 2] = "AnalyticsPeriod";
|
|
6
|
+
return AnalyticsSerializerTypes;
|
|
7
|
+
}({});
|
|
8
|
+
let AnalyticsPeriodType = /* @__PURE__ */ function(AnalyticsPeriodType) {
|
|
9
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Year"] = 0] = "Year";
|
|
10
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Quarter"] = 1] = "Quarter";
|
|
11
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Month"] = 2] = "Month";
|
|
12
|
+
return AnalyticsPeriodType;
|
|
13
|
+
}({});
|
|
14
|
+
let AnalyticsMetric = /* @__PURE__ */ function(AnalyticsMetric) {
|
|
15
|
+
AnalyticsMetric[AnalyticsMetric["Budget"] = 0] = "Budget";
|
|
16
|
+
AnalyticsMetric[AnalyticsMetric["Forecast"] = 1] = "Forecast";
|
|
17
|
+
AnalyticsMetric[AnalyticsMetric["Actuals"] = 2] = "Actuals";
|
|
18
|
+
AnalyticsMetric[AnalyticsMetric["PaymentsOnChain"] = 3] = "PaymentsOnChain";
|
|
19
|
+
AnalyticsMetric[AnalyticsMetric["PaymentsOffChainIncluded"] = 4] = "PaymentsOffChainIncluded";
|
|
20
|
+
AnalyticsMetric[AnalyticsMetric["FTEs"] = 5] = "FTEs";
|
|
21
|
+
return AnalyticsMetric;
|
|
22
|
+
}({});
|
|
23
|
+
let CompoundOperator = /* @__PURE__ */ function(CompoundOperator) {
|
|
24
|
+
CompoundOperator[CompoundOperator["VectorAdd"] = 0] = "VectorAdd";
|
|
25
|
+
CompoundOperator[CompoundOperator["VectorSubtract"] = 1] = "VectorSubtract";
|
|
26
|
+
CompoundOperator[CompoundOperator["ScalarMultiply"] = 2] = "ScalarMultiply";
|
|
27
|
+
CompoundOperator[CompoundOperator["ScalarDivide"] = 3] = "ScalarDivide";
|
|
28
|
+
return CompoundOperator;
|
|
29
|
+
}({});
|
|
30
|
+
let AnalyticsGranularity = /* @__PURE__ */ function(AnalyticsGranularity) {
|
|
31
|
+
AnalyticsGranularity[AnalyticsGranularity["Total"] = 0] = "Total";
|
|
32
|
+
AnalyticsGranularity[AnalyticsGranularity["Annual"] = 1] = "Annual";
|
|
33
|
+
AnalyticsGranularity[AnalyticsGranularity["SemiAnnual"] = 2] = "SemiAnnual";
|
|
34
|
+
AnalyticsGranularity[AnalyticsGranularity["Quarterly"] = 3] = "Quarterly";
|
|
35
|
+
AnalyticsGranularity[AnalyticsGranularity["Monthly"] = 4] = "Monthly";
|
|
36
|
+
AnalyticsGranularity[AnalyticsGranularity["Weekly"] = 5] = "Weekly";
|
|
37
|
+
AnalyticsGranularity[AnalyticsGranularity["Daily"] = 6] = "Daily";
|
|
38
|
+
AnalyticsGranularity[AnalyticsGranularity["Hourly"] = 7] = "Hourly";
|
|
39
|
+
return AnalyticsGranularity;
|
|
40
|
+
}({});
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region analytics/analytics-path.ts
|
|
43
|
+
var AnalyticsPath = class AnalyticsPath {
|
|
44
|
+
get segments() {
|
|
45
|
+
return this._segments;
|
|
46
|
+
}
|
|
47
|
+
_segments;
|
|
48
|
+
static fromString(path) {
|
|
49
|
+
return new AnalyticsPath(parseSeparatedList(path, "/").map((segment) => AnalyticsPathSegment.fromString(segment)));
|
|
50
|
+
}
|
|
51
|
+
static fromStringArray(segments) {
|
|
52
|
+
return new AnalyticsPath(segments.map((segment) => AnalyticsPathSegment.fromString(segment)));
|
|
53
|
+
}
|
|
54
|
+
static fromArray(segments) {
|
|
55
|
+
return new AnalyticsPath(segments);
|
|
56
|
+
}
|
|
57
|
+
static fromJSON(json) {
|
|
58
|
+
return new AnalyticsPath(json._v.split("/").map((segment) => AnalyticsPathSegment.fromString(segment)));
|
|
59
|
+
}
|
|
60
|
+
constructor(segments) {
|
|
61
|
+
this._segments = segments;
|
|
62
|
+
}
|
|
63
|
+
toJSON() {
|
|
64
|
+
return {
|
|
65
|
+
_t: AnalyticsSerializerTypes.AnalyticsPath,
|
|
66
|
+
_v: this.toString()
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
toString(tail = "") {
|
|
70
|
+
return this._segments.map((s) => s.toString()).join("/") + tail;
|
|
71
|
+
}
|
|
72
|
+
firstSegment() {
|
|
73
|
+
return this._segments.length > 0 ? this._segments[0] : new AnalyticsPathSegment();
|
|
74
|
+
}
|
|
75
|
+
reduce() {
|
|
76
|
+
const result = this._segments.slice(1);
|
|
77
|
+
if (result.length < 1) result.push(new AnalyticsPathSegment());
|
|
78
|
+
return new AnalyticsPath(result);
|
|
79
|
+
}
|
|
80
|
+
applyLod(levelOfDetail) {
|
|
81
|
+
const segments = [...this._segments];
|
|
82
|
+
while (segments.length < levelOfDetail) segments.push(new AnalyticsPathSegment());
|
|
83
|
+
return new AnalyticsPath(segments.slice(0, levelOfDetail));
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var AnalyticsPathSegment = class AnalyticsPathSegment {
|
|
87
|
+
get filters() {
|
|
88
|
+
return this._filters;
|
|
89
|
+
}
|
|
90
|
+
get groups() {
|
|
91
|
+
return this._groups;
|
|
92
|
+
}
|
|
93
|
+
_filters = null;
|
|
94
|
+
_groups = null;
|
|
95
|
+
static fromString(segment) {
|
|
96
|
+
const elements = parseSeparatedList(segment, ":");
|
|
97
|
+
let filtersArg;
|
|
98
|
+
if (elements[0] === "*") filtersArg = null;
|
|
99
|
+
else filtersArg = parseSeparatedList(elements[0], ",").map((f) => AnalyticsPathSegment.unescape(f));
|
|
100
|
+
let groupsArg;
|
|
101
|
+
if (elements[1] === void 0 || elements[1].length < 1) groupsArg = [];
|
|
102
|
+
else if (elements[1] === "*") groupsArg = null;
|
|
103
|
+
else groupsArg = parseSeparatedList(elements[1], ",").map((g) => AnalyticsPathSegment.unescape(g));
|
|
104
|
+
return new AnalyticsPathSegment(filtersArg, groupsArg);
|
|
105
|
+
}
|
|
106
|
+
static escape(segment) {
|
|
107
|
+
return segment.replace(/(\\|:|\/|,)/gi, "\\$1");
|
|
108
|
+
}
|
|
109
|
+
static unescape(segment) {
|
|
110
|
+
return segment.replace(/\\(.)/gi, "$1");
|
|
111
|
+
}
|
|
112
|
+
constructor(filters = null, groups = []) {
|
|
113
|
+
this._filters = filters;
|
|
114
|
+
this._groups = groups;
|
|
115
|
+
}
|
|
116
|
+
toJSON() {
|
|
117
|
+
return {
|
|
118
|
+
_t: AnalyticsSerializerTypes.AnalyticsPathSegment,
|
|
119
|
+
_v: this.toString()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
toString() {
|
|
123
|
+
let result = "";
|
|
124
|
+
if (this._filters === null) result += "*";
|
|
125
|
+
else result += this._filters.map((f) => AnalyticsPathSegment.escape(f)).join(",");
|
|
126
|
+
if (this._groups === null) result += ":*";
|
|
127
|
+
else if (this._groups.length > 0) result += ":" + this._groups.map((g) => AnalyticsPathSegment.escape(g)).join(",");
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const unescapedSeparatorPattern = {
|
|
132
|
+
":": /(?<!\\):/,
|
|
133
|
+
",": /(?<!\\),/,
|
|
134
|
+
"/": /(?<!\\)\//
|
|
135
|
+
};
|
|
136
|
+
function parseSeparatedList(list, separator) {
|
|
137
|
+
let substituteString = "@@";
|
|
138
|
+
while (list.indexOf(substituteString) > -1) substituteString += "@";
|
|
139
|
+
return list.replaceAll("\\\\", substituteString).split(unescapedSeparatorPattern[separator]).map((e) => e.replaceAll(substituteString, "\\\\"));
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region analytics/analytics-period.ts
|
|
143
|
+
var AnalyticsPeriod = class AnalyticsPeriod {
|
|
144
|
+
get type() {
|
|
145
|
+
return this._type;
|
|
146
|
+
}
|
|
147
|
+
get year() {
|
|
148
|
+
return this._year;
|
|
149
|
+
}
|
|
150
|
+
get quarter() {
|
|
151
|
+
return this._quarter;
|
|
152
|
+
}
|
|
153
|
+
get month() {
|
|
154
|
+
return this._month;
|
|
155
|
+
}
|
|
156
|
+
_type = AnalyticsPeriodType.Year;
|
|
157
|
+
_year = 1970;
|
|
158
|
+
_quarter = null;
|
|
159
|
+
_month = null;
|
|
160
|
+
toJSON() {
|
|
161
|
+
return {
|
|
162
|
+
_t: AnalyticsSerializerTypes.AnalyticsPeriod,
|
|
163
|
+
_v: this.toString()
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
static fromString(period) {
|
|
167
|
+
let result;
|
|
168
|
+
if (period.length === 4) result = new AnalyticsPeriod(Number.parseInt(period));
|
|
169
|
+
else if (period.length === 7) if (period[4] !== "/") throw new Error(`Invalid period string: '${period}'`);
|
|
170
|
+
else if (period[5] === "Q") result = new AnalyticsPeriod(Number.parseInt(period.slice(0, 4)), Number.parseInt(period[6]));
|
|
171
|
+
else result = new AnalyticsPeriod(Number.parseInt(period.slice(0, 4)), void 0, Number.parseInt(period.slice(5)));
|
|
172
|
+
else throw new Error(`Invalid period string: '${period}'`);
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
static fillRange(p1, p2) {
|
|
176
|
+
const obj1 = typeof p1 === "string" ? AnalyticsPeriod.fromString(p1) : p1, obj2 = typeof p2 === "string" ? AnalyticsPeriod.fromString(p2) : p2;
|
|
177
|
+
if (obj1.type !== obj2.type) throw new Error(`Cannot fill range of different type periods ${obj1.toString()} and ${obj2.toString()}.`);
|
|
178
|
+
const [first, last] = obj1.comesBefore(obj2) ? [obj1, obj2] : [obj2, obj1];
|
|
179
|
+
const result = [first];
|
|
180
|
+
let next = first.nextPeriod();
|
|
181
|
+
while (next.comesBefore(last)) {
|
|
182
|
+
result.push(next);
|
|
183
|
+
next = next.nextPeriod();
|
|
184
|
+
}
|
|
185
|
+
if (!last.equals(first)) result.push(last);
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
static normalizeQuarters(year, quarter) {
|
|
189
|
+
return [
|
|
190
|
+
year + Math.floor((quarter - 1) / 4),
|
|
191
|
+
moduloButWithoutBugs(quarter - 1, 4) + 1,
|
|
192
|
+
void 0
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
static normalizeMonths(year, month) {
|
|
196
|
+
const newYear = year + Math.floor((month - 1) / 12);
|
|
197
|
+
const newMonth = moduloButWithoutBugs(month - 1, 12) + 1;
|
|
198
|
+
return [
|
|
199
|
+
newYear,
|
|
200
|
+
Math.floor((newMonth - 1) / 3) + 1,
|
|
201
|
+
newMonth
|
|
202
|
+
];
|
|
203
|
+
}
|
|
204
|
+
constructor(year, quarter, month) {
|
|
205
|
+
this._initAsYear(year);
|
|
206
|
+
if (quarter !== void 0) this._initAsQuarter(quarter);
|
|
207
|
+
if (month !== void 0) this._initAsMonth(month);
|
|
208
|
+
}
|
|
209
|
+
equals(period) {
|
|
210
|
+
return this.toString() === (typeof period === "string" ? period : period.toString());
|
|
211
|
+
}
|
|
212
|
+
toString() {
|
|
213
|
+
let result = this._year + (this._type === AnalyticsPeriodType.Year ? "" : "/");
|
|
214
|
+
if (this._type === AnalyticsPeriodType.Quarter) result += "Q" + this._quarter;
|
|
215
|
+
else if (this._type === AnalyticsPeriodType.Month) {
|
|
216
|
+
if (this._month < 10) result += "0";
|
|
217
|
+
result += this._month;
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
startAsSqlDate() {
|
|
222
|
+
let result = this._year + "-";
|
|
223
|
+
switch (this._type) {
|
|
224
|
+
case AnalyticsPeriodType.Month:
|
|
225
|
+
result += (this._month < 10 ? "0" : "") + this.month;
|
|
226
|
+
break;
|
|
227
|
+
case AnalyticsPeriodType.Quarter: {
|
|
228
|
+
const firstMonth = (this._quarter - 1) * 3 + 1;
|
|
229
|
+
result += (firstMonth < 10 ? "0" : "") + firstMonth;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
case AnalyticsPeriodType.Year:
|
|
233
|
+
result += "01";
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
return result + "-01";
|
|
237
|
+
}
|
|
238
|
+
comesAfter(period) {
|
|
239
|
+
return this._start() > period._end();
|
|
240
|
+
}
|
|
241
|
+
comesBefore(period) {
|
|
242
|
+
return period._start() > this._end();
|
|
243
|
+
}
|
|
244
|
+
contains(period) {
|
|
245
|
+
return this._start() <= period._start() && this._end() >= period._end();
|
|
246
|
+
}
|
|
247
|
+
firstMonth() {
|
|
248
|
+
let month = this._month || 1;
|
|
249
|
+
if (this._type === AnalyticsPeriodType.Quarter) month = (this._quarter - 1) * 3 + 1;
|
|
250
|
+
return new AnalyticsPeriod(this._year, void 0, month);
|
|
251
|
+
}
|
|
252
|
+
lastMonth() {
|
|
253
|
+
let month = this._month || 12;
|
|
254
|
+
if (this._type === AnalyticsPeriodType.Quarter) month = this._quarter * 3;
|
|
255
|
+
return new AnalyticsPeriod(this._year, void 0, month);
|
|
256
|
+
}
|
|
257
|
+
nextPeriod(n = 1) {
|
|
258
|
+
return this._addPeriods(n);
|
|
259
|
+
}
|
|
260
|
+
previousPeriod(n = 1) {
|
|
261
|
+
return this._addPeriods(-n);
|
|
262
|
+
}
|
|
263
|
+
_start() {
|
|
264
|
+
return this._getNumericComparator(false);
|
|
265
|
+
}
|
|
266
|
+
_end() {
|
|
267
|
+
return this._getNumericComparator(true);
|
|
268
|
+
}
|
|
269
|
+
_getNumericComparator(endOfPeriod) {
|
|
270
|
+
const defaultQuarter = endOfPeriod ? 4 : 1, defaultMonth = ((this._quarter || defaultQuarter) - 1) * 3 + (endOfPeriod ? 3 : 1);
|
|
271
|
+
return this._year * 1e3 + (this._quarter || defaultQuarter) * 100 + (this._month || defaultMonth);
|
|
272
|
+
}
|
|
273
|
+
_addPeriods(periods) {
|
|
274
|
+
let result;
|
|
275
|
+
if (this._type === AnalyticsPeriodType.Year) result = new AnalyticsPeriod(this._year + periods);
|
|
276
|
+
else if (this._type === AnalyticsPeriodType.Quarter) {
|
|
277
|
+
const [y, q] = AnalyticsPeriod.normalizeQuarters(this._year, this._quarter + periods);
|
|
278
|
+
result = new AnalyticsPeriod(y, q);
|
|
279
|
+
} else {
|
|
280
|
+
const [y, _, m] = AnalyticsPeriod.normalizeMonths(this._year, this._month + periods);
|
|
281
|
+
result = new AnalyticsPeriod(y, void 0, m);
|
|
282
|
+
}
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
_initAsYear(year) {
|
|
286
|
+
if (year < 1970 || year > 2100) throw new Error(`Invalid period year: '${year}'`);
|
|
287
|
+
this._year = year;
|
|
288
|
+
}
|
|
289
|
+
_initAsQuarter(quarter) {
|
|
290
|
+
if (quarter < 1 || quarter > 4) throw new Error(`Invalid period quarter: ${quarter}`);
|
|
291
|
+
this._quarter = quarter;
|
|
292
|
+
this._type = AnalyticsPeriodType.Quarter;
|
|
293
|
+
}
|
|
294
|
+
_initAsMonth(month) {
|
|
295
|
+
if (month < 1 || month > 12) throw new Error(`Invalid period month: ${month}`);
|
|
296
|
+
if (this.quarter == null) this._initAsQuarter(Math.floor((month - 1) / 3) + 1);
|
|
297
|
+
else if (this.quarter !== Math.floor((month - 1) / 3) + 1) throw new Error(`Period month ${month} outside of quarter ${this.quarter}`);
|
|
298
|
+
this._month = month;
|
|
299
|
+
this._type = AnalyticsPeriodType.Month;
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
function moduloButWithoutBugs(base, n) {
|
|
303
|
+
return (base % n + n) % n;
|
|
304
|
+
}
|
|
305
|
+
//#endregion
|
|
306
|
+
export { AnalyticsGranularity, AnalyticsMetric, AnalyticsPath, AnalyticsPathSegment, AnalyticsPeriod, AnalyticsPeriodType, AnalyticsSerializerTypes, CompoundOperator };
|
|
307
|
+
|
|
5
308
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../analytics/constants.ts","../../analytics/analytics-path.ts","../../analytics/analytics-period.ts"],"sourcesContent":["export enum AnalyticsSerializerTypes {\n AnalyticsPath,\n AnalyticsPathSegment,\n AnalyticsPeriod,\n}\n\nexport enum AnalyticsPeriodType {\n Year,\n Quarter,\n Month,\n}\n\nexport enum AnalyticsMetric {\n Budget,\n Forecast,\n Actuals,\n PaymentsOnChain,\n PaymentsOffChainIncluded,\n FTEs,\n}\nexport enum CompoundOperator {\n VectorAdd,\n VectorSubtract,\n ScalarMultiply,\n ScalarDivide,\n}\nexport enum AnalyticsGranularity {\n Total,\n Annual,\n SemiAnnual,\n Quarterly,\n Monthly,\n Weekly,\n Daily,\n Hourly,\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { AnalyticsSerializerTypes } from \"./constants.js\";\n\nexport class AnalyticsPath {\n get segments(): AnalyticsPathSegment[] {\n return this._segments;\n }\n\n private _segments: AnalyticsPathSegment[];\n\n public static fromString(path: string): AnalyticsPath {\n const segments = parseSeparatedList(path, \"/\").map((segment) =>\n AnalyticsPathSegment.fromString(segment),\n );\n\n return new AnalyticsPath(segments);\n }\n\n public static fromStringArray(segments: string[]): AnalyticsPath {\n return new AnalyticsPath(\n segments.map((segment) => AnalyticsPathSegment.fromString(segment)),\n );\n }\n\n public static fromArray(segments: AnalyticsPathSegment[]): AnalyticsPath {\n return new AnalyticsPath(segments);\n }\n\n public static fromJSON(json: any): AnalyticsPath {\n const segments = json._v\n .split(\"/\")\n .map((segment: string) => AnalyticsPathSegment.fromString(segment));\n return new AnalyticsPath(segments);\n }\n\n constructor(segments: AnalyticsPathSegment[]) {\n this._segments = segments;\n }\n\n public toJSON() {\n return {\n _t: AnalyticsSerializerTypes.AnalyticsPath,\n _v: this.toString(),\n };\n }\n\n public toString(tail: string = \"\"): string {\n return this._segments.map((s) => s.toString()).join(\"/\") + tail;\n }\n\n public firstSegment(): AnalyticsPathSegment {\n return this._segments.length > 0\n ? this._segments[0]\n : new AnalyticsPathSegment();\n }\n\n public reduce(): AnalyticsPath {\n const result = this._segments.slice(1);\n\n if (result.length < 1) {\n result.push(new AnalyticsPathSegment());\n }\n\n return new AnalyticsPath(result);\n }\n\n public applyLod(levelOfDetail: number): AnalyticsPath {\n const segments = [...this._segments];\n\n while (segments.length < levelOfDetail) {\n segments.push(new AnalyticsPathSegment());\n }\n\n return new AnalyticsPath(segments.slice(0, levelOfDetail));\n }\n}\n\nexport class AnalyticsPathSegment {\n get filters(): NullableStrings {\n return this._filters;\n }\n get groups(): NullableStrings {\n return this._groups;\n }\n\n private _filters: NullableStrings = null;\n private _groups: NullableStrings = null;\n\n public static fromString(segment: string): AnalyticsPathSegment {\n const elements = parseSeparatedList(segment, \":\");\n\n let filtersArg: NullableStrings;\n if (elements[0] === \"*\") {\n filtersArg = null;\n } else {\n filtersArg = parseSeparatedList(elements[0], \",\").map((f) =>\n AnalyticsPathSegment.unescape(f),\n );\n }\n\n let groupsArg: NullableStrings;\n if (elements[1] === undefined || elements[1].length < 1) {\n groupsArg = [];\n } else if (elements[1] === \"*\") {\n groupsArg = null;\n } else {\n groupsArg = parseSeparatedList(elements[1], \",\").map((g) =>\n AnalyticsPathSegment.unescape(g),\n );\n }\n\n return new AnalyticsPathSegment(filtersArg, groupsArg);\n }\n\n public static escape(segment: string): string {\n // Put a backslash in front of the control characters \\ : / and ,\n return segment.replace(/(\\\\|:|\\/|,)/gi, \"\\\\$1\");\n }\n\n public static unescape(segment: string): string {\n // Remove backslashes in front of any character\n return segment.replace(/\\\\(.)/gi, \"$1\");\n }\n\n constructor(filters: NullableStrings = null, groups: NullableStrings = []) {\n this._filters = filters;\n this._groups = groups;\n }\n\n public toJSON() {\n return {\n _t: AnalyticsSerializerTypes.AnalyticsPathSegment,\n _v: this.toString(),\n };\n }\n\n public toString(): string {\n let result = \"\";\n\n if (this._filters === null) {\n result += \"*\";\n } else {\n result += this._filters\n .map((f) => AnalyticsPathSegment.escape(f))\n .join(\",\");\n }\n\n if (this._groups === null) {\n result += \":*\";\n } else if (this._groups.length > 0) {\n result +=\n \":\" + this._groups.map((g) => AnalyticsPathSegment.escape(g)).join(\",\");\n }\n\n return result;\n }\n}\n\ntype NullableStrings = string[] | null;\ntype PathSeparator = \"/\" | \":\" | \",\";\n\n// Defining constant regexes instead of dynamic patterns for compiler optimization\nconst unescapedSeparatorPattern = {\n \":\": /(?<!\\\\):/,\n \",\": /(?<!\\\\),/,\n \"/\": /(?<!\\\\)\\//,\n};\n\nfunction parseSeparatedList(list: string, separator: PathSeparator): string[] {\n /*\n The basic mechanism is that we split the string by commas that \n aren't escaped with a backslash, using the unescapedSeparatorPattern:\n\n - abc,def becomes ['abc', 'def']\n - abc\\,def becomes ['abc,def']\n\n However, we need to deal with an edge case where the backslash \n itself is escaped with a backslash:\n \n - abc\\\\,def must result in ['abc\\\\', 'def']\n - whereas unescapedCommaPattern would result in ['abc\\\\,def']\n\n For this edge case, we are first replacing all double backslashes with @@\n\n - abc\\\\,def is first transformed to abc@@,def\n - unescapedCommaPattern would now result in ['abc@@', 'def']\n - substituting @@ with \\\\ again now gives the intended result ['abc\\\\', 'def']\n\n However, we still want to support the literal string @@ in the input too.\n So, instead of always using @@ as a replacement, we're going to determine a unique \n string first by adding as many @ as needed. \n \n - If the original string has @@ in it, we'll use @@@\n - If the original string has @@ and @@@ in it, we'll use @@@@\n - Etc.\n */\n\n let substituteString = \"@@\";\n while (list.indexOf(substituteString) > -1) {\n substituteString += \"@\";\n }\n\n return list\n .replaceAll(\"\\\\\\\\\", substituteString)\n .split(unescapedSeparatorPattern[separator])\n .map((e) => e.replaceAll(substituteString, \"\\\\\\\\\"));\n}\n","import { AnalyticsPeriodType, AnalyticsSerializerTypes } from \"./constants.js\";\n\nexport class AnalyticsPeriod {\n get type(): AnalyticsPeriodType {\n return this._type;\n }\n get year(): number {\n return this._year;\n }\n get quarter(): number | null {\n return this._quarter;\n }\n get month(): number | null {\n return this._month;\n }\n\n private _type: AnalyticsPeriodType = AnalyticsPeriodType.Year;\n private _year: number = 1970;\n private _quarter: number | null = null;\n private _month: number | null = null;\n\n public toJSON() {\n return {\n _t: AnalyticsSerializerTypes.AnalyticsPeriod,\n _v: this.toString(),\n };\n }\n\n public static fromString(period: string): AnalyticsPeriod {\n let result: AnalyticsPeriod;\n\n if (period.length === 4) {\n result = new AnalyticsPeriod(Number.parseInt(period));\n } else if (period.length === 7) {\n if (period[4] !== \"/\") {\n throw new Error(`Invalid period string: '${period}'`);\n } else if (period[5] === \"Q\") {\n result = new AnalyticsPeriod(\n Number.parseInt(period.slice(0, 4)),\n Number.parseInt(period[6]),\n );\n } else {\n result = new AnalyticsPeriod(\n Number.parseInt(period.slice(0, 4)),\n undefined,\n Number.parseInt(period.slice(5)),\n );\n }\n } else {\n throw new Error(`Invalid period string: '${period}'`);\n }\n\n return result;\n }\n\n public static fillRange(\n p1: AnalyticsPeriod | string,\n p2: AnalyticsPeriod | string,\n ): AnalyticsPeriod[] {\n const obj1 = typeof p1 === \"string\" ? AnalyticsPeriod.fromString(p1) : p1,\n obj2 = typeof p2 === \"string\" ? AnalyticsPeriod.fromString(p2) : p2;\n\n if (obj1.type !== obj2.type) {\n throw new Error(\n `Cannot fill range of different type periods ${obj1.toString()} and ${obj2.toString()}.`,\n );\n }\n\n const [first, last] = obj1.comesBefore(obj2) ? [obj1, obj2] : [obj2, obj1];\n const result = [first];\n\n let next = first.nextPeriod();\n while (next.comesBefore(last)) {\n result.push(next);\n next = next.nextPeriod();\n }\n\n if (!last.equals(first)) {\n result.push(last);\n }\n\n return result;\n }\n\n public static normalizeQuarters(year: number, quarter: number): PeriodTriple {\n const newYear = year + Math.floor((quarter - 1) / 4);\n const newQuarter = moduloButWithoutBugs(quarter - 1, 4) + 1;\n return [newYear, newQuarter, undefined];\n }\n\n public static normalizeMonths(year: number, month: number): PeriodTriple {\n const newYear = year + Math.floor((month - 1) / 12);\n const newMonth = moduloButWithoutBugs(month - 1, 12) + 1;\n const newQuarter = Math.floor((newMonth - 1) / 3) + 1;\n return [newYear, newQuarter, newMonth];\n }\n\n public constructor(year: number, quarter?: number, month?: number) {\n this._initAsYear(year);\n\n if (quarter !== undefined) {\n this._initAsQuarter(quarter);\n }\n\n if (month !== undefined) {\n this._initAsMonth(month);\n }\n }\n\n public equals(period: AnalyticsPeriod | string): boolean {\n return (\n this.toString() ===\n (typeof period === \"string\" ? period : period.toString())\n );\n }\n\n public toString(): string {\n let result =\n this._year + (this._type === AnalyticsPeriodType.Year ? \"\" : \"/\");\n\n if (this._type === AnalyticsPeriodType.Quarter) {\n result += \"Q\" + this._quarter;\n } else if (this._type === AnalyticsPeriodType.Month) {\n if ((this._month as number) < 10) {\n result += \"0\";\n }\n result += this._month;\n }\n\n return result;\n }\n\n public startAsSqlDate(): string {\n let result = this._year + \"-\";\n\n switch (this._type) {\n case AnalyticsPeriodType.Month:\n result += ((this._month as number) < 10 ? \"0\" : \"\") + this.month;\n break;\n\n case AnalyticsPeriodType.Quarter: {\n const firstMonth = ((this._quarter as number) - 1) * 3 + 1;\n result += ((firstMonth as number) < 10 ? \"0\" : \"\") + firstMonth;\n break;\n }\n\n case AnalyticsPeriodType.Year:\n result += \"01\";\n break;\n }\n\n return result + \"-01\";\n }\n\n public comesAfter(period: AnalyticsPeriod): boolean {\n return this._start() > period._end();\n }\n\n public comesBefore(period: AnalyticsPeriod): boolean {\n return period._start() > this._end();\n }\n\n public contains(period: AnalyticsPeriod): boolean {\n return this._start() <= period._start() && this._end() >= period._end();\n }\n\n public firstMonth(): AnalyticsPeriod {\n let month: number = this._month || 1;\n\n if (this._type === AnalyticsPeriodType.Quarter) {\n month = ((this._quarter as number) - 1) * 3 + 1;\n }\n\n return new AnalyticsPeriod(this._year, undefined, month);\n }\n\n public lastMonth(): AnalyticsPeriod {\n let month: number = this._month || 12;\n\n if (this._type === AnalyticsPeriodType.Quarter) {\n month = (this._quarter as number) * 3;\n }\n\n return new AnalyticsPeriod(this._year, undefined, month);\n }\n\n public nextPeriod(n: number = 1): AnalyticsPeriod {\n return this._addPeriods(n);\n }\n\n public previousPeriod(n: number = 1): AnalyticsPeriod {\n return this._addPeriods(-n);\n }\n\n private _start(): number {\n return this._getNumericComparator(false);\n }\n\n private _end(): number {\n return this._getNumericComparator(true);\n }\n\n private _getNumericComparator(endOfPeriod: boolean): number {\n const defaultQuarter = endOfPeriod ? 4 : 1,\n defaultMonth =\n ((this._quarter || defaultQuarter) - 1) * 3 + (endOfPeriod ? 3 : 1),\n result =\n this._year * 1000 +\n (this._quarter || defaultQuarter) * 100 +\n (this._month || defaultMonth);\n\n return result;\n }\n\n private _addPeriods(periods: number): AnalyticsPeriod {\n let result: AnalyticsPeriod;\n\n if (this._type === AnalyticsPeriodType.Year) {\n result = new AnalyticsPeriod(this._year + periods);\n } else if (this._type === AnalyticsPeriodType.Quarter) {\n const [y, q] = AnalyticsPeriod.normalizeQuarters(\n this._year,\n (this._quarter as number) + periods,\n );\n result = new AnalyticsPeriod(y, q);\n } else {\n const [y, _, m] = AnalyticsPeriod.normalizeMonths(\n this._year,\n (this._month as number) + periods,\n );\n result = new AnalyticsPeriod(y, undefined, m);\n }\n\n return result;\n }\n\n private _initAsYear(year: number) {\n if (year < 1970 || year > 2100) {\n throw new Error(`Invalid period year: '${year}'`);\n }\n\n this._year = year;\n }\n\n private _initAsQuarter(quarter: number) {\n if (quarter < 1 || quarter > 4) {\n throw new Error(`Invalid period quarter: ${quarter}`);\n }\n\n this._quarter = quarter;\n this._type = AnalyticsPeriodType.Quarter;\n }\n\n private _initAsMonth(month: number) {\n if (month < 1 || month > 12) {\n throw new Error(`Invalid period month: ${month}`);\n }\n\n if (this.quarter == null) {\n this._initAsQuarter(Math.floor((month - 1) / 3) + 1);\n } else if (this.quarter !== Math.floor((month - 1) / 3) + 1) {\n throw new Error(\n `Period month ${month} outside of quarter ${this.quarter}`,\n );\n }\n\n this._month = month;\n this._type = AnalyticsPeriodType.Month;\n }\n}\n\n// See https://stackoverflow.com/questions/4467539/javascript-modulo-gives-a-negative-result-for-negative-numbers\nfunction moduloButWithoutBugs(base: number, n: number) {\n return ((base % n) + n) % n;\n}\n\ntype PeriodTriple = [number, number | undefined, number | undefined];\n"],"mappings":"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"}
|