@powerhousedao/analytics-engine-core 0.1.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.
@@ -0,0 +1,9 @@
1
+ import { AnalyticsPath } from "./AnalyticsPath.js";
2
+ import { AnalyticsPeriod } from "./AnalyticsPeriod.js";
3
+ export type AnalyticsQueryResultRow = {
4
+ period: AnalyticsPeriod;
5
+ dimensions: Record<string, AnalyticsPath>;
6
+ currency: string;
7
+ value: number;
8
+ };
9
+ export type AnalyticsQueryResult = Array<AnalyticsQueryResultRow>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AnalyticsQueryResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsQueryResult.js","sourceRoot":"","sources":["../src/AnalyticsQueryResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { DateTime } from "luxon";
2
+ import { AnalyticsGranularity } from "./AnalyticsQuery.js";
3
+ export type AnalyticsRange = {
4
+ start: DateTime;
5
+ end: DateTime;
6
+ granularity: AnalyticsGranularity;
7
+ };
8
+ export type AnalyticsPeriod = {
9
+ period: string;
10
+ start: DateTime;
11
+ end: DateTime;
12
+ };
13
+ interface AnalyticsPeriodSeries {
14
+ start: DateTime;
15
+ end: DateTime;
16
+ granularity: AnalyticsGranularity;
17
+ next(): AnalyticsPeriod | null;
18
+ }
19
+ export declare const getPeriodSeriesArray: (range: AnalyticsRange) => AnalyticsPeriod[];
20
+ export declare const getPeriodSeries: (range: AnalyticsRange) => AnalyticsPeriodSeries;
21
+ export declare const _nextAnnualPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
22
+ export declare const _nextSemiAnnualPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
23
+ export declare const _nextQuarterlyPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
24
+ export declare const _nextMonthlyPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
25
+ export declare const _nextWeeklyPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
26
+ export declare const _nextDailyPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
27
+ export declare const _nextHourlyPeriod: (nextStart: DateTime, seriesEnd: DateTime) => AnalyticsPeriod | null;
28
+ export {};
@@ -0,0 +1,212 @@
1
+ import { DateTime } from "luxon";
2
+ import { AnalyticsGranularity } from "./AnalyticsQuery.js";
3
+ export const getPeriodSeriesArray = (range) => {
4
+ const result = [];
5
+ const series = getPeriodSeries(range);
6
+ let next = series.next();
7
+ while (next) {
8
+ result.push(next);
9
+ next = series.next();
10
+ }
11
+ return result;
12
+ };
13
+ export const getPeriodSeries = (range) => {
14
+ return {
15
+ ...range,
16
+ next: _createFactoryFn(range),
17
+ };
18
+ };
19
+ const _createFactoryFn = (range) => {
20
+ let current = range.start;
21
+ return () => {
22
+ if (current == null) {
23
+ return null;
24
+ }
25
+ let result = null;
26
+ switch (range.granularity) {
27
+ case AnalyticsGranularity.Total:
28
+ result = _nextTotalPeriod(current, range.end);
29
+ break;
30
+ case AnalyticsGranularity.Annual:
31
+ result = _nextAnnualPeriod(current, range.end);
32
+ break;
33
+ case AnalyticsGranularity.SemiAnnual:
34
+ result = _nextSemiAnnualPeriod(current, range.end);
35
+ break;
36
+ case AnalyticsGranularity.Quarterly:
37
+ result = _nextQuarterlyPeriod(current, range.end);
38
+ break;
39
+ case AnalyticsGranularity.Monthly:
40
+ result = _nextMonthlyPeriod(current, range.end);
41
+ break;
42
+ case AnalyticsGranularity.Weekly:
43
+ result = _nextWeeklyPeriod(current, range.end);
44
+ break;
45
+ case AnalyticsGranularity.Daily:
46
+ result = _nextDailyPeriod(current, range.end);
47
+ break;
48
+ case AnalyticsGranularity.Hourly:
49
+ result = _nextHourlyPeriod(current, range.end);
50
+ }
51
+ // Update current to start of next period
52
+ if (result === null) {
53
+ current = null;
54
+ }
55
+ else {
56
+ current = result.end.plus({ milliseconds: 1 });
57
+ }
58
+ return result;
59
+ };
60
+ };
61
+ const _nextTotalPeriod = (nextStart, seriesEnd) => {
62
+ if (seriesEnd <= nextStart) {
63
+ return null;
64
+ }
65
+ return {
66
+ period: "total",
67
+ start: nextStart,
68
+ end: seriesEnd,
69
+ };
70
+ };
71
+ export const _nextAnnualPeriod = (nextStart, seriesEnd) => {
72
+ if (seriesEnd <= nextStart) {
73
+ return null;
74
+ }
75
+ const inputUtc = nextStart.toUTC();
76
+ const oneYearLater = DateTime.utc(inputUtc.year, inputUtc.month, inputUtc.day).plus({ years: 1 });
77
+ return {
78
+ period: "annual",
79
+ start: nextStart,
80
+ end: oneYearLater,
81
+ };
82
+ };
83
+ export const _nextSemiAnnualPeriod = (nextStart, seriesEnd) => {
84
+ if (seriesEnd <= nextStart) {
85
+ return null;
86
+ }
87
+ const midYear = DateTime.utc(nextStart.year, 7, 1);
88
+ const endYear = DateTime.utc(nextStart.year, 12, 31, 23, 59, 59, 999);
89
+ let endDate;
90
+ if (midYear > nextStart) {
91
+ endDate = midYear;
92
+ }
93
+ else {
94
+ endDate = endYear;
95
+ }
96
+ if (endDate > seriesEnd) {
97
+ endDate = seriesEnd;
98
+ }
99
+ return {
100
+ period: "semiAnnual",
101
+ start: nextStart,
102
+ end: endDate,
103
+ };
104
+ };
105
+ export const _nextQuarterlyPeriod = (nextStart, seriesEnd) => {
106
+ if (seriesEnd <= nextStart) {
107
+ return null;
108
+ }
109
+ let endDate;
110
+ const nextStartUtc = nextStart.toUTC();
111
+ const startMonth = nextStartUtc.month;
112
+ if (startMonth < 3) {
113
+ endDate = DateTime.utc(nextStartUtc.year, 4, 1);
114
+ }
115
+ else if (startMonth < 6) {
116
+ endDate = DateTime.utc(nextStartUtc.year, 7, 1);
117
+ }
118
+ else if (startMonth < 9) {
119
+ endDate = DateTime.utc(nextStartUtc.year, 10, 1);
120
+ }
121
+ else {
122
+ endDate = DateTime.utc(nextStartUtc.year, 12, 31, 23, 59, 59, 999);
123
+ }
124
+ if (endDate > seriesEnd) {
125
+ endDate = seriesEnd;
126
+ }
127
+ return {
128
+ period: "quarterly",
129
+ start: nextStart,
130
+ end: endDate,
131
+ };
132
+ };
133
+ export const _nextMonthlyPeriod = (nextStart, seriesEnd) => {
134
+ if (seriesEnd <= nextStart) {
135
+ return null;
136
+ }
137
+ // Get the first day of the next month
138
+ const nextStartUtc = nextStart.toUTC();
139
+ let endDate = DateTime.utc(nextStartUtc.year, nextStartUtc.month, nextStartUtc.day)
140
+ .plus({ months: 1 })
141
+ .startOf("month");
142
+ // If the end date is after the series end, then use the series end as the end date
143
+ if (endDate > seriesEnd) {
144
+ if (!nextStart.hasSame(seriesEnd, "month")) {
145
+ endDate = seriesEnd;
146
+ }
147
+ }
148
+ // Otherwise, return the end date as the first day of the next month
149
+ return {
150
+ period: "monthly",
151
+ start: nextStart,
152
+ end: endDate,
153
+ };
154
+ };
155
+ export const _nextWeeklyPeriod = (nextStart, seriesEnd) => {
156
+ if (seriesEnd <= nextStart) {
157
+ return null;
158
+ }
159
+ // Calculate the start of the next week (Monday)
160
+ const nextStartUtc = nextStart.toUTC();
161
+ const nextWeekStartUTC = DateTime.utc(nextStartUtc.year, nextStartUtc.month, nextStartUtc.day)
162
+ .plus({ weeks: 1 })
163
+ .startOf("week");
164
+ // If the calculated next week start is later or equal to the series end date, return the series end
165
+ if (nextWeekStartUTC > seriesEnd)
166
+ if (!nextWeekStartUTC.hasSame(seriesEnd, "day")) {
167
+ return {
168
+ period: "weekly",
169
+ start: nextStart,
170
+ end: seriesEnd,
171
+ };
172
+ }
173
+ return {
174
+ period: "weekly",
175
+ start: nextStart,
176
+ end: nextWeekStartUTC,
177
+ };
178
+ };
179
+ export const _nextDailyPeriod = (nextStart, seriesEnd) => {
180
+ if (seriesEnd <= nextStart) {
181
+ return null;
182
+ }
183
+ // Set the end date to the start of the next day
184
+ const nextStartUtc = nextStart.toUTC();
185
+ let endDate = nextStartUtc.plus({ days: 1 }).startOf("day");
186
+ if (endDate > seriesEnd || endDate.hasSame(seriesEnd, "day")) {
187
+ endDate = seriesEnd;
188
+ }
189
+ return {
190
+ period: "daily",
191
+ start: nextStart,
192
+ end: endDate,
193
+ };
194
+ };
195
+ export const _nextHourlyPeriod = (nextStart, seriesEnd) => {
196
+ if (seriesEnd <= nextStart) {
197
+ return null;
198
+ }
199
+ const startDate = nextStart.toUTC();
200
+ let endDate = startDate.plus({ hours: 1 });
201
+ if (endDate > seriesEnd) {
202
+ if (nextStart.hour !== seriesEnd.hour) {
203
+ endDate = seriesEnd.toUTC();
204
+ }
205
+ }
206
+ return {
207
+ period: "hourly",
208
+ start: nextStart,
209
+ end: endDate,
210
+ };
211
+ };
212
+ //# sourceMappingURL=AnalyticsTimeSlicer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsTimeSlicer.js","sourceRoot":"","sources":["../src/AnalyticsTimeSlicer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { GroupedPeriodResults } from "./AnalyticsDiscretizer";
2
+ import { AnalyticsQuery } from "./AnalyticsQuery";
3
+ export interface IAnalyticsCache {
4
+ get(query: AnalyticsQuery): Promise<GroupedPeriodResults | null>;
5
+ set(query: AnalyticsQuery, expirySecs?: number): void;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IAnalyticsCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAnalyticsCache.js","sourceRoot":"","sources":["../src/IAnalyticsCache.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { DateTime } from "luxon";
2
+ import { AnalyticsPath } from "./AnalyticsPath.js";
3
+ import { AnalyticsSeries, AnalyticsSeriesQuery } from "./AnalyticsQuery.js";
4
+ export type AnalyticsSeriesInput = {
5
+ start: DateTime;
6
+ end?: DateTime | null;
7
+ source: AnalyticsPath;
8
+ metric: string;
9
+ value: number;
10
+ unit?: string | null;
11
+ fn?: string | null;
12
+ params?: Record<string, any> | null;
13
+ dimensions: Record<string, AnalyticsPath>;
14
+ dimensionMetadata?: Record<string, string>;
15
+ };
16
+ export interface IAnalyticsStore {
17
+ clearSeriesBySource: (source: AnalyticsPath, cleanUpDimensions?: boolean) => Promise<number>;
18
+ clearEmptyAnalyticsDimensions: () => Promise<number>;
19
+ getMatchingSeries: (query: AnalyticsSeriesQuery) => Promise<AnalyticsSeries[]>;
20
+ addSeriesValue: (input: AnalyticsSeriesInput) => Promise<void>;
21
+ addSeriesValues: (inputs: AnalyticsSeriesInput[]) => Promise<void>;
22
+ getDimensions: () => Promise<any>;
23
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IAnalyticsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAnalyticsStore.js","sourceRoot":"","sources":["../src/IAnalyticsStore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export type { IAnalyticsProfiler } from "./AnalyticsProfiler.js";
2
+ export { AnalyticsProfiler, PassthroughAnalyticsProfiler, } from "./AnalyticsProfiler.js";
3
+ export type { IAnalyticsStore, AnalyticsSeriesInput, } from "./IAnalyticsStore.js";
4
+ export { AnalyticsPath, AnalyticsPathSegment } from "./AnalyticsPath.js";
5
+ export type { AnalyticsQuery, AnalyticsSeriesQuery, AnalyticsSeries, AnalyticsDimension, } from "./AnalyticsQuery.js";
6
+ export { AnalyticsGranularity } from "./AnalyticsQuery.js";
7
+ export { AnalyticsQueryEngine } from "./AnalyticsQueryEngine.js";
8
+ export type { GroupedPeriodResult, GroupedPeriodResults, } from "./AnalyticsDiscretizer.js";
9
+ export { AnalyticsSerializerTypes, AnalyticsPeriod, } from "./AnalyticsPeriod.js";
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { AnalyticsProfiler, PassthroughAnalyticsProfiler, } from "./AnalyticsProfiler.js";
2
+ export { AnalyticsPath, AnalyticsPathSegment } from "./AnalyticsPath.js";
3
+ export { AnalyticsGranularity } from "./AnalyticsQuery.js";
4
+ export { AnalyticsQueryEngine } from "./AnalyticsQueryEngine.js";
5
+ export { AnalyticsSerializerTypes, AnalyticsPeriod, } from "./AnalyticsPeriod.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAOzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@powerhousedao/analytics-engine-core",
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0-only",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "dev": "tsc-watch",
16
+ "build": "rm -rf dist/ && tsc",
17
+ "test": "vitest"
18
+ },
19
+ "dependencies": {
20
+ "date-fns": "^3.6.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/luxon": "^3.4.2",
24
+ "@types/node": "^22.4.2",
25
+ "luxon": "^3.5.0",
26
+ "tsc-watch": "^6.2.0",
27
+ "typescript": "^5.6.3",
28
+ "vitest": "^2.0.5"
29
+ }
30
+ }