@coursebuilder/analytics 1.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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/index.d.ts +158 -0
  3. package/dist/api/index.js +317 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/catalog.d.ts +14 -0
  6. package/dist/catalog.js +209 -0
  7. package/dist/catalog.js.map +1 -0
  8. package/dist/components/index.d.ts +172 -0
  9. package/dist/components/index.js +1258 -0
  10. package/dist/components/index.js.map +1 -0
  11. package/dist/engine.d.ts +20 -0
  12. package/dist/engine.js +350 -0
  13. package/dist/engine.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.js +353 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/providers/database.d.ts +79 -0
  18. package/dist/providers/database.js +533 -0
  19. package/dist/providers/database.js.map +1 -0
  20. package/dist/providers/derived.d.ts +45 -0
  21. package/dist/providers/derived.js +32 -0
  22. package/dist/providers/derived.js.map +1 -0
  23. package/dist/providers/ga4.d.ts +43 -0
  24. package/dist/providers/ga4.js +220 -0
  25. package/dist/providers/ga4.js.map +1 -0
  26. package/dist/providers/index.d.ts +8 -0
  27. package/dist/providers/index.js +1239 -0
  28. package/dist/providers/index.js.map +1 -0
  29. package/dist/providers/mux.d.ts +103 -0
  30. package/dist/providers/mux.js +241 -0
  31. package/dist/providers/mux.js.map +1 -0
  32. package/dist/providers/survey.d.ts +102 -0
  33. package/dist/providers/survey.js +233 -0
  34. package/dist/providers/survey.js.map +1 -0
  35. package/dist/types.d.ts +303 -0
  36. package/dist/types.js +1 -0
  37. package/dist/types.js.map +1 -0
  38. package/package.json +101 -0
  39. package/src/api/catalog-handler.ts +321 -0
  40. package/src/api/index.ts +4 -0
  41. package/src/api/token-handler.ts +71 -0
  42. package/src/catalog.ts +223 -0
  43. package/src/components/country-chart.tsx +114 -0
  44. package/src/components/index.ts +5 -0
  45. package/src/components/omnibus-dashboard.tsx +1460 -0
  46. package/src/components/revenue-chart.tsx +251 -0
  47. package/src/components/use-chart-colors.ts +75 -0
  48. package/src/engine.ts +201 -0
  49. package/src/index.ts +7 -0
  50. package/src/providers/database.ts +795 -0
  51. package/src/providers/derived.ts +79 -0
  52. package/src/providers/ga4.ts +173 -0
  53. package/src/providers/index.ts +44 -0
  54. package/src/providers/mux.ts +438 -0
  55. package/src/providers/survey.ts +487 -0
  56. package/src/types.ts +333 -0
@@ -0,0 +1,32 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/providers/derived.ts
5
+ function createDerivedProvider(deps) {
6
+ const { database, ga4 } = deps;
7
+ function toGA4Range(range) {
8
+ if (range === "all")
9
+ return "90d";
10
+ return range;
11
+ }
12
+ __name(toGA4Range, "toGA4Range");
13
+ async function getTrafficRevenueCorrelation(range) {
14
+ const [traffic, revenue] = await Promise.all([
15
+ ga4.getSessionsByDay(toGA4Range(range)),
16
+ database.getRevenueByDay(range)
17
+ ]);
18
+ return {
19
+ traffic,
20
+ revenue
21
+ };
22
+ }
23
+ __name(getTrafficRevenueCorrelation, "getTrafficRevenueCorrelation");
24
+ return {
25
+ getTrafficRevenueCorrelation
26
+ };
27
+ }
28
+ __name(createDerivedProvider, "createDerivedProvider");
29
+ export {
30
+ createDerivedProvider
31
+ };
32
+ //# sourceMappingURL=derived.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/derived.ts"],"sourcesContent":["import type { GA4TimeRange } from './ga4'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AnalyticsRange = '24h' | '7d' | '30d' | '90d' | 'all'\n\nexport interface TrafficRevenueCorrelation {\n\ttraffic: {\n\t\tdate: string\n\t\tsessions: number\n\t\tusers: number\n\t\tpageviews: number\n\t}[]\n\trevenue: {\n\t\tdate: string\n\t\trevenue: number\n\t\tcount: number\n\t}[]\n}\n\nexport interface DerivedProviderDeps {\n\tdatabase: {\n\t\tgetRevenueByDay: (range: AnalyticsRange) => Promise<\n\t\t\t{\n\t\t\t\tdate: string\n\t\t\t\trevenue: number\n\t\t\t\tcount: number\n\t\t\t}[]\n\t\t>\n\t}\n\tga4: {\n\t\tgetSessionsByDay: (range: GA4TimeRange) => Promise<\n\t\t\t{\n\t\t\t\tdate: string\n\t\t\t\tsessions: number\n\t\t\t\tusers: number\n\t\t\t\tpageviews: number\n\t\t\t}[]\n\t\t>\n\t}\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\n/**\n * Creates a derived analytics provider that combines data from multiple\n * sources (database + GA4) to compute correlation metrics.\n *\n * @param deps - Provider dependencies (database and ga4 providers)\n */\nexport function createDerivedProvider(deps: DerivedProviderDeps) {\n\tconst { database, ga4 } = deps\n\n\tfunction toGA4Range(range: AnalyticsRange): GA4TimeRange {\n\t\tif (range === 'all') return '90d'\n\t\treturn range\n\t}\n\n\t/**\n\t * Correlates GA4 traffic sessions by day with revenue by day,\n\t * enabling side-by-side analysis of traffic and revenue trends.\n\t */\n\tasync function getTrafficRevenueCorrelation(\n\t\trange: AnalyticsRange,\n\t): Promise<TrafficRevenueCorrelation> {\n\t\tconst [traffic, revenue] = await Promise.all([\n\t\t\tga4.getSessionsByDay(toGA4Range(range)),\n\t\t\tdatabase.getRevenueByDay(range),\n\t\t])\n\n\t\treturn { traffic, revenue }\n\t}\n\n\treturn {\n\t\tgetTrafficRevenueCorrelation,\n\t}\n}\n\nexport type DerivedAnalyticsProvider = ReturnType<typeof createDerivedProvider>\n"],"mappings":";;;;AAkDO,SAASA,sBAAsBC,MAAyB;AAC9D,QAAM,EAAEC,UAAUC,IAAG,IAAKF;AAE1B,WAASG,WAAWC,OAAqB;AACxC,QAAIA,UAAU;AAAO,aAAO;AAC5B,WAAOA;EACR;AAHSD;AAST,iBAAeE,6BACdD,OAAqB;AAErB,UAAM,CAACE,SAASC,OAAAA,IAAW,MAAMC,QAAQC,IAAI;MAC5CP,IAAIQ,iBAAiBP,WAAWC,KAAAA,CAAAA;MAChCH,SAASU,gBAAgBP,KAAAA;KACzB;AAED,WAAO;MAAEE;MAASC;IAAQ;EAC3B;AATeF;AAWf,SAAO;IACNA;EACD;AACD;AA1BgBN;","names":["createDerivedProvider","deps","database","ga4","toGA4Range","range","getTrafficRevenueCorrelation","traffic","revenue","Promise","all","getSessionsByDay","getRevenueByDay"]}
@@ -0,0 +1,43 @@
1
+ type GA4TimeRange = '24h' | '7d' | '30d' | '90d';
2
+ interface GA4ProviderConfig {
3
+ propertyId: string;
4
+ clientEmail: string;
5
+ privateKey: string;
6
+ }
7
+ /**
8
+ * Creates a GA4 analytics provider with injected credentials.
9
+ * Lazily initializes the BetaAnalyticsDataClient on first use.
10
+ *
11
+ * @param config - GA4 credentials and property configuration
12
+ */
13
+ declare function createGA4Provider(config: GA4ProviderConfig): {
14
+ getTrafficOverview: (range?: GA4TimeRange) => Promise<{
15
+ sessions: number;
16
+ totalUsers: number;
17
+ newUsers: number;
18
+ pageviews: number;
19
+ avgSessionDuration: number;
20
+ bounceRate: number;
21
+ }>;
22
+ getTopPages: (range?: GA4TimeRange, limit?: number) => Promise<{
23
+ path: string;
24
+ pageviews: number;
25
+ users: number;
26
+ avgDuration: number;
27
+ }[]>;
28
+ getTrafficSources: (range?: GA4TimeRange, limit?: number) => Promise<{
29
+ source: string;
30
+ medium: string;
31
+ sessions: number;
32
+ users: number;
33
+ }[]>;
34
+ getSessionsByDay: (range?: GA4TimeRange) => Promise<{
35
+ date: string;
36
+ sessions: number;
37
+ users: number;
38
+ pageviews: number;
39
+ }[]>;
40
+ };
41
+ type GA4AnalyticsProvider = ReturnType<typeof createGA4Provider>;
42
+
43
+ export { type GA4AnalyticsProvider, type GA4ProviderConfig, type GA4TimeRange, createGA4Provider };
@@ -0,0 +1,220 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/providers/ga4.ts
5
+ import { BetaAnalyticsDataClient } from "@google-analytics/data";
6
+ function createGA4Provider(config) {
7
+ const { propertyId, clientEmail, privateKey } = config;
8
+ let _client = null;
9
+ function getClient() {
10
+ if (!_client) {
11
+ _client = new BetaAnalyticsDataClient({
12
+ credentials: {
13
+ client_email: clientEmail,
14
+ private_key: privateKey.replace(/\\n/g, "\n")
15
+ }
16
+ });
17
+ }
18
+ return _client;
19
+ }
20
+ __name(getClient, "getClient");
21
+ function rangeToDateRange(range) {
22
+ const map = {
23
+ "24h": "1daysAgo",
24
+ "7d": "7daysAgo",
25
+ "30d": "30daysAgo",
26
+ "90d": "90daysAgo"
27
+ };
28
+ return {
29
+ startDate: map[range],
30
+ endDate: "today"
31
+ };
32
+ }
33
+ __name(rangeToDateRange, "rangeToDateRange");
34
+ async function getTrafficOverview(range = "30d") {
35
+ const client = getClient();
36
+ const [response] = await client.runReport({
37
+ property: `properties/${propertyId}`,
38
+ dateRanges: [
39
+ rangeToDateRange(range)
40
+ ],
41
+ metrics: [
42
+ {
43
+ name: "sessions"
44
+ },
45
+ {
46
+ name: "totalUsers"
47
+ },
48
+ {
49
+ name: "newUsers"
50
+ },
51
+ {
52
+ name: "screenPageViews"
53
+ },
54
+ {
55
+ name: "averageSessionDuration"
56
+ },
57
+ {
58
+ name: "bounceRate"
59
+ }
60
+ ]
61
+ });
62
+ const row = response?.rows?.[0];
63
+ if (!row) {
64
+ return {
65
+ sessions: 0,
66
+ totalUsers: 0,
67
+ newUsers: 0,
68
+ pageviews: 0,
69
+ avgSessionDuration: 0,
70
+ bounceRate: 0
71
+ };
72
+ }
73
+ return {
74
+ sessions: Number(row.metricValues?.[0]?.value ?? 0),
75
+ totalUsers: Number(row.metricValues?.[1]?.value ?? 0),
76
+ newUsers: Number(row.metricValues?.[2]?.value ?? 0),
77
+ pageviews: Number(row.metricValues?.[3]?.value ?? 0),
78
+ avgSessionDuration: Number(row.metricValues?.[4]?.value ?? 0),
79
+ bounceRate: Number(row.metricValues?.[5]?.value ?? 0)
80
+ };
81
+ }
82
+ __name(getTrafficOverview, "getTrafficOverview");
83
+ async function getTopPages(range = "30d", limit = 20) {
84
+ const client = getClient();
85
+ const [response] = await client.runReport({
86
+ property: `properties/${propertyId}`,
87
+ dateRanges: [
88
+ rangeToDateRange(range)
89
+ ],
90
+ dimensions: [
91
+ {
92
+ name: "pagePath"
93
+ }
94
+ ],
95
+ metrics: [
96
+ {
97
+ name: "screenPageViews"
98
+ },
99
+ {
100
+ name: "totalUsers"
101
+ },
102
+ {
103
+ name: "averageSessionDuration"
104
+ }
105
+ ],
106
+ orderBys: [
107
+ {
108
+ metric: {
109
+ metricName: "screenPageViews"
110
+ },
111
+ desc: true
112
+ }
113
+ ],
114
+ limit
115
+ });
116
+ return response?.rows?.map((row) => ({
117
+ path: row.dimensionValues?.[0]?.value ?? "",
118
+ pageviews: Number(row.metricValues?.[0]?.value ?? 0),
119
+ users: Number(row.metricValues?.[1]?.value ?? 0),
120
+ avgDuration: Number(row.metricValues?.[2]?.value ?? 0)
121
+ })) ?? [];
122
+ }
123
+ __name(getTopPages, "getTopPages");
124
+ async function getTrafficSources(range = "30d", limit = 15) {
125
+ const client = getClient();
126
+ const [response] = await client.runReport({
127
+ property: `properties/${propertyId}`,
128
+ dateRanges: [
129
+ rangeToDateRange(range)
130
+ ],
131
+ dimensions: [
132
+ {
133
+ name: "sessionSource"
134
+ },
135
+ {
136
+ name: "sessionMedium"
137
+ }
138
+ ],
139
+ metrics: [
140
+ {
141
+ name: "sessions"
142
+ },
143
+ {
144
+ name: "totalUsers"
145
+ }
146
+ ],
147
+ orderBys: [
148
+ {
149
+ metric: {
150
+ metricName: "sessions"
151
+ },
152
+ desc: true
153
+ }
154
+ ],
155
+ limit
156
+ });
157
+ return response?.rows?.map((row) => ({
158
+ source: row.dimensionValues?.[0]?.value ?? "(direct)",
159
+ medium: row.dimensionValues?.[1]?.value ?? "(none)",
160
+ sessions: Number(row.metricValues?.[0]?.value ?? 0),
161
+ users: Number(row.metricValues?.[1]?.value ?? 0)
162
+ })) ?? [];
163
+ }
164
+ __name(getTrafficSources, "getTrafficSources");
165
+ async function getSessionsByDay(range = "30d") {
166
+ const client = getClient();
167
+ const [response] = await client.runReport({
168
+ property: `properties/${propertyId}`,
169
+ dateRanges: [
170
+ rangeToDateRange(range)
171
+ ],
172
+ dimensions: [
173
+ {
174
+ name: "date"
175
+ }
176
+ ],
177
+ metrics: [
178
+ {
179
+ name: "sessions"
180
+ },
181
+ {
182
+ name: "totalUsers"
183
+ },
184
+ {
185
+ name: "screenPageViews"
186
+ }
187
+ ],
188
+ orderBys: [
189
+ {
190
+ dimension: {
191
+ dimensionName: "date"
192
+ },
193
+ desc: false
194
+ }
195
+ ]
196
+ });
197
+ return response?.rows?.map((row) => {
198
+ const raw = row.dimensionValues?.[0]?.value ?? "";
199
+ const date = `${raw.slice(0, 4)}-${raw.slice(4, 6)}-${raw.slice(6, 8)}`;
200
+ return {
201
+ date,
202
+ sessions: Number(row.metricValues?.[0]?.value ?? 0),
203
+ users: Number(row.metricValues?.[1]?.value ?? 0),
204
+ pageviews: Number(row.metricValues?.[2]?.value ?? 0)
205
+ };
206
+ }) ?? [];
207
+ }
208
+ __name(getSessionsByDay, "getSessionsByDay");
209
+ return {
210
+ getTrafficOverview,
211
+ getTopPages,
212
+ getTrafficSources,
213
+ getSessionsByDay
214
+ };
215
+ }
216
+ __name(createGA4Provider, "createGA4Provider");
217
+ export {
218
+ createGA4Provider
219
+ };
220
+ //# sourceMappingURL=ga4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/ga4.ts"],"sourcesContent":["import { BetaAnalyticsDataClient } from '@google-analytics/data'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type GA4TimeRange = '24h' | '7d' | '30d' | '90d'\n\nexport interface GA4ProviderConfig {\n\tpropertyId: string\n\tclientEmail: string\n\tprivateKey: string\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\n/**\n * Creates a GA4 analytics provider with injected credentials.\n * Lazily initializes the BetaAnalyticsDataClient on first use.\n *\n * @param config - GA4 credentials and property configuration\n */\nexport function createGA4Provider(config: GA4ProviderConfig) {\n\tconst { propertyId, clientEmail, privateKey } = config\n\n\tlet _client: BetaAnalyticsDataClient | null = null\n\n\tfunction getClient(): BetaAnalyticsDataClient {\n\t\tif (!_client) {\n\t\t\t_client = new BetaAnalyticsDataClient({\n\t\t\t\tcredentials: {\n\t\t\t\t\tclient_email: clientEmail,\n\t\t\t\t\tprivate_key: privateKey.replace(/\\\\n/g, '\\n'),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\treturn _client\n\t}\n\n\tfunction rangeToDateRange(range: GA4TimeRange) {\n\t\tconst map: Record<GA4TimeRange, string> = {\n\t\t\t'24h': '1daysAgo',\n\t\t\t'7d': '7daysAgo',\n\t\t\t'30d': '30daysAgo',\n\t\t\t'90d': '90daysAgo',\n\t\t}\n\t\treturn { startDate: map[range], endDate: 'today' }\n\t}\n\n\t// ─── Reports ──────────────────────────────────────────────────────────────\n\n\tasync function getTrafficOverview(range: GA4TimeRange = '30d') {\n\t\tconst client = getClient()\n\n\t\tconst [response] = await client.runReport({\n\t\t\tproperty: `properties/${propertyId}`,\n\t\t\tdateRanges: [rangeToDateRange(range)],\n\t\t\tmetrics: [\n\t\t\t\t{ name: 'sessions' },\n\t\t\t\t{ name: 'totalUsers' },\n\t\t\t\t{ name: 'newUsers' },\n\t\t\t\t{ name: 'screenPageViews' },\n\t\t\t\t{ name: 'averageSessionDuration' },\n\t\t\t\t{ name: 'bounceRate' },\n\t\t\t],\n\t\t})\n\n\t\tconst row = response?.rows?.[0]\n\t\tif (!row) {\n\t\t\treturn {\n\t\t\t\tsessions: 0,\n\t\t\t\ttotalUsers: 0,\n\t\t\t\tnewUsers: 0,\n\t\t\t\tpageviews: 0,\n\t\t\t\tavgSessionDuration: 0,\n\t\t\t\tbounceRate: 0,\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessions: Number(row.metricValues?.[0]?.value ?? 0),\n\t\t\ttotalUsers: Number(row.metricValues?.[1]?.value ?? 0),\n\t\t\tnewUsers: Number(row.metricValues?.[2]?.value ?? 0),\n\t\t\tpageviews: Number(row.metricValues?.[3]?.value ?? 0),\n\t\t\tavgSessionDuration: Number(row.metricValues?.[4]?.value ?? 0),\n\t\t\tbounceRate: Number(row.metricValues?.[5]?.value ?? 0),\n\t\t}\n\t}\n\n\tasync function getTopPages(range: GA4TimeRange = '30d', limit = 20) {\n\t\tconst client = getClient()\n\n\t\tconst [response] = await client.runReport({\n\t\t\tproperty: `properties/${propertyId}`,\n\t\t\tdateRanges: [rangeToDateRange(range)],\n\t\t\tdimensions: [{ name: 'pagePath' }],\n\t\t\tmetrics: [\n\t\t\t\t{ name: 'screenPageViews' },\n\t\t\t\t{ name: 'totalUsers' },\n\t\t\t\t{ name: 'averageSessionDuration' },\n\t\t\t],\n\t\t\torderBys: [{ metric: { metricName: 'screenPageViews' }, desc: true }],\n\t\t\tlimit,\n\t\t})\n\n\t\treturn (\n\t\t\tresponse?.rows?.map((row) => ({\n\t\t\t\tpath: row.dimensionValues?.[0]?.value ?? '',\n\t\t\t\tpageviews: Number(row.metricValues?.[0]?.value ?? 0),\n\t\t\t\tusers: Number(row.metricValues?.[1]?.value ?? 0),\n\t\t\t\tavgDuration: Number(row.metricValues?.[2]?.value ?? 0),\n\t\t\t})) ?? []\n\t\t)\n\t}\n\n\tasync function getTrafficSources(range: GA4TimeRange = '30d', limit = 15) {\n\t\tconst client = getClient()\n\n\t\tconst [response] = await client.runReport({\n\t\t\tproperty: `properties/${propertyId}`,\n\t\t\tdateRanges: [rangeToDateRange(range)],\n\t\t\tdimensions: [{ name: 'sessionSource' }, { name: 'sessionMedium' }],\n\t\t\tmetrics: [{ name: 'sessions' }, { name: 'totalUsers' }],\n\t\t\torderBys: [{ metric: { metricName: 'sessions' }, desc: true }],\n\t\t\tlimit,\n\t\t})\n\n\t\treturn (\n\t\t\tresponse?.rows?.map((row) => ({\n\t\t\t\tsource: row.dimensionValues?.[0]?.value ?? '(direct)',\n\t\t\t\tmedium: row.dimensionValues?.[1]?.value ?? '(none)',\n\t\t\t\tsessions: Number(row.metricValues?.[0]?.value ?? 0),\n\t\t\t\tusers: Number(row.metricValues?.[1]?.value ?? 0),\n\t\t\t})) ?? []\n\t\t)\n\t}\n\n\tasync function getSessionsByDay(range: GA4TimeRange = '30d') {\n\t\tconst client = getClient()\n\n\t\tconst [response] = await client.runReport({\n\t\t\tproperty: `properties/${propertyId}`,\n\t\t\tdateRanges: [rangeToDateRange(range)],\n\t\t\tdimensions: [{ name: 'date' }],\n\t\t\tmetrics: [\n\t\t\t\t{ name: 'sessions' },\n\t\t\t\t{ name: 'totalUsers' },\n\t\t\t\t{ name: 'screenPageViews' },\n\t\t\t],\n\t\t\torderBys: [{ dimension: { dimensionName: 'date' }, desc: false }],\n\t\t})\n\n\t\treturn (\n\t\t\tresponse?.rows?.map((row) => {\n\t\t\t\tconst raw = row.dimensionValues?.[0]?.value ?? ''\n\t\t\t\tconst date = `${raw.slice(0, 4)}-${raw.slice(4, 6)}-${raw.slice(6, 8)}`\n\t\t\t\treturn {\n\t\t\t\t\tdate,\n\t\t\t\t\tsessions: Number(row.metricValues?.[0]?.value ?? 0),\n\t\t\t\t\tusers: Number(row.metricValues?.[1]?.value ?? 0),\n\t\t\t\t\tpageviews: Number(row.metricValues?.[2]?.value ?? 0),\n\t\t\t\t}\n\t\t\t}) ?? []\n\t\t)\n\t}\n\n\treturn {\n\t\tgetTrafficOverview,\n\t\tgetTopPages,\n\t\tgetTrafficSources,\n\t\tgetSessionsByDay,\n\t}\n}\n\nexport type GA4AnalyticsProvider = ReturnType<typeof createGA4Provider>\n"],"mappings":"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","names":["BetaAnalyticsDataClient","createGA4Provider","config","propertyId","clientEmail","privateKey","_client","getClient","BetaAnalyticsDataClient","credentials","client_email","private_key","replace","rangeToDateRange","range","map","startDate","endDate","getTrafficOverview","client","response","runReport","property","dateRanges","metrics","name","row","rows","sessions","totalUsers","newUsers","pageviews","avgSessionDuration","bounceRate","Number","metricValues","value","getTopPages","limit","dimensions","orderBys","metric","metricName","desc","path","dimensionValues","users","avgDuration","getTrafficSources","source","medium","getSessionsByDay","dimension","dimensionName","raw","date","slice"]}
@@ -0,0 +1,8 @@
1
+ export { AnalyticsProvider, ProviderMap } from '../engine.js';
2
+ export { AnalyticsTimeRange, AttributionTrail, AttributionTrailEvent, DatabaseAnalyticsProvider, DatabaseAnalyticsSchema, createDatabaseProvider } from './database.js';
3
+ export { GA4AnalyticsProvider, GA4ProviderConfig, GA4TimeRange, createGA4Provider } from './ga4.js';
4
+ export { AnalyticsRange, DerivedAnalyticsProvider, DerivedProviderDeps, TrafficRevenueCorrelation, createDerivedProvider } from './derived.js';
5
+ export { MuxAnalyticsProvider, MuxBreakdownItem, MuxBreakdownResponse, MuxDbDeps, MuxOverallResponse, MuxProviderConfig, MuxTimeseriesResponse, TimeRange, VideoDashboardData, VideoDetailBreakdowns, VideoTableRange, createMuxProvider } from './mux.js';
6
+ export { SurveyAnalyticsProvider, createSurveyProvider } from './survey.js';
7
+ import '../types.js';
8
+ import '../catalog.js';