@antelopejs/dms-marketing 0.3.2 → 0.4.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 (287) hide show
  1. package/README.md +18 -15
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.js +4 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/data-api/funnels.d.ts +2 -0
  6. package/dist/data-api/funnels.js +8 -1
  7. package/dist/data-api/funnels.js.map +1 -1
  8. package/dist/db/models/funnels.model.d.ts +2 -0
  9. package/dist/db/models/funnels.model.js +9 -0
  10. package/dist/db/models/funnels.model.js.map +1 -1
  11. package/dist/db/models/index.d.ts +1 -0
  12. package/dist/db/models/index.js +1 -0
  13. package/dist/db/models/index.js.map +1 -1
  14. package/dist/db/models/marketing_events.model.d.ts +22 -0
  15. package/dist/db/models/marketing_events.model.js +70 -5
  16. package/dist/db/models/marketing_events.model.js.map +1 -1
  17. package/dist/db/models/marketing_preferences.model.d.ts +25 -0
  18. package/dist/db/models/marketing_preferences.model.js +29 -0
  19. package/dist/db/models/marketing_preferences.model.js.map +1 -0
  20. package/dist/db/models/marketing_sessions.model.d.ts +2 -1
  21. package/dist/db/models/marketing_sessions.model.js +11 -1
  22. package/dist/db/models/marketing_sessions.model.js.map +1 -1
  23. package/dist/db/models/page_snapshots.model.d.ts +2 -1
  24. package/dist/db/models/page_snapshots.model.js +7 -7
  25. package/dist/db/models/page_snapshots.model.js.map +1 -1
  26. package/dist/db/models/website_statistics.model.d.ts +4 -1
  27. package/dist/db/models/website_statistics.model.js +15 -1
  28. package/dist/db/models/website_statistics.model.js.map +1 -1
  29. package/dist/db/tables/index.d.ts +1 -0
  30. package/dist/db/tables/index.js +1 -0
  31. package/dist/db/tables/index.js.map +1 -1
  32. package/dist/db/tables/marketing_preferences.table.d.ts +6 -0
  33. package/dist/db/tables/marketing_preferences.table.js +31 -0
  34. package/dist/db/tables/marketing_preferences.table.js.map +1 -0
  35. package/dist/hooks/index.js +8 -0
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/index.js +18 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/pages/acquisition/page.d.ts +9 -0
  40. package/dist/pages/acquisition/page.js +181 -0
  41. package/dist/pages/acquisition/page.js.map +1 -0
  42. package/dist/pages/all.d.ts +5 -1
  43. package/dist/pages/all.js +5 -1
  44. package/dist/pages/all.js.map +1 -1
  45. package/dist/pages/blocks.d.ts +18 -0
  46. package/dist/pages/blocks.js +56 -0
  47. package/dist/pages/blocks.js.map +1 -0
  48. package/dist/pages/funnel/page.d.ts +9 -0
  49. package/dist/pages/funnel/page.js +36 -0
  50. package/dist/pages/funnel/page.js.map +1 -0
  51. package/dist/pages/funnel-builder/page.d.ts +9 -0
  52. package/dist/pages/funnel-builder/page.js +29 -0
  53. package/dist/pages/funnel-builder/page.js.map +1 -0
  54. package/dist/pages/funnels/page.d.ts +1 -1
  55. package/dist/pages/funnels/page.js +200 -3
  56. package/dist/pages/funnels/page.js.map +1 -1
  57. package/dist/pages/index.d.ts +1 -0
  58. package/dist/pages/index.js +1 -0
  59. package/dist/pages/index.js.map +1 -1
  60. package/dist/pages/{campaigns → install}/page.d.ts +3 -3
  61. package/dist/pages/{campaigns → install}/page.js +14 -12
  62. package/dist/pages/install/page.js.map +1 -0
  63. package/dist/pages/module.d.ts +3 -0
  64. package/dist/pages/module.js +30 -3
  65. package/dist/pages/module.js.map +1 -1
  66. package/dist/pages/overview/page.d.ts +1 -1
  67. package/dist/pages/overview/page.js +122 -3
  68. package/dist/pages/overview/page.js.map +1 -1
  69. package/dist/pages/pages/page.d.ts +1 -1
  70. package/dist/pages/pages/page.js +9 -4
  71. package/dist/pages/pages/page.js.map +1 -1
  72. package/dist/pages/quick-actions.d.ts +1 -0
  73. package/dist/pages/quick-actions.js +25 -0
  74. package/dist/pages/quick-actions.js.map +1 -0
  75. package/dist/pages/settings/form.d.ts +2 -1
  76. package/dist/pages/settings/form.js +62 -20
  77. package/dist/pages/settings/form.js.map +1 -1
  78. package/dist/pages/settings/page.d.ts +4 -1
  79. package/dist/pages/settings/page.js +50 -4
  80. package/dist/pages/settings/page.js.map +1 -1
  81. package/dist/pages/websites/page.d.ts +11 -0
  82. package/dist/pages/websites/page.js +62 -0
  83. package/dist/pages/websites/page.js.map +1 -0
  84. package/dist/routes/blocks.d.ts +50 -0
  85. package/dist/routes/blocks.js +269 -0
  86. package/dist/routes/blocks.js.map +1 -0
  87. package/dist/routes/collect.d.ts +1 -2
  88. package/dist/routes/collect.js +19 -12
  89. package/dist/routes/collect.js.map +1 -1
  90. package/dist/routes/context.d.ts +8 -0
  91. package/dist/routes/context.js +54 -0
  92. package/dist/routes/context.js.map +1 -0
  93. package/dist/routes/experiments.js +2 -1
  94. package/dist/routes/experiments.js.map +1 -1
  95. package/dist/routes/funnels.d.ts +21 -3
  96. package/dist/routes/funnels.js +150 -7
  97. package/dist/routes/funnels.js.map +1 -1
  98. package/dist/routes/index.d.ts +2 -0
  99. package/dist/routes/index.js +2 -0
  100. package/dist/routes/index.js.map +1 -1
  101. package/dist/routes/settings.d.ts +6 -1
  102. package/dist/routes/settings.js +65 -4
  103. package/dist/routes/settings.js.map +1 -1
  104. package/dist/routes/snapshot.d.ts +1 -1
  105. package/dist/routes/snapshot.js +24 -25
  106. package/dist/routes/snapshot.js.map +1 -1
  107. package/dist/routes/stats.d.ts +14 -23
  108. package/dist/routes/stats.js +73 -97
  109. package/dist/routes/stats.js.map +1 -1
  110. package/dist/routes/tracker.js +6 -4
  111. package/dist/routes/tracker.js.map +1 -1
  112. package/dist/routes/websites.d.ts +4 -0
  113. package/dist/routes/websites.js +111 -12
  114. package/dist/routes/websites.js.map +1 -1
  115. package/dist/services/acquisition-report.d.ts +62 -0
  116. package/dist/services/acquisition-report.js +181 -0
  117. package/dist/services/acquisition-report.js.map +1 -0
  118. package/dist/services/acquisition.d.ts +9 -3
  119. package/dist/services/acquisition.js +35 -5
  120. package/dist/services/acquisition.js.map +1 -1
  121. package/dist/services/catalog.d.ts +3 -0
  122. package/dist/services/catalog.js +17 -0
  123. package/dist/services/catalog.js.map +1 -0
  124. package/dist/services/collect.d.ts +1 -2
  125. package/dist/services/collect.js +49 -24
  126. package/dist/services/collect.js.map +1 -1
  127. package/dist/services/composed.d.ts +9 -0
  128. package/dist/services/composed.js +62 -0
  129. package/dist/services/composed.js.map +1 -0
  130. package/dist/services/context.d.ts +20 -0
  131. package/dist/services/context.js +76 -0
  132. package/dist/services/context.js.map +1 -0
  133. package/dist/services/dashboard.d.ts +74 -0
  134. package/dist/services/dashboard.js +343 -0
  135. package/dist/services/dashboard.js.map +1 -0
  136. package/dist/services/experiments/results.d.ts +12 -1
  137. package/dist/services/experiments/results.js +19 -2
  138. package/dist/services/experiments/results.js.map +1 -1
  139. package/dist/services/experiments/stats.d.ts +7 -1
  140. package/dist/services/experiments/stats.js +43 -5
  141. package/dist/services/experiments/stats.js.map +1 -1
  142. package/dist/services/funnel-report.d.ts +64 -0
  143. package/dist/services/funnel-report.js +280 -0
  144. package/dist/services/funnel-report.js.map +1 -0
  145. package/dist/services/funnels/compute.d.ts +2 -0
  146. package/dist/services/funnels/compute.js +25 -13
  147. package/dist/services/funnels/compute.js.map +1 -1
  148. package/dist/services/funnels/results.js +4 -1
  149. package/dist/services/funnels/results.js.map +1 -1
  150. package/dist/services/funnels/step-path.d.ts +4 -0
  151. package/dist/services/funnels/step-path.js +47 -0
  152. package/dist/services/funnels/step-path.js.map +1 -0
  153. package/dist/services/funnels-table.d.ts +31 -0
  154. package/dist/services/funnels-table.js +230 -0
  155. package/dist/services/funnels-table.js.map +1 -0
  156. package/dist/services/heatmap.d.ts +15 -3
  157. package/dist/services/heatmap.js +54 -11
  158. package/dist/services/heatmap.js.map +1 -1
  159. package/dist/services/hourly-traffic.d.ts +4 -0
  160. package/dist/services/hourly-traffic.js +35 -0
  161. package/dist/services/hourly-traffic.js.map +1 -0
  162. package/dist/services/origin-guard.d.ts +9 -1
  163. package/dist/services/origin-guard.js +46 -1
  164. package/dist/services/origin-guard.js.map +1 -1
  165. package/dist/services/period.d.ts +26 -1
  166. package/dist/services/period.js +99 -9
  167. package/dist/services/period.js.map +1 -1
  168. package/dist/services/prune.d.ts +6 -0
  169. package/dist/services/prune.js +35 -0
  170. package/dist/services/prune.js.map +1 -1
  171. package/dist/services/request-body.d.ts +1 -2
  172. package/dist/services/request-body.js +10 -36
  173. package/dist/services/request-body.js.map +1 -1
  174. package/dist/services/request-meta.d.ts +0 -1
  175. package/dist/services/request-meta.js +0 -11
  176. package/dist/services/request-meta.js.map +1 -1
  177. package/dist/services/rollups.d.ts +25 -0
  178. package/dist/services/rollups.js +102 -0
  179. package/dist/services/rollups.js.map +1 -0
  180. package/dist/services/sessionize.d.ts +5 -1
  181. package/dist/services/sessionize.js +52 -10
  182. package/dist/services/sessionize.js.map +1 -1
  183. package/dist/services/settings.d.ts +41 -2
  184. package/dist/services/settings.js +219 -6
  185. package/dist/services/settings.js.map +1 -1
  186. package/dist/services/snapshots.d.ts +3 -2
  187. package/dist/services/snapshots.js +110 -9
  188. package/dist/services/snapshots.js.map +1 -1
  189. package/dist/services/tenant-website.js +1 -0
  190. package/dist/services/tenant-website.js.map +1 -1
  191. package/dist/services/url.js +12 -4
  192. package/dist/services/url.js.map +1 -1
  193. package/dist/services/website-hosts.d.ts +15 -0
  194. package/dist/services/website-hosts.js +67 -0
  195. package/dist/services/website-hosts.js.map +1 -0
  196. package/dist/services/website-report.d.ts +40 -0
  197. package/dist/services/website-report.js +84 -0
  198. package/dist/services/website-report.js.map +1 -0
  199. package/dist/types/constants.d.ts +14 -2
  200. package/dist/types/constants.js +17 -6
  201. package/dist/types/constants.js.map +1 -1
  202. package/dist/types/events.d.ts +221 -68
  203. package/dist/types/events.js +60 -11
  204. package/dist/types/events.js.map +1 -1
  205. package/dist/types/snapshots.d.ts +6 -0
  206. package/dist/types/snapshots.js +2 -0
  207. package/dist/types/snapshots.js.map +1 -1
  208. package/dist/types/statistics.d.ts +2 -1
  209. package/dist/types/statistics.js +9 -2
  210. package/dist/types/statistics.js.map +1 -1
  211. package/dist/utils/experiment-type.js +1 -1
  212. package/dist/utils/experiment-type.js.map +1 -1
  213. package/dist/utils/funnel-steps-type.d.ts +21 -3
  214. package/dist/utils/funnel-steps-type.js +7 -2
  215. package/dist/utils/funnel-steps-type.js.map +1 -1
  216. package/frontend-vue/app/components/ChannelsCard.vue +265 -0
  217. package/frontend-vue/app/components/Context.vue +479 -0
  218. package/frontend-vue/app/components/ExperimentInput.vue +3 -1
  219. package/frontend-vue/app/components/ExperimentReport.vue +736 -0
  220. package/frontend-vue/app/components/FirstRun.vue +60 -0
  221. package/frontend-vue/app/components/FunnelBuilder.vue +1595 -0
  222. package/frontend-vue/app/components/FunnelFigure.vue +640 -0
  223. package/frontend-vue/app/components/FunnelReport.vue +532 -0
  224. package/frontend-vue/app/components/FunnelStepsInput.vue +3 -1
  225. package/frontend-vue/app/components/FunnelTemplates.vue +161 -0
  226. package/frontend-vue/app/components/HeatmapCanvas.vue +11 -4
  227. package/frontend-vue/app/components/InstallGuide.vue +753 -0
  228. package/frontend-vue/app/components/PagePreview.vue +889 -416
  229. package/frontend-vue/app/components/PagesExplorer.vue +552 -0
  230. package/frontend-vue/app/components/ScrollDepthOverlay.vue +48 -20
  231. package/frontend-vue/app/components/TopListTabs.vue +317 -0
  232. package/frontend-vue/app/components/TrackerSnippet.vue +50 -16
  233. package/frontend-vue/app/components/VariationsInput.vue +15 -5
  234. package/frontend-vue/app/components/WebsitesGrid.vue +799 -0
  235. package/frontend-vue/app/composables/useContextLink.ts +16 -0
  236. package/frontend-vue/app/composables/useExperiment.ts +1 -2
  237. package/frontend-vue/app/composables/useFunnelSteps.ts +1 -2
  238. package/frontend-vue/app/composables/useLatestRequest.ts +2 -4
  239. package/frontend-vue/app/composables/useMarketingApi.ts +298 -133
  240. package/frontend-vue/app/composables/useMarketingContext.ts +55 -0
  241. package/frontend-vue/app/composables/useMarketingRoutes.ts +80 -27
  242. package/frontend-vue/app/composables/useSnapshotFrame.ts +26 -4
  243. package/frontend-vue/app/constants.ts +22 -0
  244. package/frontend-vue/app/plugins/funnel-steps-data-type.client.ts +2 -1
  245. package/frontend-vue/app/utils/channels.ts +37 -0
  246. package/frontend-vue/app/utils/format.ts +132 -0
  247. package/frontend-vue/app/utils/funnel-draft.ts +264 -0
  248. package/frontend-vue/app/utils/heatmap.ts +82 -0
  249. package/frontend-vue/app/utils/heatmapPalette.ts +10 -0
  250. package/frontend-vue/app/utils/host-conflict.ts +48 -0
  251. package/frontend-vue/app/utils/sample-size.ts +17 -0
  252. package/frontend-vue/app/utils/snapshotViewportUnits.ts +15 -5
  253. package/frontend-vue/app/utils/snippet.ts +53 -0
  254. package/frontend-vue/app/utils/step-path.ts +32 -0
  255. package/frontend-vue/dms.frontend.ts +4 -3
  256. package/frontend-vue/i18n/locales/marketing-en-GB.json +1083 -316
  257. package/frontend-vue/i18n/locales/marketing-fr-FR.json +1087 -320
  258. package/frontend-vue/package.json +3 -0
  259. package/frontend-vue/tests/drafts.test.ts +3 -3
  260. package/frontend-vue/tests/format.test.ts +73 -0
  261. package/frontend-vue/tests/funnel-draft.test.ts +194 -0
  262. package/frontend-vue/tests/heatmap.test.ts +32 -0
  263. package/frontend-vue/tests/i18n.test.ts +87 -4
  264. package/frontend-vue/tests/latest-request.test.ts +6 -3
  265. package/frontend-vue/tests/locale-typography.test.ts +115 -0
  266. package/frontend-vue/tests/registration.test.ts +21 -11
  267. package/frontend-vue/tests/routes.test.ts +67 -7
  268. package/frontend-vue/tests/server-parity.test.ts +77 -0
  269. package/frontend-vue/tests/stubs/frontend-module.ts +18 -3
  270. package/package.json +9 -7
  271. package/static/snapshot.js +46 -16
  272. package/static/tracker.js +139 -48
  273. package/dist/pages/campaigns/page.js.map +0 -1
  274. package/frontend-vue/app/components/CampaignsView.vue +0 -330
  275. package/frontend-vue/app/components/FunnelDetail.vue +0 -1026
  276. package/frontend-vue/app/components/FunnelsView.vue +0 -493
  277. package/frontend-vue/app/components/NoWebsiteState.vue +0 -18
  278. package/frontend-vue/app/components/OverviewView.vue +0 -493
  279. package/frontend-vue/app/components/PagesView.vue +0 -391
  280. package/frontend-vue/app/components/TextKpiCard.vue +0 -28
  281. package/frontend-vue/app/components/TopListTabsCard.vue +0 -162
  282. package/frontend-vue/app/composables/useChildId.ts +0 -13
  283. package/frontend-vue/app/composables/useMarketingPeriod.ts +0 -65
  284. package/frontend-vue/app/composables/useMarketingWebsiteForm.ts +0 -69
  285. package/frontend-vue/app/composables/useMarketingWebsites.ts +0 -80
  286. package/frontend-vue/app/utils/dmsComponent.ts +0 -18
  287. package/frontend-vue/tests/period.test.ts +0 -35
@@ -25,57 +25,117 @@ const experiment_definitions_1 = require("@/services/experiment-definitions");
25
25
  const snapshots_1 = require("@/services/snapshots");
26
26
  const tenant_website_1 = require("@/services/tenant-website");
27
27
  const website_cache_1 = require("@/services/website-cache");
28
+ const origin_guard_1 = require("@/services/origin-guard");
29
+ const website_hosts_1 = require("@/services/website-hosts");
30
+ const website_report_1 = require("@/services/website-report");
28
31
  const constants_1 = require("@/types/constants");
29
32
  const INVALID_WEBSITE_MESSAGE = "$page.marketing.errors.invalid_website";
30
- const extraDomainsSchema = zod_1.z
31
- .array(zod_1.z.string().min(1).max(constants_1.MAX_DOMAIN_LENGTH))
32
- .max(constants_1.MAX_EXTRA_DOMAINS);
33
+ const INVALID_HOSTNAME_MESSAGE = "$page.marketing.errors.invalid_hostname";
34
+ const DUPLICATE_HOST_MESSAGE = "$page.marketing.errors.duplicate_host";
35
+ const hostnameSchema = zod_1.z
36
+ .string()
37
+ .trim()
38
+ .min(1)
39
+ .max(constants_1.MAX_DOMAIN_LENGTH)
40
+ .transform(website_hosts_1.normalizeHostname)
41
+ .refine(website_hosts_1.isValidHostname, { message: INVALID_HOSTNAME_MESSAGE });
42
+ const nameSchema = zod_1.z.string().trim().min(1).max(constants_1.MAX_NAME_LENGTH);
43
+ const extraDomainsSchema = zod_1.z.array(hostnameSchema).max(constants_1.MAX_EXTRA_DOMAINS);
33
44
  const websiteCreateSchema = zod_1.z.object({
34
- name: zod_1.z.string().min(1).max(constants_1.MAX_NAME_LENGTH),
35
- domain: zod_1.z.string().min(1).max(constants_1.MAX_DOMAIN_LENGTH),
45
+ name: nameSchema,
46
+ domain: hostnameSchema,
36
47
  extraDomains: extraDomainsSchema.optional(),
37
48
  snapshotsEnabled: zod_1.z.boolean().optional(),
38
49
  snapshotMaskText: zod_1.z.boolean().optional(),
39
50
  });
51
+ const allowHostSchema = zod_1.z.object({ hostname: hostnameSchema });
40
52
  const websiteUpdateSchema = zod_1.z.object({
41
- name: zod_1.z.string().min(1).max(constants_1.MAX_NAME_LENGTH).optional(),
42
- domain: zod_1.z.string().min(1).max(constants_1.MAX_DOMAIN_LENGTH).optional(),
53
+ name: nameSchema.optional(),
54
+ domain: hostnameSchema.optional(),
43
55
  extraDomains: extraDomainsSchema.optional(),
56
+ trackingEnabled: zod_1.z.boolean().optional(),
44
57
  snapshotsEnabled: zod_1.z.boolean().optional(),
45
58
  snapshotMaskText: zod_1.z.boolean().optional(),
46
59
  });
60
+ function validationIssues(error) {
61
+ return error instanceof zod_1.z.ZodError ? error.issues : INVALID_WEBSITE_MESSAGE;
62
+ }
63
+ function distinctExtraHosts(domain, hosts) {
64
+ return [...new Set(hosts)].filter((host) => host !== domain);
65
+ }
66
+ async function assertHostsFree(website) {
67
+ const conflict = (0, website_hosts_1.findHostConflict)(website, await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).getByTenant(website.tenantId));
68
+ if (conflict) {
69
+ throw new interface_api_1.HTTPResult(constants_1.HTTP_CONFLICT, {
70
+ field: conflict.field,
71
+ message: DUPLICATE_HOST_MESSAGE,
72
+ values: [conflict.hostname, conflict.website.name],
73
+ });
74
+ }
75
+ }
47
76
  class WebsitesController extends (0, interface_api_1.Controller)(`${constants_1.API_BASE_PATH}/websites`) {
48
77
  async list(_user, context) {
49
78
  return (0, tenant_website_1.listTenantWebsites)((0, request_tenant_1.getRequestTenantId)(context));
50
79
  }
80
+ async summary(_user, context) {
81
+ const tenantId = (0, request_tenant_1.getRequestTenantId)(context);
82
+ return (0, website_report_1.websitesSummary)(tenantId, await (0, tenant_website_1.listTenantWebsites)(tenantId));
83
+ }
84
+ async connection(_user, id, context, since) {
85
+ const from = Number(since);
86
+ return (0, website_report_1.connectionStatus)(await (0, tenant_website_1.requireTenantWebsite)(context, id), since && Number.isFinite(from) ? from : undefined);
87
+ }
88
+ async deletion(_user, id, context) {
89
+ return (0, website_report_1.websiteDeletionImpact)(await (0, tenant_website_1.requireTenantWebsite)(context, id));
90
+ }
91
+ async allowHost(_user, id, body, context) {
92
+ const website = await (0, tenant_website_1.requireTenantWebsite)(context, id);
93
+ const data = (0, interface_api_util_1.assertValidation)(body, allowHostSchema.parse, validationIssues);
94
+ const hosts = new Set(website.extraDomains ?? []);
95
+ if (!hosts.has(data.hostname) && hosts.size >= constants_1.MAX_EXTRA_DOMAINS) {
96
+ throw new interface_api_1.HTTPResult(constants_1.HTTP_BAD_REQUEST, INVALID_WEBSITE_MESSAGE);
97
+ }
98
+ hosts.add(data.hostname);
99
+ website.extraDomains = distinctExtraHosts(website.domain, [...hosts]);
100
+ await assertHostsFree(website);
101
+ await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).update(website);
102
+ (0, website_cache_1.invalidateWebsiteCache)(id);
103
+ (0, origin_guard_1.forgetAcceptedSources)(website);
104
+ return website;
105
+ }
51
106
  async create(_user, body, context) {
52
- const data = (0, interface_api_util_1.assertValidation)(body, websiteCreateSchema.parse, () => INVALID_WEBSITE_MESSAGE);
107
+ const data = (0, interface_api_util_1.assertValidation)(body, websiteCreateSchema.parse, validationIssues);
53
108
  const website = {
54
109
  _id: (0, node_crypto_1.randomUUID)(),
55
110
  tenantId: (0, request_tenant_1.getRequestTenantId)(context),
56
111
  name: data.name,
57
112
  domain: data.domain,
58
- extraDomains: data.extraDomains ?? [],
113
+ extraDomains: distinctExtraHosts(data.domain, data.extraDomains ?? []),
59
114
  trackingEnabled: true,
60
115
  snapshotsEnabled: data.snapshotsEnabled ?? false,
61
116
  snapshotMaskText: data.snapshotMaskText ?? false,
62
117
  createdAt: new Date(),
63
118
  updatedAt: new Date(),
64
119
  };
120
+ await assertHostsFree(website);
65
121
  await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).insert(website);
66
122
  return website;
67
123
  }
68
124
  async update(_user, id, body, context) {
69
125
  const website = await (0, tenant_website_1.requireTenantWebsite)(context, id);
70
- const data = (0, interface_api_util_1.assertValidation)(body, websiteUpdateSchema.parse, () => INVALID_WEBSITE_MESSAGE);
126
+ const data = (0, interface_api_util_1.assertValidation)(body, websiteUpdateSchema.parse, validationIssues);
71
127
  if (data.name !== undefined) {
72
128
  website.name = data.name;
73
129
  }
74
130
  if (data.domain !== undefined) {
75
131
  website.domain = data.domain;
76
132
  }
77
- if (data.extraDomains !== undefined) {
78
- website.extraDomains = data.extraDomains;
133
+ if (data.extraDomains !== undefined || data.domain !== undefined) {
134
+ website.extraDomains = distinctExtraHosts(website.domain, data.extraDomains ?? website.extraDomains ?? []);
135
+ await assertHostsFree(website);
136
+ }
137
+ if (data.trackingEnabled !== undefined) {
138
+ website.trackingEnabled = data.trackingEnabled;
79
139
  }
80
140
  const snapshotOptionsChanged = (data.snapshotsEnabled !== undefined &&
81
141
  data.snapshotsEnabled !== website.snapshotsEnabled) ||
@@ -87,12 +147,14 @@ class WebsitesController extends (0, interface_api_1.Controller)(`${constants_1.
87
147
  if (data.snapshotMaskText !== undefined) {
88
148
  website.snapshotMaskText = data.snapshotMaskText;
89
149
  }
150
+ website.updatedAt = new Date();
90
151
  await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).update(website);
91
152
  if (snapshotOptionsChanged) {
92
153
  await (0, snapshots_1.deleteSnapshots)(website.tenantId, website._id);
93
154
  }
94
155
  (0, website_cache_1.invalidateWebsiteCache)(id);
95
156
  (0, experiment_definitions_1.invalidateExperimentDefinitions)(id);
157
+ (0, origin_guard_1.forgetAcceptedSources)(website);
96
158
  return website;
97
159
  }
98
160
  async remove(_user, id, context) {
@@ -113,6 +175,43 @@ __decorate([
113
175
  __metadata("design:paramtypes", [Function, Object]),
114
176
  __metadata("design:returntype", Promise)
115
177
  ], WebsitesController.prototype, "list", null);
178
+ __decorate([
179
+ (0, interface_api_1.Get)("summary"),
180
+ __param(0, (0, guards_1.AuthTenantMember)()),
181
+ __param(1, (0, interface_api_1.Context)()),
182
+ __metadata("design:type", Function),
183
+ __metadata("design:paramtypes", [Function, Object]),
184
+ __metadata("design:returntype", Promise)
185
+ ], WebsitesController.prototype, "summary", null);
186
+ __decorate([
187
+ (0, interface_api_1.Get)("/:id/connection"),
188
+ __param(0, (0, guards_1.AuthTenantMember)()),
189
+ __param(1, (0, interface_api_1.Parameter)("id")),
190
+ __param(2, (0, interface_api_1.Context)()),
191
+ __param(3, (0, interface_api_1.Parameter)("since", "query")),
192
+ __metadata("design:type", Function),
193
+ __metadata("design:paramtypes", [Function, String, Object, String]),
194
+ __metadata("design:returntype", Promise)
195
+ ], WebsitesController.prototype, "connection", null);
196
+ __decorate([
197
+ (0, interface_api_1.Get)("/:id/deletion"),
198
+ __param(0, (0, guards_1.AuthTenantOwner)()),
199
+ __param(1, (0, interface_api_1.Parameter)("id")),
200
+ __param(2, (0, interface_api_1.Context)()),
201
+ __metadata("design:type", Function),
202
+ __metadata("design:paramtypes", [Function, String, Object]),
203
+ __metadata("design:returntype", Promise)
204
+ ], WebsitesController.prototype, "deletion", null);
205
+ __decorate([
206
+ (0, interface_api_1.Post)("/:id/allow-host"),
207
+ __param(0, (0, guards_1.AuthTenantOwner)()),
208
+ __param(1, (0, interface_api_1.Parameter)("id")),
209
+ __param(2, (0, interface_api_1.JSONBody)()),
210
+ __param(3, (0, interface_api_1.Context)()),
211
+ __metadata("design:type", Function),
212
+ __metadata("design:paramtypes", [Function, String, Object, Object]),
213
+ __metadata("design:returntype", Promise)
214
+ ], WebsitesController.prototype, "allowHost", null);
116
215
  __decorate([
117
216
  (0, interface_api_1.Post)(""),
118
217
  __param(0, (0, guards_1.AuthTenantOwner)()),
@@ -1 +1 @@
1
- {"version":3,"file":"websites.js","sourceRoot":"","sources":["../../src/routes/websites.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websites.js","sourceRoot":"","sources":["../../src/routes/websites.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { BannerContent } from "@antelopejs/interface-dms/base/banner";
2
+ import type { ComposedText } from "@antelopejs/interface-dms/base/types/composed-text";
3
+ import type { Website } from "@/db/tables/websites.table";
4
+ import { type MarketingChannel } from "@/types";
5
+ import { type RollupRead } from "./rollups";
6
+ import { type QueryWindow } from "./period";
7
+ export interface ChannelRow {
8
+ id: MarketingChannel;
9
+ sessions: number;
10
+ share: number;
11
+ delta: number | null;
12
+ }
13
+ export interface ChannelsPayload {
14
+ total: number;
15
+ items: ChannelRow[];
16
+ compareUnavailable: boolean;
17
+ }
18
+ export declare function compareHasTops(read: RollupRead): boolean;
19
+ export declare function channelsPayload(read: RollupRead): ChannelsPayload;
20
+ export interface CampaignRow {
21
+ key: string;
22
+ source?: string;
23
+ medium?: string;
24
+ campaign?: string;
25
+ channel: MarketingChannel;
26
+ sessions: number;
27
+ share: number;
28
+ daily: number[];
29
+ missingMedium: boolean;
30
+ }
31
+ export interface CampaignsReport {
32
+ rows: CampaignRow[];
33
+ totalSessions: number;
34
+ }
35
+ export declare function campaignsReport(read: Pick<RollupRead, "rows" | "window">): CampaignsReport;
36
+ export declare function readCampaignsReport(website: Website, window: QueryWindow): Promise<CampaignsReport>;
37
+ export interface CampaignTableRow {
38
+ _id: string;
39
+ campaign: string | null;
40
+ source: string | null;
41
+ medium: string | null;
42
+ channel: MarketingChannel;
43
+ sessions: number;
44
+ share: ComposedText;
45
+ daily: number[];
46
+ missingMedium: boolean;
47
+ }
48
+ export interface CampaignTableQuery {
49
+ search?: string;
50
+ channel?: string;
51
+ sortKey?: string;
52
+ sortDirection?: string;
53
+ offset?: number;
54
+ limit?: number;
55
+ }
56
+ export declare function campaignTablePayload(report: CampaignsReport, query: CampaignTableQuery): {
57
+ results: CampaignTableRow[];
58
+ total: number;
59
+ };
60
+ export type CampaignNoticeKind = "tagged" | "missing";
61
+ export declare function isCampaignNoticeKind(value: unknown): value is CampaignNoticeKind;
62
+ export declare function campaignNotice(report: CampaignsReport, kind: CampaignNoticeKind): BannerContent | null;
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compareHasTops = compareHasTops;
4
+ exports.channelsPayload = channelsPayload;
5
+ exports.campaignsReport = campaignsReport;
6
+ exports.readCampaignsReport = readCampaignsReport;
7
+ exports.campaignTablePayload = campaignTablePayload;
8
+ exports.isCampaignNoticeKind = isCampaignNoticeKind;
9
+ exports.campaignNotice = campaignNotice;
10
+ const bounded_cache_1 = require("./bounded-cache");
11
+ const composed_1 = require("./composed");
12
+ const types_1 = require("@/types");
13
+ const acquisition_1 = require("./acquisition");
14
+ const rollups_1 = require("./rollups");
15
+ const period_1 = require("./period");
16
+ function compareHasTops(read) {
17
+ return read.compareRows.every((row) => row.sessions <= 0 || Object.keys(row.tops?.topChannels ?? {}).length > 0);
18
+ }
19
+ function channelsPayload(read) {
20
+ const current = (0, rollups_1.mergeDimension)(read.rows, "topChannels");
21
+ const comparable = read.compare !== null && compareHasTops(read);
22
+ const previous = comparable
23
+ ? (0, rollups_1.mergeDimension)(read.compareRows, "topChannels")
24
+ : undefined;
25
+ const total = (0, rollups_1.sumRollups)(read.rows).sessions;
26
+ return {
27
+ total,
28
+ items: types_1.MARKETING_CHANNELS.map((id) => {
29
+ const sessions = current[id] ?? 0;
30
+ return {
31
+ id,
32
+ sessions,
33
+ share: (0, rollups_1.shareOf)(sessions, total),
34
+ delta: previous ? (0, rollups_1.percentChange)(sessions, previous[id]) : null,
35
+ };
36
+ }).sort((a, b) => b.sessions - a.sessions),
37
+ compareUnavailable: read.compare !== null && !comparable,
38
+ };
39
+ }
40
+ function campaignsReport(read) {
41
+ const totalSessions = (0, rollups_1.sumRollups)(read.rows).sessions;
42
+ const days = (0, period_1.windowDays)(read.window);
43
+ const dayIndex = new Map(days.map((day, index) => [day, index]));
44
+ const byKey = new Map();
45
+ for (const day of read.rows) {
46
+ const index = dayIndex.get(day.day);
47
+ for (const [key, count] of Object.entries(day.tops?.topCampaigns ?? {})) {
48
+ const parts = (0, acquisition_1.splitCampaignKey)(key);
49
+ if (!parts) {
50
+ continue;
51
+ }
52
+ const row = byKey.get(key) ?? {
53
+ key,
54
+ ...parts,
55
+ sessions: 0,
56
+ share: 0,
57
+ daily: days.map(() => 0),
58
+ missingMedium: !parts.medium,
59
+ };
60
+ row.sessions += count;
61
+ if (index !== undefined) {
62
+ row.daily[index] += count;
63
+ }
64
+ byKey.set(key, row);
65
+ }
66
+ }
67
+ const rows = [...byKey.values()]
68
+ .filter((row) => row.sessions > 0)
69
+ .map((row) => ({ ...row, share: (0, rollups_1.shareOf)(row.sessions, totalSessions) }))
70
+ .sort((a, b) => b.sessions - a.sessions);
71
+ return { rows, totalSessions };
72
+ }
73
+ const REPORT_TTL_MS = 10_000;
74
+ const reports = new bounded_cache_1.BoundedCache(REPORT_TTL_MS);
75
+ function readCampaignsReport(website, window) {
76
+ const key = `${website.tenantId}:${website._id}:${window.firstDay}:${window.lastDay}`;
77
+ const hit = reports.get(key);
78
+ if (hit) {
79
+ return hit.value;
80
+ }
81
+ const report = (0, rollups_1.readRollups)(website, window).then((rows) => campaignsReport({ rows, window }));
82
+ reports.set(key, report);
83
+ report.catch(() => reports.delete(key));
84
+ return report;
85
+ }
86
+ const SORT_KEYS = new Set(["campaign", "source", "medium", "sessions"]);
87
+ function matches(row, needle) {
88
+ return [row.source, row.medium, row.campaign].some((part) => part?.toLowerCase().includes(needle));
89
+ }
90
+ function channelMatcher(filter) {
91
+ if (!filter) {
92
+ return () => true;
93
+ }
94
+ const separator = filter.indexOf(":");
95
+ const mode = separator < 0 ? filter : filter.slice(0, separator);
96
+ const values = new Set(separator < 0 ? [] : filter.slice(separator + 1).split(","));
97
+ switch (mode) {
98
+ case "is":
99
+ return (channel) => values.has(channel);
100
+ case "is_not":
101
+ return (channel) => !values.has(channel);
102
+ case "is_empty":
103
+ return () => false;
104
+ default:
105
+ return () => true;
106
+ }
107
+ }
108
+ function byField(key) {
109
+ if (key === "sessions") {
110
+ return (a, b) => a.sessions - b.sessions;
111
+ }
112
+ const field = key;
113
+ return (a, b) => (a[field] ?? "").localeCompare(b[field] ?? "", undefined, {
114
+ numeric: true,
115
+ });
116
+ }
117
+ function campaignTablePayload(report, query) {
118
+ const needle = query.search?.trim().toLowerCase() ?? "";
119
+ const inChannel = channelMatcher(query.channel);
120
+ const matching = report.rows.filter((row) => inChannel(row.channel) && (!needle || matches(row, needle)));
121
+ const sortKey = query.sortKey && SORT_KEYS.has(query.sortKey) ? query.sortKey : undefined;
122
+ const direction = query.sortDirection === "desc" ? -1 : 1;
123
+ const sorted = sortKey
124
+ ? [...matching].sort((a, b) => direction * byField(sortKey)(a, b))
125
+ : matching;
126
+ const offset = Math.max(0, query.offset ?? 0);
127
+ const page = query.limit ? sorted.slice(offset, offset + query.limit) : [];
128
+ return {
129
+ results: page.map((row) => ({
130
+ _id: row.key,
131
+ campaign: row.campaign ?? null,
132
+ source: row.source ?? null,
133
+ medium: row.medium ?? null,
134
+ channel: row.channel,
135
+ sessions: row.sessions,
136
+ share: (0, composed_1.percentText)(row.share),
137
+ daily: row.daily,
138
+ missingMedium: row.missingMedium,
139
+ })),
140
+ total: matching.length,
141
+ };
142
+ }
143
+ const CAMPAIGNS_PREFIX = "$page.marketing.acquisition.campaigns.";
144
+ function isCampaignNoticeKind(value) {
145
+ return value === "tagged" || value === "missing";
146
+ }
147
+ function sessionsOf(rows) {
148
+ return rows.reduce((total, row) => total + row.sessions, 0);
149
+ }
150
+ function campaignNotice(report, kind) {
151
+ if (kind === "tagged") {
152
+ const tagged = sessionsOf(report.rows);
153
+ return tagged > 0
154
+ ? {
155
+ tone: "info",
156
+ size: "sm",
157
+ icon: "i-ph-tag",
158
+ title: {
159
+ key: `${CAMPAIGNS_PREFIX}tagged`,
160
+ params: {
161
+ count: { type: "count", value: tagged },
162
+ share: (0, composed_1.percentText)((0, rollups_1.shareOf)(tagged, report.totalSessions)),
163
+ },
164
+ },
165
+ }
166
+ : null;
167
+ }
168
+ const missing = sessionsOf(report.rows.filter((row) => row.missingMedium));
169
+ return missing > 0
170
+ ? {
171
+ tone: "warning",
172
+ size: "sm",
173
+ title: {
174
+ key: `${CAMPAIGNS_PREFIX}missing_title`,
175
+ params: { count: { type: "count", value: missing } },
176
+ },
177
+ description: `${CAMPAIGNS_PREFIX}missing_description`,
178
+ }
179
+ : null;
180
+ }
181
+ //# sourceMappingURL=acquisition-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquisition-report.js","sourceRoot":"","sources":["../../src/services/acquisition-report.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { MarketingChannel } from "@/types";
1
+ import { type MarketingChannel } from "@/types";
2
2
  export declare const CLICK_ID_PARAMS: readonly string[];
3
3
  export declare function resolveChannel(referrerDomain: string | undefined, utmMedium: string | undefined, clickIdParam?: string): MarketingChannel;
4
4
  export interface CampaignUtm {
@@ -6,10 +6,16 @@ export interface CampaignUtm {
6
6
  utmMedium?: string;
7
7
  utmCampaign?: string;
8
8
  }
9
- export declare function campaignKey(utm: CampaignUtm): string | undefined;
9
+ export interface CampaignSession extends CampaignUtm {
10
+ referrerDomain?: string;
11
+ clickIdParam?: string;
12
+ }
13
+ export declare function normalizeUtm(field: "source" | "medium" | "campaign" | "term" | "content", value: string | undefined): string | undefined;
14
+ export declare function campaignKey(session: CampaignSession): string | undefined;
10
15
  export interface CampaignKeyParts {
11
16
  source?: string;
12
17
  medium?: string;
13
18
  campaign?: string;
19
+ channel: MarketingChannel;
14
20
  }
15
- export declare function splitCampaignKey(key: string): CampaignKeyParts;
21
+ export declare function splitCampaignKey(key: string): CampaignKeyParts | undefined;
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CLICK_ID_PARAMS = void 0;
4
4
  exports.resolveChannel = resolveChannel;
5
+ exports.normalizeUtm = normalizeUtm;
5
6
  exports.campaignKey = campaignKey;
6
7
  exports.splitCampaignKey = splitCampaignKey;
8
+ const types_1 = require("@/types");
7
9
  const constants_1 = require("@/types/constants");
8
10
  const PAID_CLICK_IDS = new Set([
9
11
  "gclid",
@@ -88,6 +90,14 @@ const SOCIAL_DOMAINS = new Set([
88
90
  "wa.me",
89
91
  "pin.it",
90
92
  ]);
93
+ const EMAIL_MEDIUMS = new Set([
94
+ "email",
95
+ "e-mail",
96
+ "e_mail",
97
+ "newsletter",
98
+ "mail",
99
+ ]);
100
+ const REFERRAL_MEDIUMS = new Set(["referral", "affiliate", "partner"]);
91
101
  function hasListedLabel(domain, labels) {
92
102
  if (!domain) {
93
103
  return false;
@@ -127,27 +137,47 @@ function resolveChannel(referrerDomain, utmMedium, clickIdParam) {
127
137
  if (isPaidMedium(medium) || PAID_CLICK_IDS.has(clickId)) {
128
138
  return "paid";
129
139
  }
140
+ if (EMAIL_MEDIUMS.has(medium)) {
141
+ return "email";
142
+ }
130
143
  if (isSocialSource(referrerDomain, medium) || SOCIAL_CLICK_IDS.has(clickId)) {
131
144
  return "social";
132
145
  }
133
146
  if (medium === "organic" || isSearchDomain(referrerDomain)) {
134
147
  return "organic";
135
148
  }
136
- return referrerDomain ? "referral" : "direct";
149
+ return referrerDomain || REFERRAL_MEDIUMS.has(medium) ? "referral" : "direct";
150
+ }
151
+ function normalizeUtm(field, value) {
152
+ const trimmed = value?.trim();
153
+ if (!trimmed) {
154
+ return undefined;
155
+ }
156
+ return field === "source" || field === "medium"
157
+ ? trimmed.toLowerCase()
158
+ : trimmed;
137
159
  }
138
- function campaignKey(utm) {
139
- const parts = [utm.utmSource, utm.utmMedium, utm.utmCampaign];
160
+ function campaignKey(session) {
161
+ const parts = [session.utmSource, session.utmMedium, session.utmCampaign];
140
162
  if (parts.every((part) => !part)) {
141
163
  return undefined;
142
164
  }
143
- return parts.map((part) => part ?? "").join(constants_1.CAMPAIGN_KEY_SEPARATOR);
165
+ const channel = resolveChannel(session.referrerDomain, session.utmMedium, session.clickIdParam);
166
+ return [...parts.map((part) => part ?? ""), channel].join(constants_1.CAMPAIGN_KEY_SEPARATOR);
167
+ }
168
+ function isChannel(value) {
169
+ return types_1.MARKETING_CHANNELS.includes(value);
144
170
  }
145
171
  function splitCampaignKey(key) {
146
- const [source, medium, campaign] = key.split(constants_1.CAMPAIGN_KEY_SEPARATOR);
172
+ const [source, medium, campaign, channel] = key.split(constants_1.CAMPAIGN_KEY_SEPARATOR);
173
+ if (!isChannel(channel)) {
174
+ return undefined;
175
+ }
147
176
  return {
148
177
  source: source || undefined,
149
178
  medium: medium || undefined,
150
179
  campaign: campaign || undefined,
180
+ channel,
151
181
  };
152
182
  }
153
183
  //# sourceMappingURL=acquisition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"acquisition.js","sourceRoot":"","sources":["../../src/services/acquisition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acquisition.js","sourceRoot":"","sources":["../../src/services/acquisition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ModuleReadoutLine, ModuleStatus } from "@antelopejs/interface-dms/page";
2
+ export declare function moduleStatus(): ModuleStatus;
3
+ export declare function moduleReadout(): ModuleReadoutLine[];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.moduleStatus = moduleStatus;
4
+ exports.moduleReadout = moduleReadout;
5
+ const config_1 = require("@/config");
6
+ function moduleStatus() {
7
+ return (0, config_1.getConfig)().trackerEnabled ? "live" : "attention";
8
+ }
9
+ function moduleReadout() {
10
+ return (0, config_1.getConfig)().trackerEnabled
11
+ ? [{ text: "$page.marketing.catalog.collecting", tone: "success" }]
12
+ : [
13
+ { text: "$page.marketing.catalog.paused", tone: "warning" },
14
+ { text: "$page.marketing.catalog.resume_hint", tone: "info" },
15
+ ];
16
+ }
17
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/services/catalog.ts"],"names":[],"mappings":";;AAOA,oCAEC;AAOD,sCAOC;AAnBD,qCAAqC;AAGrC,SAAgB,YAAY;IAC1B,OAAO,IAAA,kBAAS,GAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;AAC3D,CAAC;AAOD,SAAgB,aAAa;IAC3B,OAAO,IAAA,kBAAS,GAAE,CAAC,cAAc;QAC/B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACnE,CAAC,CAAC;YACE,EAAE,IAAI,EAAE,gCAAgC,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3D,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,MAAM,EAAE;SAC9D,CAAC;AACR,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { Website } from "@/db/tables/websites.table";
2
- import { type TrackedEventInput } from "@/types";
3
2
  export interface CollectRequestMeta {
4
3
  ip: string;
5
4
  userAgent: string;
@@ -8,4 +7,4 @@ export interface CollectOutcome {
8
7
  accepted: number;
9
8
  dropped: number;
10
9
  }
11
- export declare function processCollectBatch(website: Website, events: TrackedEventInput[], meta: CollectRequestMeta): Promise<CollectOutcome>;
10
+ export declare function processCollectBatch(website: Website, events: unknown[], meta: CollectRequestMeta): Promise<CollectOutcome>;