@guinetik/primitives-ts 0.10.0 → 0.11.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.
@@ -48,4 +48,56 @@ export interface AnalyticsReport {
48
48
  totals: AnalyticsReportTotals;
49
49
  topPages: AnalyticsTopPageRow[];
50
50
  }
51
+ /** Whether a dashboard card loaded. */
52
+ export type AnalyticsCardStatus = 'ok' | 'error';
53
+ /** Persisted card definition (no metrics). */
54
+ export interface AnalyticsDashboardCardConfig {
55
+ /** Admin API resource name, e.g. `properties/123456`. */
56
+ propertyId: string;
57
+ displayName: string;
58
+ /** Admin API resource name, e.g. `accounts/123`. */
59
+ accountId: string;
60
+ order: number;
61
+ }
62
+ /** Percent change per metric versus the previous equal-length window. */
63
+ export interface AnalyticsTotalsDelta {
64
+ activeUsers: number;
65
+ sessions: number;
66
+ screenPageViews: number;
67
+ }
68
+ /** One rendered card. Metrics are absent when `status` is `'error'`. */
69
+ export interface AnalyticsDashboardCard extends AnalyticsDashboardCardConfig {
70
+ status: AnalyticsCardStatus;
71
+ totals?: AnalyticsReportTotals;
72
+ previous?: AnalyticsReportTotals;
73
+ delta?: AnalyticsTotalsDelta;
74
+ /** Sanitised reason; present only when `status` is `'error'`. */
75
+ reason?: string;
76
+ }
77
+ /**
78
+ * Daily `activeUsers` per property. `dates` is shared by every series;
79
+ * each array aligns to it index-for-index. A failed property has no entry.
80
+ */
81
+ export interface AnalyticsDashboardSeries {
82
+ /** ISO `yyyy-mm-dd`, ascending. */
83
+ dates: string[];
84
+ byProperty: Record<string, number[]>;
85
+ }
86
+ /** Batch dashboard payload. */
87
+ export interface AnalyticsDashboard {
88
+ dateRangePreset: AnalyticsDateRangePreset;
89
+ /** Resolved ISO date, not a GA relative token. */
90
+ startDate: string;
91
+ endDate: string;
92
+ cards: AnalyticsDashboardCard[];
93
+ series: AnalyticsDashboardSeries;
94
+ }
95
+ /**
96
+ * Percent change between two windows, rounded to one decimal.
97
+ * A zero previous window yields 0 when current is also 0, else 100.
98
+ *
99
+ * @param current - Metric total for the selected window.
100
+ * @param previous - Metric total for the preceding equal-length window.
101
+ */
102
+ export declare function percentChange(current: number, previous: number): number;
51
103
  //# sourceMappingURL=analytics.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.types.d.ts","sourceRoot":"","sources":["../src/analytics.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,MAAM,MAAM,wBAAwB,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAE5D,iEAAiE;AACjE,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,wBAAwB,CAAC;CAC3C;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,wBAAwB,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC"}
1
+ {"version":3,"file":"analytics.types.d.ts","sourceRoot":"","sources":["../src/analytics.types.ts"],"names":[],"mappings":"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"}
@@ -4,3 +4,17 @@
4
4
  * Refresh tokens never appear in these types.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.percentChange = percentChange;
8
+ /**
9
+ * Percent change between two windows, rounded to one decimal.
10
+ * A zero previous window yields 0 when current is also 0, else 100.
11
+ *
12
+ * @param current - Metric total for the selected window.
13
+ * @param previous - Metric total for the preceding equal-length window.
14
+ */
15
+ function percentChange(current, previous) {
16
+ if (previous === 0) {
17
+ return current === 0 ? 0 : 100;
18
+ }
19
+ return Math.round(((current - previous) / previous) * 1000) / 10;
20
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analytics.types.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.types.spec.d.ts","sourceRoot":"","sources":["../src/analytics.types.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const analytics_types_1 = require("./analytics.types");
4
+ describe('percentChange', () => {
5
+ it('computes a positive change', () => {
6
+ expect((0, analytics_types_1.percentChange)(110, 100)).toBe(10);
7
+ });
8
+ it('computes a negative change', () => {
9
+ expect((0, analytics_types_1.percentChange)(90, 100)).toBe(-10);
10
+ });
11
+ it('rounds to one decimal place', () => {
12
+ expect((0, analytics_types_1.percentChange)(103, 97)).toBe(6.2);
13
+ });
14
+ it('returns 0 when both windows are zero', () => {
15
+ expect((0, analytics_types_1.percentChange)(0, 0)).toBe(0);
16
+ });
17
+ it('returns 100 when the previous window was zero and there is now traffic', () => {
18
+ expect((0, analytics_types_1.percentChange)(5, 0)).toBe(100);
19
+ });
20
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guinetik/primitives-ts",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Shared TypeScript primitives for Guinetik projects",
5
5
  "author": "Guinetik",
6
6
  "license": "MIT",