@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
@@ -8,6 +8,7 @@ const db_1 = require("@/db");
8
8
  const types_1 = require("@/types");
9
9
  const constants_1 = require("@/types/constants");
10
10
  const acquisition_1 = require("./acquisition");
11
+ const bounded_cache_1 = require("./bounded-cache");
11
12
  const experiment_definitions_1 = require("./experiment-definitions");
12
13
  const geoip_1 = require("./geoip");
13
14
  const rollup_write_1 = require("./rollup-write");
@@ -17,13 +18,13 @@ const url_1 = require("./url");
17
18
  const user_agent_1 = require("./user-agent");
18
19
  const visitor_id_1 = require("./visitor-id");
19
20
  const EXPOSURE_KIND = "exposure";
20
- const NAME_REQUIRED_KINDS = new Set(["custom", EXPOSURE_KIND]);
21
+ const PAGEVIEW_KIND = "pageview";
21
22
  async function processCollectBatch(website, events, meta) {
22
23
  const now = new Date();
23
- const prepared = await acceptExposures(website, prepareEvents(events));
24
- const dropped = events.length - prepared.length;
24
+ const prepared = await acceptExposures(website, prepareEvents(website._id, events));
25
+ const refused = { accepted: 0, dropped: events.length };
25
26
  if (prepared.length === 0) {
26
- return { accepted: 0, dropped };
27
+ return refused;
27
28
  }
28
29
  const context = {
29
30
  website,
@@ -31,18 +32,38 @@ async function processCollectBatch(website, events, meta) {
31
32
  now,
32
33
  ownHostnames: collectOwnHostnames(website, prepared),
33
34
  };
34
- const resolution = await openSession(context, prepared[0], meta);
35
+ const resolution = await openSession(context, prepared, meta);
36
+ if (!resolution) {
37
+ return refused;
38
+ }
35
39
  const docs = prepared.map((event) => buildEventDoc(context, resolution.session, event));
36
40
  await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, website.tenantId).insertMany(docs);
37
41
  const previous = snapshotSession(resolution.session);
38
- await touchSession(context, resolution.session, docs);
42
+ await touchSession(context, resolution, docs);
39
43
  recordRollup(context, resolution, docs, previous);
40
- return { accepted: docs.length, dropped };
44
+ return { accepted: docs.length, dropped: events.length - docs.length };
45
+ }
46
+ const invalidEventLogGate = new bounded_cache_1.BoundedCache(constants_1.MS_PER_MINUTE);
47
+ function prepareEvents(websiteId, events) {
48
+ const prepared = [];
49
+ for (const event of events) {
50
+ const parsed = types_1.trackedEventSchema.safeParse(event);
51
+ if (parsed.success) {
52
+ const input = parsed.data;
53
+ prepared.push({ input, url: (0, url_1.parseTrackedUrl)(input.url) });
54
+ }
55
+ else {
56
+ warnInvalidEvent(websiteId, parsed.error.issues[0]);
57
+ }
58
+ }
59
+ return prepared;
41
60
  }
42
- function prepareEvents(events) {
43
- return events
44
- .filter(isAcceptable)
45
- .map((input) => ({ input, url: (0, url_1.parseTrackedUrl)(input.url) }));
61
+ function warnInvalidEvent(websiteId, issue) {
62
+ if (invalidEventLogGate.get(websiteId)) {
63
+ return;
64
+ }
65
+ invalidEventLogGate.set(websiteId, true);
66
+ logging_1.Logging.Warn(`[dms-marketing] collect: dropping invalid events for website '${websiteId}' (${issue?.path.join(".") ?? "event"}: ${issue?.message ?? "invalid"}).`);
46
67
  }
47
68
  async function acceptExposures(website, events) {
48
69
  if (!events.some((event) => event.input.kind === EXPOSURE_KIND)) {
@@ -52,21 +73,19 @@ async function acceptExposures(website, events) {
52
73
  return events.filter((event) => event.input.kind !== EXPOSURE_KIND ||
53
74
  running.has(event.input.name ?? ""));
54
75
  }
55
- function isAcceptable(event) {
56
- if (NAME_REQUIRED_KINDS.has(event.kind) && !event.name) {
57
- return false;
58
- }
59
- return (!event.data || JSON.stringify(event.data).length <= constants_1.MAX_EVENT_DATA_BYTES);
60
- }
61
76
  function collectOwnHostnames(website, events) {
62
77
  const candidates = [website.domain, ...events.map((e) => e.url.hostname)];
63
78
  return new Set(candidates.map(url_1.toBareHostname).filter((bare) => bare !== undefined));
64
79
  }
65
- async function openSession(context, first, meta) {
80
+ async function openSession(context, prepared, meta) {
81
+ const pageview = prepared.find((event) => event.input.kind === PAGEVIEW_KIND);
82
+ const first = pageview ?? prepared[0];
66
83
  return (0, sessionize_1.resolveSession)((0, interface_database_decorators_1.GetModel)(db_1.MarketingSessionsModel, context.website.tenantId), {
67
84
  websiteId: context.website._id,
68
85
  visitorId: context.visitorId,
69
86
  now: context.now,
87
+ startedAt: eventTimestamp(first.input, context.now),
88
+ opensSession: pageview !== undefined,
70
89
  sessionIdleTimeoutMs: (0, config_1.getConfig)().sessionIdleTimeout,
71
90
  entryUrl: first.url.path,
72
91
  referrerDomain: (0, url_1.extractReferrerDomain)(first.input.referrer, context.ownHostnames),
@@ -107,18 +126,23 @@ function snapshotSession(session) {
107
126
  exitUrl: session.exitUrl,
108
127
  };
109
128
  }
110
- async function touchSession(context, session, docs) {
129
+ async function touchSession(context, resolution, docs) {
130
+ const { session, extendsSession } = resolution;
111
131
  const pageviews = docs.filter((doc) => doc.kind === "pageview");
112
- const lastPageview = pageviews[pageviews.length - 1];
132
+ const lastPageview = extendsSession
133
+ ? pageviews[pageviews.length - 1]
134
+ : undefined;
113
135
  await (0, interface_database_decorators_1.GetModel)(db_1.MarketingSessionsModel, context.website.tenantId).recordActivity(session._id, {
114
136
  pageviews: pageviews.length,
115
137
  events: docs.length,
116
- lastSeenAt: context.now,
138
+ lastSeenAt: extendsSession ? context.now : undefined,
117
139
  exitUrl: lastPageview?.url,
118
140
  });
119
141
  session.pageviewsCount += pageviews.length;
120
142
  session.eventsCount += docs.length;
121
- session.lastSeenAt = context.now;
143
+ if (extendsSession) {
144
+ session.lastSeenAt = context.now;
145
+ }
122
146
  if (lastPageview) {
123
147
  session.exitUrl = lastPageview.url;
124
148
  }
@@ -165,7 +189,8 @@ function bounceDelta(batch) {
165
189
  return Number(isBounced) - Number(wasBounced);
166
190
  }
167
191
  function durationDelta(batch, now) {
168
- return Math.max(0, now.getTime() - batch.previous.lastSeenAt.getTime());
192
+ const gap = now.getTime() - batch.previous.lastSeenAt.getTime();
193
+ return gap < (0, config_1.getConfig)().sessionIdleTimeout ? Math.max(0, gap) : 0;
169
194
  }
170
195
  function recordRollup(context, resolution, docs, previous) {
171
196
  const batch = {
@@ -186,7 +211,7 @@ function recordRollup(context, resolution, docs, previous) {
186
211
  tops: collectTops(batch),
187
212
  drops: collectDrops(batch),
188
213
  };
189
- void (0, rollup_write_1.addDailyMarketingStats)((0, interface_database_decorators_1.GetModel)(db_1.WebsiteStatisticsModel, context.website.tenantId), context.website._id, (0, rollup_write_1.getUtcMidnight)(context.now), delta).catch((err) => {
214
+ void (0, rollup_write_1.addDailyMarketingStats)((0, interface_database_decorators_1.GetModel)(db_1.WebsiteStatisticsModel, context.website.tenantId), context.website._id, (0, rollup_write_1.getUtcMidnight)(docs[0]?.timestamp ?? context.now), delta).catch((err) => {
190
215
  logging_1.Logging.Error("[dms-marketing] daily rollup write failed:", err);
191
216
  });
192
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/services/collect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/services/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { BlockText, ComposedText } from "@antelopejs/interface-dms/base/types/composed-text";
2
+ import type { Tone } from "@antelopejs/interface-dms/base/types/tone";
3
+ import type { ComparisonKind } from "./period";
4
+ export declare function percentText(value: number | null): BlockText;
5
+ export declare function durationText(seconds: number): ComposedText;
6
+ export declare function decimalText(value: number | null): BlockText | number;
7
+ export type DeltaUnit = "points" | "seconds" | "number";
8
+ export declare function deltaText(delta: number | null, unit: DeltaUnit, comparison?: ComparisonKind): ComposedText | undefined;
9
+ export declare function deltaTone(delta: number | null, invert?: boolean): Tone;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.percentText = percentText;
4
+ exports.durationText = durationText;
5
+ exports.decimalText = decimalText;
6
+ exports.deltaText = deltaText;
7
+ exports.deltaTone = deltaTone;
8
+ const constants_1 = require("@/types/constants");
9
+ const COMPOSE_PREFIX = "$page.marketing.compose.";
10
+ const DECIMALS = 10;
11
+ const NO_VALUE = "—";
12
+ const FLAT_DELTA = 0.05;
13
+ function oneDecimal(value) {
14
+ return Math.round(value * DECIMALS) / DECIMALS;
15
+ }
16
+ function compose(key, params = {}) {
17
+ return { key: `${COMPOSE_PREFIX}${key}`, params };
18
+ }
19
+ function percentText(value) {
20
+ return value === null
21
+ ? NO_VALUE
22
+ : compose("percent", {
23
+ value: { type: "number", value: oneDecimal(value) },
24
+ });
25
+ }
26
+ function durationText(seconds) {
27
+ const total = Math.max(0, Math.round(seconds));
28
+ const hours = Math.floor(total / constants_1.SECONDS_PER_HOUR);
29
+ const minutes = Math.floor((total % constants_1.SECONDS_PER_HOUR) / constants_1.SECONDS_PER_MINUTE);
30
+ const rest = total % constants_1.SECONDS_PER_MINUTE;
31
+ if (hours > 0) {
32
+ return compose("duration_hours", { hours, minutes });
33
+ }
34
+ return minutes > 0
35
+ ? compose("duration_minutes", { minutes, seconds: rest })
36
+ : compose("duration_seconds", { seconds: rest });
37
+ }
38
+ function decimalText(value) {
39
+ return value === null ? NO_VALUE : oneDecimal(value);
40
+ }
41
+ function deltaText(delta, unit, comparison = "previous-period") {
42
+ if (delta === null) {
43
+ return undefined;
44
+ }
45
+ const rounded = unit === "seconds" ? Math.round(delta) : oneDecimal(delta);
46
+ const sign = rounded > 0 ? "+" : rounded < 0 ? "−" : "±";
47
+ const magnitude = Math.abs(rounded);
48
+ const value = unit === "seconds"
49
+ ? durationText(magnitude)
50
+ : compose(unit === "points" ? "points" : "number", {
51
+ value: { type: "number", value: magnitude },
52
+ });
53
+ return compose(comparison === "previous-year" ? "delta_previous_year" : "delta", { sign, value });
54
+ }
55
+ function deltaTone(delta, invert = false) {
56
+ if (delta === null || Math.abs(delta) < FLAT_DELTA) {
57
+ return "neutral";
58
+ }
59
+ const better = invert ? delta < 0 : delta > 0;
60
+ return better ? "success" : "error";
61
+ }
62
+ //# sourceMappingURL=composed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composed.js","sourceRoot":"","sources":["../../src/services/composed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type RequestContext } from "@antelopejs/interface-api";
2
+ import type { User } from "@antelopejs/interface-dms/auth/db";
3
+ import type { Website } from "@/db/tables/websites.table";
4
+ export type WebsiteState = "live" | "waiting" | "paused";
5
+ export interface ContextWebsite {
6
+ id: string;
7
+ name: string;
8
+ domain: string;
9
+ state: WebsiteState;
10
+ lastActivityAt: number | null;
11
+ }
12
+ export interface MarketingContextPayload {
13
+ websites: ContextWebsite[];
14
+ selectedId: string | null;
15
+ }
16
+ export declare function toContextWebsite(website: Website, activity: ReadonlyMap<string, number>): ContextWebsite;
17
+ export declare function loadWebsiteActivity(tenantId: string, websites: Website[]): Promise<Map<string, number>>;
18
+ export declare function resolveContextWebsite(context: RequestContext, user: User, website: unknown): Promise<Website>;
19
+ export declare function loadMarketingContext(context: RequestContext, user: User): Promise<MarketingContextPayload>;
20
+ export declare function selectContextWebsite(context: RequestContext, user: User, websiteId: string): Promise<void>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toContextWebsite = toContextWebsite;
4
+ exports.loadWebsiteActivity = loadWebsiteActivity;
5
+ exports.resolveContextWebsite = resolveContextWebsite;
6
+ exports.loadMarketingContext = loadMarketingContext;
7
+ exports.selectContextWebsite = selectContextWebsite;
8
+ const interface_api_1 = require("@antelopejs/interface-api");
9
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
10
+ const request_tenant_1 = require("@antelopejs/interface-dms/request-tenant");
11
+ const db_1 = require("@/db");
12
+ const constants_1 = require("@/types/constants");
13
+ const query_param_1 = require("./query-param");
14
+ const tenant_website_1 = require("./tenant-website");
15
+ const NO_WEBSITE_MESSAGE = "$page.marketing.errors.no_website";
16
+ function websiteState(website, lastActivityAt) {
17
+ if (!website.trackingEnabled) {
18
+ return "paused";
19
+ }
20
+ return lastActivityAt === null ? "waiting" : "live";
21
+ }
22
+ function toContextWebsite(website, activity) {
23
+ const lastActivityAt = activity.get(website._id) ?? null;
24
+ return {
25
+ id: website._id,
26
+ name: website.name,
27
+ domain: website.domain,
28
+ state: websiteState(website, lastActivityAt),
29
+ lastActivityAt,
30
+ };
31
+ }
32
+ async function loadWebsiteActivity(tenantId, websites) {
33
+ if (websites.length === 0) {
34
+ return new Map();
35
+ }
36
+ return (0, interface_database_decorators_1.GetModel)(db_1.MarketingSessionsModel, tenantId).getLastActivityByWebsites(websites.map((website) => website._id));
37
+ }
38
+ async function preferredWebsiteId(tenantId, user) {
39
+ return (0, interface_database_decorators_1.GetModel)(db_1.MarketingPreferencesModel, tenantId).getWebsiteId(user._id);
40
+ }
41
+ async function resolveContextWebsite(context, user, website) {
42
+ const wanted = (0, query_param_1.queryString)(website);
43
+ if (wanted) {
44
+ return (0, tenant_website_1.requireTenantWebsite)(context, wanted);
45
+ }
46
+ const tenantId = (0, request_tenant_1.getRequestTenantId)(context);
47
+ const preferred = await preferredWebsiteId(tenantId, user);
48
+ const saved = preferred
49
+ ? await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).get(preferred)
50
+ : undefined;
51
+ if (saved?.tenantId === tenantId) {
52
+ return saved;
53
+ }
54
+ const [mostActive] = await (0, tenant_website_1.listTenantWebsites)(tenantId);
55
+ if (!mostActive) {
56
+ throw new interface_api_1.HTTPResult(constants_1.HTTP_NOT_FOUND, NO_WEBSITE_MESSAGE);
57
+ }
58
+ return mostActive;
59
+ }
60
+ async function loadMarketingContext(context, user) {
61
+ const tenantId = (0, request_tenant_1.getRequestTenantId)(context);
62
+ const all = await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).getByTenant(tenantId);
63
+ const activity = await loadWebsiteActivity(tenantId, all);
64
+ const websites = [...all].sort((a, b) => (activity.get(b._id) ?? 0) - (activity.get(a._id) ?? 0));
65
+ const preferred = await preferredWebsiteId(tenantId, user);
66
+ const selected = websites.find((site) => site._id === preferred) ?? websites[0];
67
+ return {
68
+ websites: websites.map((site) => toContextWebsite(site, activity)),
69
+ selectedId: selected?._id ?? null,
70
+ };
71
+ }
72
+ async function selectContextWebsite(context, user, websiteId) {
73
+ const website = await (0, tenant_website_1.requireTenantWebsite)(context, websiteId);
74
+ await (0, interface_database_decorators_1.GetModel)(db_1.MarketingPreferencesModel, (0, request_tenant_1.getRequestTenantId)(context)).setWebsiteId(user._id, website._id);
75
+ }
76
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/services/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { StatGroupItem } from "@antelopejs/interface-dms/base/stat-group";
2
+ import type { BlockText } from "@antelopejs/interface-dms/base/types/composed-text";
3
+ import type { Website } from "@/db/tables/websites.table";
4
+ import type { TopDimension } from "@/types";
5
+ import type { ComparisonKind } from "./period";
6
+ import { type RollupRead, type RollupTotals } from "./rollups";
7
+ export declare const KPI_METRICS: {
8
+ readonly pageviews: (totals: RollupTotals) => number;
9
+ readonly sessions: (totals: RollupTotals) => number;
10
+ readonly "new-visitors": (totals: RollupTotals) => number;
11
+ readonly "custom-events": (totals: RollupTotals) => number;
12
+ };
13
+ export type KpiMetric = keyof typeof KPI_METRICS;
14
+ export declare function isKpiMetric(value: unknown): value is KpiMetric;
15
+ export interface KpiPayload {
16
+ value: number;
17
+ previousValue?: number;
18
+ delta?: number;
19
+ sparkline: number[];
20
+ }
21
+ export declare function kpiPayload(read: RollupRead, metric: KpiMetric): KpiPayload;
22
+ interface ChartPoint {
23
+ x: number;
24
+ y: number | null;
25
+ }
26
+ interface ChartSeries {
27
+ name: string;
28
+ data: ChartPoint[];
29
+ color?: string;
30
+ strokeDashArray?: number;
31
+ }
32
+ export interface TrafficPayload {
33
+ value: number;
34
+ previousValue?: number;
35
+ delta?: number;
36
+ series: ChartSeries[];
37
+ comparisonSeries?: ChartSeries[];
38
+ }
39
+ export declare function trafficPayload(read: RollupRead, metric: KpiMetric, website: Website, comparison: ComparisonKind): Promise<TrafficPayload>;
40
+ export declare function qualityItems(read: RollupRead, comparison: ComparisonKind): StatGroupItem[];
41
+ export interface TopRow {
42
+ id: string;
43
+ title: string;
44
+ value: number;
45
+ description?: BlockText;
46
+ share: number;
47
+ delta?: number | null;
48
+ to?: string;
49
+ icon?: string;
50
+ tag?: string;
51
+ }
52
+ export type TopLabelKind = "raw" | "channel" | "country" | "language" | "device";
53
+ export interface TopTabDefinition {
54
+ id: string;
55
+ label: string;
56
+ dimension: TopDimension;
57
+ labelKind?: TopLabelKind;
58
+ link?: (key: string) => string;
59
+ }
60
+ export interface TopTabPayload {
61
+ id: string;
62
+ label: string;
63
+ labelKind: TopLabelKind;
64
+ total: number;
65
+ items: TopRow[];
66
+ }
67
+ export declare function pagesLink(path?: string): string;
68
+ export declare function acquisitionLink(channel?: string): string;
69
+ export declare function eventFunnelLink(name: string): string;
70
+ export declare function isTopGroup(value: unknown): value is string;
71
+ export declare function topGroupPayload(read: RollupRead, group: string): TopTabPayload[];
72
+ export declare function goalEventNames(website: Website): Promise<Set<string>>;
73
+ export declare function devicesPayload(read: RollupRead): TopRow[];
74
+ export {};