@iann29/rastro 0.1.0-alpha.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 (126) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +352 -0
  3. package/assets/rastro-live-atlas.png +0 -0
  4. package/dist/client/_generated/_ignore.d.ts +1 -0
  5. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  6. package/dist/client/_generated/_ignore.js +3 -0
  7. package/dist/client/_generated/_ignore.js.map +1 -0
  8. package/dist/client/index.d.ts +960 -0
  9. package/dist/client/index.d.ts.map +1 -0
  10. package/dist/client/index.js +591 -0
  11. package/dist/client/index.js.map +1 -0
  12. package/dist/component/_generated/api.d.ts +60 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -0
  14. package/dist/component/_generated/api.js +31 -0
  15. package/dist/component/_generated/api.js.map +1 -0
  16. package/dist/component/_generated/component.d.ts +569 -0
  17. package/dist/component/_generated/component.d.ts.map +1 -0
  18. package/dist/component/_generated/component.js +11 -0
  19. package/dist/component/_generated/component.js.map +1 -0
  20. package/dist/component/_generated/dataModel.d.ts +46 -0
  21. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  22. package/dist/component/_generated/dataModel.js +11 -0
  23. package/dist/component/_generated/dataModel.js.map +1 -0
  24. package/dist/component/_generated/server.d.ts +133 -0
  25. package/dist/component/_generated/server.d.ts.map +1 -0
  26. package/dist/component/_generated/server.js +80 -0
  27. package/dist/component/_generated/server.js.map +1 -0
  28. package/dist/component/affiliates.d.ts +28 -0
  29. package/dist/component/affiliates.d.ts.map +1 -0
  30. package/dist/component/affiliates.js +110 -0
  31. package/dist/component/affiliates.js.map +1 -0
  32. package/dist/component/constants.d.ts +28 -0
  33. package/dist/component/constants.d.ts.map +1 -0
  34. package/dist/component/constants.js +28 -0
  35. package/dist/component/constants.js.map +1 -0
  36. package/dist/component/convex.config.d.ts +3 -0
  37. package/dist/component/convex.config.d.ts.map +1 -0
  38. package/dist/component/convex.config.js +3 -0
  39. package/dist/component/convex.config.js.map +1 -0
  40. package/dist/component/errors.d.ts +3 -0
  41. package/dist/component/errors.d.ts.map +1 -0
  42. package/dist/component/errors.js +5 -0
  43. package/dist/component/errors.js.map +1 -0
  44. package/dist/component/funnels.d.ts +36 -0
  45. package/dist/component/funnels.d.ts.map +1 -0
  46. package/dist/component/funnels.js +117 -0
  47. package/dist/component/funnels.js.map +1 -0
  48. package/dist/component/goals.d.ts +30 -0
  49. package/dist/component/goals.d.ts.map +1 -0
  50. package/dist/component/goals.js +110 -0
  51. package/dist/component/goals.js.map +1 -0
  52. package/dist/component/guards.d.ts +2 -0
  53. package/dist/component/guards.d.ts.map +1 -0
  54. package/dist/component/guards.js +4 -0
  55. package/dist/component/guards.js.map +1 -0
  56. package/dist/component/http.d.ts +3 -0
  57. package/dist/component/http.d.ts.map +1 -0
  58. package/dist/component/http.js +270 -0
  59. package/dist/component/http.js.map +1 -0
  60. package/dist/component/ingest.d.ts +51 -0
  61. package/dist/component/ingest.d.ts.map +1 -0
  62. package/dist/component/ingest.js +991 -0
  63. package/dist/component/ingest.js.map +1 -0
  64. package/dist/component/live.d.ts +9 -0
  65. package/dist/component/live.d.ts.map +1 -0
  66. package/dist/component/live.js +36 -0
  67. package/dist/component/live.js.map +1 -0
  68. package/dist/component/reports.d.ts +330 -0
  69. package/dist/component/reports.d.ts.map +1 -0
  70. package/dist/component/reports.js +595 -0
  71. package/dist/component/reports.js.map +1 -0
  72. package/dist/component/retention.d.ts +10 -0
  73. package/dist/component/retention.d.ts.map +1 -0
  74. package/dist/component/retention.js +107 -0
  75. package/dist/component/retention.js.map +1 -0
  76. package/dist/component/sanitize.d.ts +20 -0
  77. package/dist/component/sanitize.d.ts.map +1 -0
  78. package/dist/component/sanitize.js +269 -0
  79. package/dist/component/sanitize.js.map +1 -0
  80. package/dist/component/schema.d.ts +517 -0
  81. package/dist/component/schema.d.ts.map +1 -0
  82. package/dist/component/schema.js +209 -0
  83. package/dist/component/schema.js.map +1 -0
  84. package/dist/component/sites.d.ts +54 -0
  85. package/dist/component/sites.d.ts.map +1 -0
  86. package/dist/component/sites.js +164 -0
  87. package/dist/component/sites.js.map +1 -0
  88. package/dist/component/validators.d.ts +377 -0
  89. package/dist/component/validators.d.ts.map +1 -0
  90. package/dist/component/validators.js +176 -0
  91. package/dist/component/validators.js.map +1 -0
  92. package/dist/react/index.d.ts +40 -0
  93. package/dist/react/index.d.ts.map +1 -0
  94. package/dist/react/index.js +31 -0
  95. package/dist/react/index.js.map +1 -0
  96. package/dist/tracker/generated.d.ts +5 -0
  97. package/dist/tracker/generated.d.ts.map +1 -0
  98. package/dist/tracker/generated.js +6 -0
  99. package/dist/tracker/generated.js.map +1 -0
  100. package/dist/tracker/tracker.d.ts +27 -0
  101. package/dist/tracker/tracker.d.ts.map +1 -0
  102. package/dist/tracker/tracker.js +108 -0
  103. package/dist/tracker/tracker.js.map +1 -0
  104. package/dist/tracker.min.js +1 -0
  105. package/package.json +121 -0
  106. package/src/component/_generated/api.ts +76 -0
  107. package/src/component/_generated/component.ts +706 -0
  108. package/src/component/_generated/dataModel.ts +60 -0
  109. package/src/component/_generated/server.ts +169 -0
  110. package/src/component/affiliates.ts +119 -0
  111. package/src/component/constants.ts +28 -0
  112. package/src/component/convex.config.ts +3 -0
  113. package/src/component/errors.ts +20 -0
  114. package/src/component/funnels.ts +134 -0
  115. package/src/component/goals.ts +122 -0
  116. package/src/component/guards.ts +3 -0
  117. package/src/component/http.ts +301 -0
  118. package/src/component/ingest.ts +1364 -0
  119. package/src/component/live.ts +36 -0
  120. package/src/component/reports.ts +720 -0
  121. package/src/component/retention.ts +180 -0
  122. package/src/component/sanitize.ts +278 -0
  123. package/src/component/schema.ts +232 -0
  124. package/src/component/sites.ts +188 -0
  125. package/src/component/validators.ts +226 -0
  126. package/src/test.ts +19 -0
@@ -0,0 +1,960 @@
1
+ import type { FunctionArgs, FunctionReturnType, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
2
+ import type { ComponentApi } from "../component/_generated/component.js";
3
+ import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator } from "../component/validators.js";
4
+ export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, };
5
+ export type { EventProperties, EventType, FunnelStep, IngestContext, TrackerEvent, } from "../component/validators.js";
6
+ export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
7
+ export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
8
+ export type UpdateSiteInput = FunctionArgs<ComponentApi["sites"]["update"]>;
9
+ export type UpdateSiteOutput = FunctionReturnType<ComponentApi["sites"]["update"]>;
10
+ export type Site = NonNullable<FunctionReturnType<ComponentApi["sites"]["get"]>>;
11
+ export type ListSitesInput = FunctionArgs<ComponentApi["sites"]["listByOwner"]>;
12
+ export type ListSitesOutput = FunctionReturnType<ComponentApi["sites"]["listByOwner"]>;
13
+ export type IngestInput = FunctionArgs<ComponentApi["ingest"]["ingestBatch"]>;
14
+ export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatch"]>;
15
+ export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
16
+ export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
17
+ export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
18
+ export type Overview = FunctionReturnType<ComponentApi["reports"]["overview"]>;
19
+ export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
20
+ export type LiveVisitor = FunctionReturnType<ComponentApi["reports"]["liveVisitors"]>[number];
21
+ export type ListSessionsInput = FunctionArgs<ComponentApi["reports"]["listSessions"]>;
22
+ export type SessionsPage = FunctionReturnType<ComponentApi["reports"]["listSessions"]>;
23
+ export type SessionJourneyInput = FunctionArgs<ComponentApi["reports"]["sessionJourney"]>;
24
+ export type EventsPage = FunctionReturnType<ComponentApi["reports"]["sessionJourney"]>;
25
+ export type ListConversionsInput = FunctionArgs<ComponentApi["reports"]["listConversions"]>;
26
+ export type ConversionsPage = FunctionReturnType<ComponentApi["reports"]["listConversions"]>;
27
+ export type VisitorJourneyInput = FunctionArgs<ComponentApi["reports"]["visitorJourney"]>;
28
+ export type VisitorJourney = FunctionReturnType<ComponentApi["reports"]["visitorJourney"]>;
29
+ export type GoalsReportInput = FunctionArgs<ComponentApi["reports"]["goalsReport"]>;
30
+ export type GoalsReport = FunctionReturnType<ComponentApi["reports"]["goalsReport"]>;
31
+ export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsReport"]>;
32
+ export type FunnelsReport = FunctionReturnType<ComponentApi["reports"]["funnelsReport"]>;
33
+ export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
34
+ export type AffiliatesReport = FunctionReturnType<ComponentApi["reports"]["affiliatesReport"]>;
35
+ export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
36
+ export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
37
+ export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
38
+ export type UpsertFunnelInput = FunctionArgs<ComponentApi["funnels"]["upsert"]>;
39
+ export type UpsertFunnelOutput = FunctionReturnType<ComponentApi["funnels"]["upsert"]>;
40
+ export type Funnel = FunctionReturnType<ComponentApi["funnels"]["list"]>[number];
41
+ export type UpsertAffiliateInput = FunctionArgs<ComponentApi["affiliates"]["upsert"]>;
42
+ export type UpsertAffiliateOutput = FunctionReturnType<ComponentApi["affiliates"]["upsert"]>;
43
+ export type Affiliate = FunctionReturnType<ComponentApi["affiliates"]["list"]>[number];
44
+ export type CleanupInput = FunctionArgs<ComponentApi["retention"]["cleanup"]>;
45
+ export type CleanupOutput = FunctionReturnType<ComponentApi["retention"]["cleanup"]>;
46
+ export declare class Rastro {
47
+ private readonly component;
48
+ constructor(component: ComponentApi);
49
+ createSite(ctx: MutationCtx, args: CreateSiteInput): Promise<string>;
50
+ updateSite(ctx: MutationCtx, args: UpdateSiteInput): Promise<null>;
51
+ getSite(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
52
+ _creationTime: number;
53
+ _id: string;
54
+ cookieless: boolean;
55
+ createdAt: number;
56
+ currency?: string;
57
+ domains: Array<string>;
58
+ name: string;
59
+ networkId?: string;
60
+ ownerId: string;
61
+ timezone?: string;
62
+ updatedAt: number;
63
+ } | null>;
64
+ listSites(ctx: QueryCtx | MutationCtx | ActionCtx, args: ListSitesInput): Promise<{
65
+ _creationTime: number;
66
+ _id: string;
67
+ cookieless: boolean;
68
+ createdAt: number;
69
+ currency?: string;
70
+ domains: Array<string>;
71
+ name: string;
72
+ networkId?: string;
73
+ ownerId: string;
74
+ timezone?: string;
75
+ updatedAt: number;
76
+ }[]>;
77
+ ingest(ctx: MutationCtx, args: IngestInput): Promise<{
78
+ accepted: number;
79
+ duplicates: number;
80
+ rejected: number;
81
+ }>;
82
+ trackConversion(ctx: MutationCtx, args: TrackConversionInput): Promise<{
83
+ accepted: number;
84
+ duplicates: number;
85
+ rejected: number;
86
+ }>;
87
+ overview(ctx: QueryCtx | MutationCtx | ActionCtx, args: OverviewInput): Promise<{
88
+ currency: string;
89
+ from: number;
90
+ interval: "hour" | "day";
91
+ timeSeries: Array<{
92
+ clicks: number;
93
+ conversions: number;
94
+ customEvents: number;
95
+ events: number;
96
+ outboundClicks: number;
97
+ pageviews: number;
98
+ revenueCents: number;
99
+ sessions: number;
100
+ timestamp: number;
101
+ visitors: number;
102
+ }>;
103
+ to: number;
104
+ topBrowsers: Array<{
105
+ count: number;
106
+ revenueCents: number;
107
+ value: string;
108
+ }>;
109
+ topCountries: Array<{
110
+ count: number;
111
+ revenueCents: number;
112
+ value: string;
113
+ }>;
114
+ topDevices: Array<{
115
+ count: number;
116
+ revenueCents: number;
117
+ value: string;
118
+ }>;
119
+ topEvents: Array<{
120
+ count: number;
121
+ revenueCents: number;
122
+ value: string;
123
+ }>;
124
+ topGoals: Array<{
125
+ count: number;
126
+ revenueCents: number;
127
+ value: string;
128
+ }>;
129
+ topPages: Array<{
130
+ count: number;
131
+ revenueCents: number;
132
+ value: string;
133
+ }>;
134
+ topSources: Array<{
135
+ count: number;
136
+ revenueCents: number;
137
+ value: string;
138
+ }>;
139
+ totals: {
140
+ clicks: number;
141
+ conversions: number;
142
+ customEvents: number;
143
+ events: number;
144
+ outboundClicks: number;
145
+ pageviews: number;
146
+ revenueCents: number;
147
+ sessions: number;
148
+ visitors: number;
149
+ };
150
+ }>;
151
+ liveVisitors(ctx: QueryCtx | MutationCtx | ActionCtx, args: LiveVisitorsInput): Promise<{
152
+ _creationTime: number;
153
+ _id: string;
154
+ browser: string;
155
+ city?: string;
156
+ country?: string;
157
+ device: string;
158
+ eventCount: number;
159
+ expiresAt: number;
160
+ lastSeenAt: number;
161
+ latitude?: number;
162
+ longitude?: number;
163
+ os: string;
164
+ pageviewCount: number;
165
+ path: string;
166
+ sessionId: string;
167
+ siteId: string;
168
+ source: string;
169
+ startedAt: number;
170
+ visitorId: string;
171
+ }[]>;
172
+ listSessions(ctx: QueryCtx | MutationCtx | ActionCtx, args: ListSessionsInput): Promise<{
173
+ continueCursor: string;
174
+ isDone: boolean;
175
+ page: Array<{
176
+ _creationTime: number;
177
+ _id: string;
178
+ affiliateAttributedAt?: number;
179
+ affiliateExpiresAt?: number;
180
+ affiliateId?: string;
181
+ affiliateSlug?: string;
182
+ browser: string;
183
+ city?: string;
184
+ conversionCount: number;
185
+ country?: string;
186
+ currency?: string;
187
+ device: string;
188
+ durationMs: number;
189
+ entryPath: string;
190
+ eventCount: number;
191
+ exitPath: string;
192
+ lastSeenAt: number;
193
+ latitude?: number;
194
+ longitude?: number;
195
+ os: string;
196
+ pageviewCount: number;
197
+ referrer?: string;
198
+ revenueCents: number;
199
+ sessionId: string;
200
+ siteId: string;
201
+ source: string;
202
+ startedAt: number;
203
+ utmCampaign?: string;
204
+ utmMedium?: string;
205
+ utmSource?: string;
206
+ visitorId: string;
207
+ }>;
208
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
209
+ splitCursor?: string | null;
210
+ }>;
211
+ sessionJourney(ctx: QueryCtx | MutationCtx | ActionCtx, args: SessionJourneyInput): Promise<{
212
+ continueCursor: string;
213
+ isDone: boolean;
214
+ page: Array<{
215
+ _creationTime: number;
216
+ _id: string;
217
+ affiliateSlug?: string;
218
+ browser: string;
219
+ city?: string;
220
+ country?: string;
221
+ currency?: string;
222
+ device: string;
223
+ eventId: string;
224
+ href?: string;
225
+ latitude?: number;
226
+ longitude?: number;
227
+ name?: string;
228
+ os: string;
229
+ path: string;
230
+ properties?: Record<string, string | number | boolean | null>;
231
+ referrer?: string;
232
+ revenueCents?: number;
233
+ sequence: number;
234
+ sessionId: string;
235
+ siteId: string;
236
+ target?: string;
237
+ timestamp: number;
238
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
239
+ visitorId: string;
240
+ }>;
241
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
242
+ splitCursor?: string | null;
243
+ }>;
244
+ listConversions(ctx: QueryCtx | MutationCtx | ActionCtx, args: ListConversionsInput): Promise<{
245
+ continueCursor: string;
246
+ isDone: boolean;
247
+ page: Array<{
248
+ _creationTime: number;
249
+ _id: string;
250
+ affiliateAttributedAt?: number;
251
+ affiliateExpiresAt?: number;
252
+ affiliateId?: string;
253
+ affiliateSlug?: string;
254
+ commissionCents: number;
255
+ currency: string;
256
+ eventId: string;
257
+ goalKey?: string;
258
+ path: string;
259
+ revenueCents: number;
260
+ sessionId: string;
261
+ siteId: string;
262
+ source: "tracker" | "trusted";
263
+ timestamp: number;
264
+ visitorId: string;
265
+ }>;
266
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
267
+ splitCursor?: string | null;
268
+ }>;
269
+ visitorJourney(ctx: QueryCtx | MutationCtx | ActionCtx, args: VisitorJourneyInput): Promise<{
270
+ _creationTime: number;
271
+ _id: string;
272
+ affiliateSlug?: string;
273
+ browser: string;
274
+ city?: string;
275
+ country?: string;
276
+ currency?: string;
277
+ device: string;
278
+ eventId: string;
279
+ href?: string;
280
+ latitude?: number;
281
+ longitude?: number;
282
+ name?: string;
283
+ os: string;
284
+ path: string;
285
+ properties?: Record<string, string | number | boolean | null>;
286
+ referrer?: string;
287
+ revenueCents?: number;
288
+ sequence: number;
289
+ sessionId: string;
290
+ siteId: string;
291
+ target?: string;
292
+ timestamp: number;
293
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
294
+ visitorId: string;
295
+ }[]>;
296
+ goalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: GoalsReportInput): Promise<{
297
+ goals: Array<{
298
+ _creationTime: number;
299
+ _id: string;
300
+ active: boolean;
301
+ completions: number;
302
+ createdAt: number;
303
+ key: string;
304
+ matchType: "pageview" | "custom";
305
+ matchValue: string;
306
+ name: string;
307
+ siteId: string;
308
+ updatedAt: number;
309
+ valueCents: number;
310
+ }>;
311
+ truncated: boolean;
312
+ }>;
313
+ funnelsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: FunnelsReportInput): Promise<{
314
+ _creationTime: number;
315
+ _id: string;
316
+ active: boolean;
317
+ conversionWindowMs: number;
318
+ createdAt: number;
319
+ key: string;
320
+ name: string;
321
+ siteId: string;
322
+ steps: Array<{
323
+ name: string;
324
+ type: "pageview" | "custom";
325
+ value: string;
326
+ }>;
327
+ stepsReport: Array<{
328
+ completions: number;
329
+ entrants: number;
330
+ name: string;
331
+ step: number;
332
+ }>;
333
+ truncated: boolean;
334
+ updatedAt: number;
335
+ }[]>;
336
+ affiliatesReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: AffiliatesReportInput): Promise<{
337
+ affiliates: Array<{
338
+ _creationTime: number;
339
+ _id: string;
340
+ active: boolean;
341
+ attributionWindowDays: number;
342
+ commissionBps: number;
343
+ commissionCents: number;
344
+ conversions: number;
345
+ createdAt: number;
346
+ name: string;
347
+ revenueCents: number;
348
+ siteId: string;
349
+ slug: string;
350
+ uniqueVisitors: number;
351
+ updatedAt: number;
352
+ visits: number;
353
+ }>;
354
+ truncated: boolean;
355
+ }>;
356
+ upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
357
+ listGoals(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
358
+ _creationTime: number;
359
+ _id: string;
360
+ active: boolean;
361
+ createdAt: number;
362
+ key: string;
363
+ matchType: "pageview" | "custom";
364
+ matchValue: string;
365
+ name: string;
366
+ siteId: string;
367
+ updatedAt: number;
368
+ valueCents?: number;
369
+ }[]>;
370
+ removeGoal(ctx: MutationCtx, siteId: string, goalId: string): Promise<null>;
371
+ upsertFunnel(ctx: MutationCtx, args: UpsertFunnelInput): Promise<string>;
372
+ listFunnels(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
373
+ _creationTime: number;
374
+ _id: string;
375
+ active: boolean;
376
+ conversionWindowMs: number;
377
+ createdAt: number;
378
+ key: string;
379
+ name: string;
380
+ siteId: string;
381
+ steps: Array<{
382
+ name: string;
383
+ type: "pageview" | "custom";
384
+ value: string;
385
+ }>;
386
+ updatedAt: number;
387
+ }[]>;
388
+ removeFunnel(ctx: MutationCtx, siteId: string, funnelId: string): Promise<null>;
389
+ upsertAffiliate(ctx: MutationCtx, args: UpsertAffiliateInput): Promise<string>;
390
+ listAffiliates(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
391
+ _creationTime: number;
392
+ _id: string;
393
+ active: boolean;
394
+ attributionWindowDays: number;
395
+ commissionBps: number;
396
+ createdAt: number;
397
+ name: string;
398
+ siteId: string;
399
+ slug: string;
400
+ updatedAt: number;
401
+ }[]>;
402
+ removeAffiliate(ctx: MutationCtx, siteId: string, affiliateId: string): Promise<null>;
403
+ cleanup(ctx: MutationCtx, args: CleanupInput): Promise<{
404
+ deleted: number;
405
+ hasMore: boolean;
406
+ }>;
407
+ }
408
+ export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup";
409
+ export type AnalyticsAuthorizationRequest = {
410
+ operation: AnalyticsOperation;
411
+ siteIds: string[];
412
+ ownerId?: string;
413
+ };
414
+ export type AnalyticsAuthorizationContext = Pick<GenericQueryCtx<GenericDataModel>, "auth" | "db" | "runQuery">;
415
+ export type AnalyticsAuthorizer = (ctx: AnalyticsAuthorizationContext, request: AnalyticsAuthorizationRequest) => void | Promise<void>;
416
+ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
417
+ authorize: AnalyticsAuthorizer;
418
+ }): {
419
+ createSite: import("convex/server").RegisteredMutation<"public", {
420
+ cookieless?: boolean | undefined;
421
+ currency?: string | undefined;
422
+ domains: string[];
423
+ name: string;
424
+ networkId?: string | undefined;
425
+ ownerId: string;
426
+ timezone?: string | undefined;
427
+ }, Promise<string>>;
428
+ updateSite: import("convex/server").RegisteredMutation<"public", {
429
+ cookieless?: boolean | undefined;
430
+ currency?: string | undefined;
431
+ domains?: string[] | undefined;
432
+ name?: string | undefined;
433
+ networkId?: string | null | undefined;
434
+ siteId: string;
435
+ timezone?: string | null | undefined;
436
+ }, Promise<null>>;
437
+ getSite: import("convex/server").RegisteredQuery<"public", {
438
+ siteId: string;
439
+ }, Promise<{
440
+ _creationTime: number;
441
+ _id: string;
442
+ cookieless: boolean;
443
+ createdAt: number;
444
+ currency?: string;
445
+ domains: Array<string>;
446
+ name: string;
447
+ networkId?: string;
448
+ ownerId: string;
449
+ timezone?: string;
450
+ updatedAt: number;
451
+ } | null>>;
452
+ listSites: import("convex/server").RegisteredQuery<"public", {
453
+ limit?: number | undefined;
454
+ ownerId: string;
455
+ }, Promise<{
456
+ _creationTime: number;
457
+ _id: string;
458
+ cookieless: boolean;
459
+ createdAt: number;
460
+ currency?: string;
461
+ domains: Array<string>;
462
+ name: string;
463
+ networkId?: string;
464
+ ownerId: string;
465
+ timezone?: string;
466
+ updatedAt: number;
467
+ }[]>>;
468
+ ingest: import("convex/server").RegisteredMutation<"public", {
469
+ context?: {
470
+ browser?: string | undefined;
471
+ city?: string | undefined;
472
+ country?: string | undefined;
473
+ device?: string | undefined;
474
+ latitude?: number | undefined;
475
+ longitude?: number | undefined;
476
+ os?: string | undefined;
477
+ } | undefined;
478
+ events: {
479
+ affiliateSlug?: string | undefined;
480
+ currency?: string | undefined;
481
+ eventId: string;
482
+ href?: string | undefined;
483
+ name?: string | undefined;
484
+ path: string;
485
+ properties?: Record<string, string | number | boolean | null> | undefined;
486
+ referrer?: string | undefined;
487
+ revenueCents?: number | undefined;
488
+ sequence: number;
489
+ sessionId: string;
490
+ target?: string | undefined;
491
+ timestamp: number;
492
+ type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview";
493
+ visitorId: string;
494
+ }[];
495
+ origin: string;
496
+ siteId: string;
497
+ }, Promise<{
498
+ accepted: number;
499
+ duplicates: number;
500
+ rejected: number;
501
+ }>>;
502
+ trackConversion: import("convex/server").RegisteredMutation<"public", {
503
+ currency: string;
504
+ eventId: string;
505
+ goalKey?: string | undefined;
506
+ path?: string | undefined;
507
+ properties?: Record<string, string | number | boolean | null> | undefined;
508
+ revenueCents: number;
509
+ sessionId: string;
510
+ siteId: string;
511
+ timestamp: number;
512
+ visitorId: string;
513
+ }, Promise<{
514
+ accepted: number;
515
+ duplicates: number;
516
+ rejected: number;
517
+ }>>;
518
+ overview: import("convex/server").RegisteredQuery<"public", {
519
+ from: number;
520
+ interval?: "day" | "hour" | undefined;
521
+ siteIds: string[];
522
+ to: number;
523
+ }, Promise<{
524
+ currency: string;
525
+ from: number;
526
+ interval: "hour" | "day";
527
+ timeSeries: Array<{
528
+ clicks: number;
529
+ conversions: number;
530
+ customEvents: number;
531
+ events: number;
532
+ outboundClicks: number;
533
+ pageviews: number;
534
+ revenueCents: number;
535
+ sessions: number;
536
+ timestamp: number;
537
+ visitors: number;
538
+ }>;
539
+ to: number;
540
+ topBrowsers: Array<{
541
+ count: number;
542
+ revenueCents: number;
543
+ value: string;
544
+ }>;
545
+ topCountries: Array<{
546
+ count: number;
547
+ revenueCents: number;
548
+ value: string;
549
+ }>;
550
+ topDevices: Array<{
551
+ count: number;
552
+ revenueCents: number;
553
+ value: string;
554
+ }>;
555
+ topEvents: Array<{
556
+ count: number;
557
+ revenueCents: number;
558
+ value: string;
559
+ }>;
560
+ topGoals: Array<{
561
+ count: number;
562
+ revenueCents: number;
563
+ value: string;
564
+ }>;
565
+ topPages: Array<{
566
+ count: number;
567
+ revenueCents: number;
568
+ value: string;
569
+ }>;
570
+ topSources: Array<{
571
+ count: number;
572
+ revenueCents: number;
573
+ value: string;
574
+ }>;
575
+ totals: {
576
+ clicks: number;
577
+ conversions: number;
578
+ customEvents: number;
579
+ events: number;
580
+ outboundClicks: number;
581
+ pageviews: number;
582
+ revenueCents: number;
583
+ sessions: number;
584
+ visitors: number;
585
+ };
586
+ }>>;
587
+ liveVisitors: import("convex/server").RegisteredQuery<"public", {
588
+ limit?: number | undefined;
589
+ now: number;
590
+ siteIds: string[];
591
+ }, Promise<{
592
+ _creationTime: number;
593
+ _id: string;
594
+ browser: string;
595
+ city?: string;
596
+ country?: string;
597
+ device: string;
598
+ eventCount: number;
599
+ expiresAt: number;
600
+ lastSeenAt: number;
601
+ latitude?: number;
602
+ longitude?: number;
603
+ os: string;
604
+ pageviewCount: number;
605
+ path: string;
606
+ sessionId: string;
607
+ siteId: string;
608
+ source: string;
609
+ startedAt: number;
610
+ visitorId: string;
611
+ }[]>>;
612
+ listSessions: import("convex/server").RegisteredQuery<"public", {
613
+ from: number;
614
+ paginationOpts: {
615
+ id?: number;
616
+ endCursor?: string | null;
617
+ maximumRowsRead?: number;
618
+ maximumBytesRead?: number;
619
+ numItems: number;
620
+ cursor: string | null;
621
+ };
622
+ siteId: string;
623
+ to: number;
624
+ }, Promise<{
625
+ continueCursor: string;
626
+ isDone: boolean;
627
+ page: Array<{
628
+ _creationTime: number;
629
+ _id: string;
630
+ affiliateAttributedAt?: number;
631
+ affiliateExpiresAt?: number;
632
+ affiliateId?: string;
633
+ affiliateSlug?: string;
634
+ browser: string;
635
+ city?: string;
636
+ conversionCount: number;
637
+ country?: string;
638
+ currency?: string;
639
+ device: string;
640
+ durationMs: number;
641
+ entryPath: string;
642
+ eventCount: number;
643
+ exitPath: string;
644
+ lastSeenAt: number;
645
+ latitude?: number;
646
+ longitude?: number;
647
+ os: string;
648
+ pageviewCount: number;
649
+ referrer?: string;
650
+ revenueCents: number;
651
+ sessionId: string;
652
+ siteId: string;
653
+ source: string;
654
+ startedAt: number;
655
+ utmCampaign?: string;
656
+ utmMedium?: string;
657
+ utmSource?: string;
658
+ visitorId: string;
659
+ }>;
660
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
661
+ splitCursor?: string | null;
662
+ }>>;
663
+ sessionJourney: import("convex/server").RegisteredQuery<"public", {
664
+ from: number;
665
+ paginationOpts: {
666
+ id?: number;
667
+ endCursor?: string | null;
668
+ maximumRowsRead?: number;
669
+ maximumBytesRead?: number;
670
+ numItems: number;
671
+ cursor: string | null;
672
+ };
673
+ sessionId: string;
674
+ siteId: string;
675
+ to: number;
676
+ }, Promise<{
677
+ continueCursor: string;
678
+ isDone: boolean;
679
+ page: Array<{
680
+ _creationTime: number;
681
+ _id: string;
682
+ affiliateSlug?: string;
683
+ browser: string;
684
+ city?: string;
685
+ country?: string;
686
+ currency?: string;
687
+ device: string;
688
+ eventId: string;
689
+ href?: string;
690
+ latitude?: number;
691
+ longitude?: number;
692
+ name?: string;
693
+ os: string;
694
+ path: string;
695
+ properties?: Record<string, string | number | boolean | null>;
696
+ referrer?: string;
697
+ revenueCents?: number;
698
+ sequence: number;
699
+ sessionId: string;
700
+ siteId: string;
701
+ target?: string;
702
+ timestamp: number;
703
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
704
+ visitorId: string;
705
+ }>;
706
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
707
+ splitCursor?: string | null;
708
+ }>>;
709
+ listConversions: import("convex/server").RegisteredQuery<"public", {
710
+ from: number;
711
+ paginationOpts: {
712
+ id?: number;
713
+ endCursor?: string | null;
714
+ maximumRowsRead?: number;
715
+ maximumBytesRead?: number;
716
+ numItems: number;
717
+ cursor: string | null;
718
+ };
719
+ siteId: string;
720
+ to: number;
721
+ }, Promise<{
722
+ continueCursor: string;
723
+ isDone: boolean;
724
+ page: Array<{
725
+ _creationTime: number;
726
+ _id: string;
727
+ affiliateAttributedAt?: number;
728
+ affiliateExpiresAt?: number;
729
+ affiliateId?: string;
730
+ affiliateSlug?: string;
731
+ commissionCents: number;
732
+ currency: string;
733
+ eventId: string;
734
+ goalKey?: string;
735
+ path: string;
736
+ revenueCents: number;
737
+ sessionId: string;
738
+ siteId: string;
739
+ source: "tracker" | "trusted";
740
+ timestamp: number;
741
+ visitorId: string;
742
+ }>;
743
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
744
+ splitCursor?: string | null;
745
+ }>>;
746
+ visitorJourney: import("convex/server").RegisteredQuery<"public", {
747
+ from: number;
748
+ limit?: number | undefined;
749
+ siteIds: string[];
750
+ to: number;
751
+ visitorId: string;
752
+ }, Promise<{
753
+ _creationTime: number;
754
+ _id: string;
755
+ affiliateSlug?: string;
756
+ browser: string;
757
+ city?: string;
758
+ country?: string;
759
+ currency?: string;
760
+ device: string;
761
+ eventId: string;
762
+ href?: string;
763
+ latitude?: number;
764
+ longitude?: number;
765
+ name?: string;
766
+ os: string;
767
+ path: string;
768
+ properties?: Record<string, string | number | boolean | null>;
769
+ referrer?: string;
770
+ revenueCents?: number;
771
+ sequence: number;
772
+ sessionId: string;
773
+ siteId: string;
774
+ target?: string;
775
+ timestamp: number;
776
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
777
+ visitorId: string;
778
+ }[]>>;
779
+ goalsReport: import("convex/server").RegisteredQuery<"public", {
780
+ from: number;
781
+ siteId: string;
782
+ to: number;
783
+ }, Promise<{
784
+ goals: Array<{
785
+ _creationTime: number;
786
+ _id: string;
787
+ active: boolean;
788
+ completions: number;
789
+ createdAt: number;
790
+ key: string;
791
+ matchType: "pageview" | "custom";
792
+ matchValue: string;
793
+ name: string;
794
+ siteId: string;
795
+ updatedAt: number;
796
+ valueCents: number;
797
+ }>;
798
+ truncated: boolean;
799
+ }>>;
800
+ funnelsReport: import("convex/server").RegisteredQuery<"public", {
801
+ from: number;
802
+ siteId: string;
803
+ to: number;
804
+ }, Promise<{
805
+ _creationTime: number;
806
+ _id: string;
807
+ active: boolean;
808
+ conversionWindowMs: number;
809
+ createdAt: number;
810
+ key: string;
811
+ name: string;
812
+ siteId: string;
813
+ steps: Array<{
814
+ name: string;
815
+ type: "pageview" | "custom";
816
+ value: string;
817
+ }>;
818
+ stepsReport: Array<{
819
+ completions: number;
820
+ entrants: number;
821
+ name: string;
822
+ step: number;
823
+ }>;
824
+ truncated: boolean;
825
+ updatedAt: number;
826
+ }[]>>;
827
+ affiliatesReport: import("convex/server").RegisteredQuery<"public", {
828
+ from: number;
829
+ siteId: string;
830
+ to: number;
831
+ }, Promise<{
832
+ affiliates: Array<{
833
+ _creationTime: number;
834
+ _id: string;
835
+ active: boolean;
836
+ attributionWindowDays: number;
837
+ commissionBps: number;
838
+ commissionCents: number;
839
+ conversions: number;
840
+ createdAt: number;
841
+ name: string;
842
+ revenueCents: number;
843
+ siteId: string;
844
+ slug: string;
845
+ uniqueVisitors: number;
846
+ updatedAt: number;
847
+ visits: number;
848
+ }>;
849
+ truncated: boolean;
850
+ }>>;
851
+ upsertGoal: import("convex/server").RegisteredMutation<"public", {
852
+ active?: boolean | undefined;
853
+ goalId?: string | undefined;
854
+ key: string;
855
+ matchType: "custom" | "pageview";
856
+ matchValue: string;
857
+ name: string;
858
+ siteId: string;
859
+ valueCents?: number | undefined;
860
+ }, Promise<string>>;
861
+ listGoals: import("convex/server").RegisteredQuery<"public", {
862
+ siteId: string;
863
+ }, Promise<{
864
+ _creationTime: number;
865
+ _id: string;
866
+ active: boolean;
867
+ createdAt: number;
868
+ key: string;
869
+ matchType: "pageview" | "custom";
870
+ matchValue: string;
871
+ name: string;
872
+ siteId: string;
873
+ updatedAt: number;
874
+ valueCents?: number;
875
+ }[]>>;
876
+ removeGoal: import("convex/server").RegisteredMutation<"public", {
877
+ goalId: string;
878
+ siteId: string;
879
+ }, Promise<null>>;
880
+ upsertFunnel: import("convex/server").RegisteredMutation<"public", {
881
+ active?: boolean | undefined;
882
+ conversionWindowMs: number;
883
+ funnelId?: string | undefined;
884
+ key: string;
885
+ name: string;
886
+ siteId: string;
887
+ steps: {
888
+ name: string;
889
+ type: "custom" | "pageview";
890
+ value: string;
891
+ }[];
892
+ }, Promise<string>>;
893
+ listFunnels: import("convex/server").RegisteredQuery<"public", {
894
+ siteId: string;
895
+ }, Promise<{
896
+ _creationTime: number;
897
+ _id: string;
898
+ active: boolean;
899
+ conversionWindowMs: number;
900
+ createdAt: number;
901
+ key: string;
902
+ name: string;
903
+ siteId: string;
904
+ steps: Array<{
905
+ name: string;
906
+ type: "pageview" | "custom";
907
+ value: string;
908
+ }>;
909
+ updatedAt: number;
910
+ }[]>>;
911
+ removeFunnel: import("convex/server").RegisteredMutation<"public", {
912
+ funnelId: string;
913
+ siteId: string;
914
+ }, Promise<null>>;
915
+ upsertAffiliate: import("convex/server").RegisteredMutation<"public", {
916
+ active?: boolean | undefined;
917
+ affiliateId?: string | undefined;
918
+ attributionWindowDays: number;
919
+ commissionBps: number;
920
+ name: string;
921
+ siteId: string;
922
+ slug: string;
923
+ }, Promise<string>>;
924
+ listAffiliates: import("convex/server").RegisteredQuery<"public", {
925
+ siteId: string;
926
+ }, Promise<{
927
+ _creationTime: number;
928
+ _id: string;
929
+ active: boolean;
930
+ attributionWindowDays: number;
931
+ commissionBps: number;
932
+ createdAt: number;
933
+ name: string;
934
+ siteId: string;
935
+ slug: string;
936
+ updatedAt: number;
937
+ }[]>>;
938
+ removeAffiliate: import("convex/server").RegisteredMutation<"public", {
939
+ affiliateId: string;
940
+ siteId: string;
941
+ }, Promise<null>>;
942
+ cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
943
+ batchSize?: number | undefined;
944
+ before: number;
945
+ kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
946
+ siteId: string;
947
+ }, Promise<{
948
+ deleted: number;
949
+ hasMore: boolean;
950
+ }>>;
951
+ };
952
+ export declare function componentHttpPaths(prefix?: string): {
953
+ readonly events: `${string}/events`;
954
+ readonly tracker: `${string}/tracker.js`;
955
+ readonly health: `${string}/health`;
956
+ };
957
+ type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;
958
+ type MutationCtx = Pick<GenericMutationCtx<GenericDataModel>, "runQuery" | "runMutation">;
959
+ type ActionCtx = Pick<GenericActionCtx<GenericDataModel>, "runQuery" | "runMutation" | "runAction">;
960
+ //# sourceMappingURL=index.d.ts.map