@antelopejs/dms-marketing 0.3.3 → 0.4.1

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 (289) 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 -4
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/index.js +18 -3
  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 +1 -2
  259. package/frontend-vue/pnpm-lock.yaml +51 -19
  260. package/frontend-vue/tests/drafts.test.ts +3 -3
  261. package/frontend-vue/tests/format.test.ts +73 -0
  262. package/frontend-vue/tests/funnel-draft.test.ts +194 -0
  263. package/frontend-vue/tests/heatmap.test.ts +32 -0
  264. package/frontend-vue/tests/i18n.test.ts +87 -4
  265. package/frontend-vue/tests/latest-request.test.ts +6 -3
  266. package/frontend-vue/tests/locale-typography.test.ts +115 -0
  267. package/frontend-vue/tests/registration.test.ts +17 -11
  268. package/frontend-vue/tests/routes.test.ts +67 -7
  269. package/frontend-vue/tests/server-parity.test.ts +77 -0
  270. package/frontend-vue/tests/stubs/frontend-module.ts +18 -3
  271. package/frontend-vue/vitest.config.ts +3 -1
  272. package/package.json +10 -8
  273. package/static/snapshot.js +46 -16
  274. package/static/tracker.js +139 -48
  275. package/dist/pages/campaigns/page.js.map +0 -1
  276. package/frontend-vue/app/components/CampaignsView.vue +0 -330
  277. package/frontend-vue/app/components/FunnelDetail.vue +0 -1026
  278. package/frontend-vue/app/components/FunnelsView.vue +0 -493
  279. package/frontend-vue/app/components/NoWebsiteState.vue +0 -18
  280. package/frontend-vue/app/components/OverviewView.vue +0 -493
  281. package/frontend-vue/app/components/PagesView.vue +0 -391
  282. package/frontend-vue/app/components/TextKpiCard.vue +0 -28
  283. package/frontend-vue/app/components/TopListTabsCard.vue +0 -162
  284. package/frontend-vue/app/composables/useChildId.ts +0 -13
  285. package/frontend-vue/app/composables/useMarketingPeriod.ts +0 -65
  286. package/frontend-vue/app/composables/useMarketingWebsiteForm.ts +0 -69
  287. package/frontend-vue/app/composables/useMarketingWebsites.ts +0 -80
  288. package/frontend-vue/app/utils/dmsComponent.ts +0 -18
  289. package/frontend-vue/tests/period.test.ts +0 -35
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.funnelTablePayload = funnelTablePayload;
4
+ exports.winnerBanner = winnerBanner;
5
+ exports.funnelDeleteConfirmation = funnelDeleteConfirmation;
6
+ const constants_1 = require("@/types/constants");
7
+ const composed_1 = require("./composed");
8
+ const ROW_PREFIX = "$page.marketing.funnels.row.";
9
+ const WINNER_PREFIX = "$page.marketing.funnels.winner.";
10
+ const COVERAGE_PREFIX = "$page.marketing.funnels.coverage.";
11
+ const COMPOSE_PREFIX = "$page.marketing.compose.";
12
+ const DELETE_PREFIX = "$page.marketing.funnel.delete.";
13
+ const LETTER_A = 65;
14
+ const KIND_ICONS = { funnel: "i-ph-funnel", ab: "i-ph-flask" };
15
+ function letter(index) {
16
+ return String.fromCharCode(LETTER_A + index);
17
+ }
18
+ function signedPercent(value) {
19
+ return {
20
+ key: `${COMPOSE_PREFIX}signed`,
21
+ params: {
22
+ sign: value > 0 ? "+" : value < 0 ? "−" : "±",
23
+ value: (0, composed_1.percentText)(Math.abs(value)),
24
+ },
25
+ };
26
+ }
27
+ function detailOf(row) {
28
+ if (row.unseenStep) {
29
+ return {
30
+ text: { key: `${ROW_PREFIX}unseen`, params: { step: row.unseenStep } },
31
+ tone: "warning",
32
+ };
33
+ }
34
+ const experiment = row.experiment;
35
+ if (!experiment) {
36
+ return {
37
+ text: {
38
+ key: `${ROW_PREFIX}plain`,
39
+ params: {
40
+ steps: { type: "count", value: row.steps.length },
41
+ hours: row.windowHours,
42
+ },
43
+ },
44
+ };
45
+ }
46
+ if (experiment.status === "draft") {
47
+ return {
48
+ text: {
49
+ key: `${ROW_PREFIX}draft`,
50
+ params: {
51
+ key: experiment.key,
52
+ count: { type: "count", value: experiment.variations },
53
+ },
54
+ },
55
+ };
56
+ }
57
+ if (experiment.exposed === 0) {
58
+ return {
59
+ text: { key: `${ROW_PREFIX}no_traffic`, params: { key: experiment.key } },
60
+ tone: experiment.status === "running" ? "warning" : undefined,
61
+ };
62
+ }
63
+ const leader = experiment.leader;
64
+ if (!leader) {
65
+ return {
66
+ text: { key: `${ROW_PREFIX}no_leader`, params: { key: experiment.key } },
67
+ };
68
+ }
69
+ if (leader.uplift <= 0) {
70
+ return {
71
+ text: {
72
+ key: `${ROW_PREFIX}control_leads`,
73
+ params: { key: experiment.key },
74
+ },
75
+ };
76
+ }
77
+ return {
78
+ text: {
79
+ key: `${ROW_PREFIX}leader`,
80
+ params: {
81
+ key: experiment.key,
82
+ letter: letter(leader.index),
83
+ lift: signedPercent(leader.uplift),
84
+ },
85
+ },
86
+ };
87
+ }
88
+ function stepsOf(row) {
89
+ return row.steps.map((step) => step.kind === "custom"
90
+ ? { label: step.value, tone: "primary", variant: "outline" }
91
+ : { label: step.value });
92
+ }
93
+ const day = (value) => ({
94
+ type: "date",
95
+ value,
96
+ format: "day",
97
+ });
98
+ function comparisonOf(row) {
99
+ const experiment = row.experiment;
100
+ if (experiment?.status === "running" && experiment.since) {
101
+ return {
102
+ text: {
103
+ key: `${ROW_PREFIX}since`,
104
+ params: { date: day(experiment.since) },
105
+ },
106
+ tone: "dimmed",
107
+ };
108
+ }
109
+ if (experiment?.status === "stopped" &&
110
+ experiment.since &&
111
+ experiment.until) {
112
+ return {
113
+ text: {
114
+ key: `${COMPOSE_PREFIX}range`,
115
+ params: { from: day(experiment.since), to: day(experiment.until) },
116
+ },
117
+ tone: "dimmed",
118
+ };
119
+ }
120
+ if (row.deltaPoints === null) {
121
+ return null;
122
+ }
123
+ const rounded = Math.round(row.deltaPoints * 10) / 10;
124
+ const sign = rounded > 0 ? "+" : rounded < 0 ? "−" : "±";
125
+ const tone = (0, composed_1.deltaTone)(row.deltaPoints);
126
+ return {
127
+ text: {
128
+ key: `${COMPOSE_PREFIX}delta`,
129
+ params: {
130
+ sign,
131
+ value: {
132
+ key: `${COMPOSE_PREFIX}points`,
133
+ params: { value: { type: "number", value: Math.abs(rounded) } },
134
+ },
135
+ },
136
+ },
137
+ tone: tone === "success" || tone === "error" ? tone : "muted",
138
+ };
139
+ }
140
+ function funnelTablePayload(rows, kind) {
141
+ const results = rows
142
+ .filter((row) => !kind || row.kind === kind)
143
+ .map((row) => ({
144
+ _id: row.id,
145
+ name: row.name,
146
+ icon: KIND_ICONS[row.kind],
147
+ detail: detailOf(row),
148
+ steps: stepsOf(row),
149
+ kind: row.kind,
150
+ entered: row.entered,
151
+ completed: row.completed,
152
+ conversion: row.conversion,
153
+ conversionText: (0, composed_1.percentText)(row.conversion),
154
+ comparison: comparisonOf(row),
155
+ status: row.experiment?.status ?? null,
156
+ }));
157
+ return { results, total: results.length };
158
+ }
159
+ function winnerOf(rows) {
160
+ const winner = rows.find((row) => row.experiment?.status === "running" && row.experiment.ready);
161
+ const experiment = winner?.experiment;
162
+ const leader = experiment?.leader;
163
+ if (!winner || !experiment || !leader) {
164
+ return null;
165
+ }
166
+ return {
167
+ tone: "success",
168
+ icon: "i-ph-flask",
169
+ title: {
170
+ key: `${WINNER_PREFIX}title`,
171
+ params: {
172
+ name: winner.name,
173
+ lift: (0, composed_1.percentText)(leader.uplift),
174
+ },
175
+ },
176
+ description: {
177
+ key: `${WINNER_PREFIX}description`,
178
+ params: {
179
+ low: signedPercent(experiment.upliftLow ?? 0),
180
+ high: signedPercent(experiment.upliftHigh ?? 0),
181
+ exposed: { type: "number", value: experiment.exposed },
182
+ days: { type: "count", value: Math.floor(experiment.days) },
183
+ },
184
+ },
185
+ actions: [
186
+ {
187
+ label: `${WINNER_PREFIX}review`,
188
+ to: `${constants_1.MARKETING_MODULE_PATH}/funnel?id=${encodeURIComponent(winner.id)}`,
189
+ color: "success",
190
+ },
191
+ ],
192
+ };
193
+ }
194
+ function coverageBanner(coverage) {
195
+ if (coverage.since === null || (!coverage.period && !coverage.previous)) {
196
+ return null;
197
+ }
198
+ const params = { date: day(coverage.since) };
199
+ return {
200
+ tone: "info",
201
+ size: "sm",
202
+ icon: "i-ph-clock-counter-clockwise",
203
+ title: coverage.period
204
+ ? { key: `${COVERAGE_PREFIX}period_title`, params }
205
+ : `${COVERAGE_PREFIX}previous_title`,
206
+ description: { key: `${COVERAGE_PREFIX}description`, params },
207
+ };
208
+ }
209
+ function winnerBanner(rows, coverage) {
210
+ if (coverage?.period) {
211
+ return coverageBanner(coverage);
212
+ }
213
+ return winnerOf(rows) ?? (coverage ? coverageBanner(coverage) : null);
214
+ }
215
+ function funnelDeleteConfirmation(funnel) {
216
+ const running = funnel.experiment?.status === "running";
217
+ return {
218
+ title: `${DELETE_PREFIX}title`,
219
+ description: `${DELETE_PREFIX}${running ? "description_running" : "description"}`,
220
+ params: { name: funnel.name, key: funnel.experiment?.key ?? "" },
221
+ color: "error",
222
+ icon: "i-ph-trash",
223
+ confirmLabel: `${DELETE_PREFIX}confirm`,
224
+ confirmText: funnel.name,
225
+ impact: running
226
+ ? [{ icon: "i-ph-stop", label: `${DELETE_PREFIX}impact_running` }]
227
+ : undefined,
228
+ };
229
+ }
230
+ //# sourceMappingURL=funnels-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnels-table.js","sourceRoot":"","sources":["../../src/services/funnels-table.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,22 @@
1
1
  import type { MarketingHeatmapPayload, MarketingHeatmapQuery } from "@antelopejs/interface-dms-marketing";
2
+ import { type QueryWindow } from "./period";
2
3
  export interface MarketingScrollDepthPayload {
3
4
  views: number;
4
5
  reached: number[];
5
6
  truncated: boolean;
6
7
  }
7
- export declare function computeClickHeatmap(tenantId: string, websiteIds: string[], path: string, period?: string): Promise<MarketingHeatmapPayload>;
8
- export declare function computeScrollDepth(tenantId: string, websiteIds: string[], path: string, period?: string): Promise<MarketingScrollDepthPayload>;
9
- export declare function resetHeatmap(tenantId: string, websiteId: string, path?: string): Promise<number>;
8
+ export declare function computeClickHeatmap(tenantId: string, websiteIds: string[], path: string, window: QueryWindow): Promise<MarketingHeatmapPayload>;
9
+ export declare function computeScrollDepth(tenantId: string, websiteIds: string[], path: string, window: QueryWindow): Promise<MarketingScrollDepthPayload>;
10
+ export interface PageActivity {
11
+ clicks: Map<string, number>;
12
+ sampled: Map<string, number>;
13
+ sampleRate: number | null;
14
+ }
15
+ export declare function computePageActivity(tenantId: string, websiteId: string, window: QueryWindow): Promise<PageActivity>;
16
+ export interface HeatmapData {
17
+ events: number;
18
+ snapshots: number;
19
+ }
20
+ export declare function countHeatmapData(tenantId: string, websiteId: string, path?: string): Promise<HeatmapData>;
21
+ export declare function resetHeatmap(tenantId: string, websiteId: string, path?: string): Promise<HeatmapData>;
10
22
  export declare function buildTenantHeatmap(query: MarketingHeatmapQuery): Promise<MarketingHeatmapPayload>;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.computeClickHeatmap = computeClickHeatmap;
4
4
  exports.computeScrollDepth = computeScrollDepth;
5
+ exports.computePageActivity = computePageActivity;
6
+ exports.countHeatmapData = countHeatmapData;
5
7
  exports.resetHeatmap = resetHeatmap;
6
8
  exports.buildTenantHeatmap = buildTenantHeatmap;
7
9
  const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
@@ -10,6 +12,7 @@ const constants_1 = require("@/types/constants");
10
12
  const period_1 = require("./period");
11
13
  const snapshots_1 = require("./snapshots");
12
14
  const CLICK_FIELDS = ["data"];
15
+ const MIN_PAGEVIEWS_FOR_SAMPLE_RATE = 20;
13
16
  const EMPTY_HEATMAP = {
14
17
  points: [],
15
18
  maxWeight: 0,
@@ -114,15 +117,14 @@ function bucketClicks(payloads) {
114
117
  totalClicks,
115
118
  };
116
119
  }
117
- async function computeClickHeatmap(tenantId, websiteIds, path, period) {
120
+ async function computeClickHeatmap(tenantId, websiteIds, path, window) {
118
121
  if (websiteIds.length === 0) {
119
122
  return EMPTY_HEATMAP;
120
123
  }
121
- const days = (0, period_1.parsePeriodDays)(period);
122
124
  const events = await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).queryRange({
123
125
  websiteIds,
124
- since: (0, period_1.periodStart)(days),
125
- until: new Date(),
126
+ since: window.since,
127
+ until: window.until,
126
128
  kinds: ["click"],
127
129
  url: path,
128
130
  limit: constants_1.MAX_HEATMAP_EVENTS,
@@ -148,22 +150,63 @@ function cumulativeReach(buckets) {
148
150
  }
149
151
  return { views, reached };
150
152
  }
151
- async function computeScrollDepth(tenantId, websiteIds, path, period) {
153
+ async function computeScrollDepth(tenantId, websiteIds, path, window) {
152
154
  if (websiteIds.length === 0) {
153
155
  return EMPTY_SCROLL_DEPTH;
154
156
  }
155
- const days = (0, period_1.parsePeriodDays)(period);
156
157
  const buckets = await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).countScrollDepths({
157
158
  websiteIds,
158
- since: (0, period_1.periodStart)(days),
159
- until: new Date(),
159
+ since: window.since,
160
+ until: window.until,
160
161
  url: path,
161
162
  });
162
163
  return { ...cumulativeReach(buckets), truncated: false };
163
164
  }
165
+ async function countByPath(tenantId, websiteId, window, kind) {
166
+ const rows = (await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId)
167
+ .table.getAll([websiteId], "websiteId")
168
+ .filter((doc) => doc.key("timestamp").ge(window.since))
169
+ .filter((doc) => doc.key("timestamp").le(window.until))
170
+ .filter((doc) => doc.key("kind").eq(kind))
171
+ .group("url", (stream, url) => ({ url, count: stream.count() }))
172
+ .run());
173
+ return new Map(rows.map((row) => [row.url, row.count]));
174
+ }
175
+ async function computePageActivity(tenantId, websiteId, window) {
176
+ const [clicks, sampled, declared] = await Promise.all([
177
+ countByPath(tenantId, websiteId, window, "click"),
178
+ countByPath(tenantId, websiteId, window, "scroll"),
179
+ (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).countDeclaredSampleRates({
180
+ websiteIds: [websiteId],
181
+ since: window.since,
182
+ until: window.until,
183
+ }),
184
+ ]);
185
+ let pageviews = 0;
186
+ let sampledShare = 0;
187
+ for (const { sample, views } of declared) {
188
+ pageviews += views;
189
+ sampledShare += sample * views;
190
+ }
191
+ return {
192
+ clicks,
193
+ sampled,
194
+ sampleRate: pageviews >= MIN_PAGEVIEWS_FOR_SAMPLE_RATE
195
+ ? sampledShare / pageviews
196
+ : null,
197
+ };
198
+ }
199
+ async function countHeatmapData(tenantId, websiteId, path) {
200
+ const [events, snapshots] = await Promise.all([
201
+ (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).countHeatmapEvents(websiteId, path),
202
+ (0, interface_database_decorators_1.GetModel)(db_1.PageSnapshotsModel, tenantId).countByWebsite(websiteId, path),
203
+ ]);
204
+ return { events, snapshots };
205
+ }
164
206
  async function resetHeatmap(tenantId, websiteId, path) {
165
- await (0, snapshots_1.deleteSnapshots)(tenantId, websiteId, path);
166
- return (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).deleteHeatmapEvents(websiteId, path);
207
+ const snapshots = await (0, snapshots_1.deleteSnapshots)(tenantId, websiteId, path);
208
+ const events = await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, tenantId).deleteHeatmapEvents(websiteId, path);
209
+ return { events, snapshots };
167
210
  }
168
211
  async function tenantHeatmapScope(tenantId, websiteId) {
169
212
  const websites = (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel);
@@ -175,6 +218,6 @@ async function tenantHeatmapScope(tenantId, websiteId) {
175
218
  }
176
219
  async function buildTenantHeatmap(query) {
177
220
  const websiteIds = await tenantHeatmapScope(query.tenantId, query.websiteId);
178
- return computeClickHeatmap(query.tenantId, websiteIds, query.path, query.period);
221
+ return computeClickHeatmap(query.tenantId, websiteIds, query.path, (0, period_1.resolveQueryWindow)({ from: query.from, to: query.to }));
179
222
  }
180
223
  //# sourceMappingURL=heatmap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap.js","sourceRoot":"","sources":["../../src/services/heatmap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heatmap.js","sourceRoot":"","sources":["../../src/services/heatmap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Website } from "@/db/tables/websites.table";
2
+ import type { KpiMetric } from "./dashboard";
3
+ export declare const HOURS_PER_DAY: number;
4
+ export declare function hourlyValues(website: Website, since: number, hours: number, metric: KpiMetric): Promise<number[] | null>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HOURS_PER_DAY = void 0;
4
+ exports.hourlyValues = hourlyValues;
5
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
6
+ const config_1 = require("@/config");
7
+ const db_1 = require("@/db");
8
+ const constants_1 = require("@/types/constants");
9
+ const HOURLY_READS = {
10
+ pageviews: { kind: "pageview", perSession: false },
11
+ sessions: { kind: "pageview", perSession: true },
12
+ "custom-events": { kind: "custom", perSession: false },
13
+ };
14
+ exports.HOURS_PER_DAY = constants_1.MS_PER_DAY / constants_1.MS_PER_HOUR;
15
+ async function hourlyValues(website, since, hours, metric) {
16
+ const reading = HOURLY_READS[metric];
17
+ if (!reading || since < Date.now() - (0, config_1.getConfig)().rawEventsRetention) {
18
+ return null;
19
+ }
20
+ const buckets = await (0, interface_database_decorators_1.GetModel)(db_1.MarketingEventsModel, website.tenantId).countHourly({
21
+ websiteIds: [website._id],
22
+ since: new Date(since),
23
+ until: new Date(since + hours * constants_1.MS_PER_HOUR - 1),
24
+ kind: reading.kind,
25
+ perSession: reading.perSession,
26
+ });
27
+ const values = Array.from({ length: hours }, () => 0);
28
+ for (const { hour, count } of buckets) {
29
+ if (hour >= 0 && hour < hours) {
30
+ values[hour] += count;
31
+ }
32
+ }
33
+ return values;
34
+ }
35
+ //# sourceMappingURL=hourly-traffic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hourly-traffic.js","sourceRoot":"","sources":["../../src/services/hourly-traffic.ts"],"names":[],"mappings":";;;AA6BA,oCA2BC;AAxDD,6FAAqE;AACrE,qCAAqC;AACrC,6BAA4C;AAG5C,iDAA4D;AAS5D,MAAM,YAAY,GAEd;IACF,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE;IAClD,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE;IAChD,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE;CACvD,CAAC;AAEW,QAAA,aAAa,GAAG,sBAAU,GAAG,uBAAW,CAAC;AAO/C,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,KAAa,EACb,KAAa,EACb,MAAiB;IAEjB,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAA,kBAAS,GAAE,CAAC,kBAAkB,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,wCAAQ,EAC5B,yBAAoB,EACpB,OAAO,CAAC,QAAQ,CACjB,CAAC,WAAW,CAAC;QACZ,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACzB,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC;QACtB,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,uBAAW,GAAG,CAAC,CAAC;QAChD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -2,4 +2,12 @@ import type { IncomingHttpHeaders } from "node:http";
2
2
  import type { Website } from "@/db/tables/websites.table";
3
3
  export declare function requestSourceHostname(headers: IncomingHttpHeaders): string | undefined;
4
4
  export declare function websiteAcceptsHostname(website: Website, hostname: string): boolean;
5
- export declare function warnRejectedSource(websiteId: string, hostname: string): void;
5
+ export interface RejectedSource {
6
+ hostname: string;
7
+ count: number;
8
+ lastAt: number;
9
+ }
10
+ export declare function listRejectedSources(websiteId: string): RejectedSource[];
11
+ export declare function forgetRejectedSources(websiteId: string): void;
12
+ export declare function forgetAcceptedSources(website: Website): void;
13
+ export declare function warnRejectedSource(websiteId: string, hostname: string, headers: IncomingHttpHeaders): void;
@@ -2,11 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.requestSourceHostname = requestSourceHostname;
4
4
  exports.websiteAcceptsHostname = websiteAcceptsHostname;
5
+ exports.listRejectedSources = listRejectedSources;
6
+ exports.forgetRejectedSources = forgetRejectedSources;
7
+ exports.forgetAcceptedSources = forgetAcceptedSources;
5
8
  exports.warnRejectedSource = warnRejectedSource;
6
9
  const logging_1 = require("@antelopejs/interface-core/logging");
7
10
  const constants_1 = require("@/types/constants");
8
11
  const bounded_cache_1 = require("./bounded-cache");
9
12
  const url_1 = require("./url");
13
+ const website_hosts_1 = require("./website-hosts");
10
14
  function firstHeaderValue(value) {
11
15
  return Array.isArray(value) ? value[0] : value;
12
16
  }
@@ -33,7 +37,48 @@ function websiteAcceptsHostname(website, hostname) {
33
37
  });
34
38
  }
35
39
  const rejectionLogGate = new bounded_cache_1.BoundedCache(constants_1.MS_PER_MINUTE);
36
- function warnRejectedSource(websiteId, hostname) {
40
+ const MAX_REJECTED_HOSTS_PER_WEBSITE = 5;
41
+ const MAX_TRACKED_WEBSITES = 1_000;
42
+ const REJECTIONS_TTL_MS = 60 * constants_1.MS_PER_MINUTE;
43
+ const rejectedSources = new Map();
44
+ const OPAQUE_ORIGIN = "null";
45
+ function isOfferableSource(hostname, headers) {
46
+ return (hostname !== OPAQUE_ORIGIN &&
47
+ (0, website_hosts_1.isValidHostname)(hostname) &&
48
+ headers["sec-fetch-mode"] !== undefined);
49
+ }
50
+ function recordRejectedSource(websiteId, hostname) {
51
+ const hosts = rejectedSources.get(websiteId) ?? new Map();
52
+ const previous = hosts.get(hostname);
53
+ hosts.delete(hostname);
54
+ (0, bounded_cache_1.setBounded)(hosts, hostname, { hostname, count: (previous?.count ?? 0) + 1, lastAt: Date.now() }, MAX_REJECTED_HOSTS_PER_WEBSITE);
55
+ rejectedSources.delete(websiteId);
56
+ (0, bounded_cache_1.setBounded)(rejectedSources, websiteId, hosts, MAX_TRACKED_WEBSITES);
57
+ }
58
+ function listRejectedSources(websiteId) {
59
+ const cutoff = Date.now() - REJECTIONS_TTL_MS;
60
+ return [...(rejectedSources.get(websiteId)?.values() ?? [])]
61
+ .filter((source) => source.lastAt >= cutoff)
62
+ .sort((a, b) => b.lastAt - a.lastAt);
63
+ }
64
+ function forgetRejectedSources(websiteId) {
65
+ rejectedSources.delete(websiteId);
66
+ }
67
+ function forgetAcceptedSources(website) {
68
+ const hosts = rejectedSources.get(website._id);
69
+ if (!hosts) {
70
+ return;
71
+ }
72
+ for (const hostname of hosts.keys()) {
73
+ if (websiteAcceptsHostname(website, hostname)) {
74
+ hosts.delete(hostname);
75
+ }
76
+ }
77
+ }
78
+ function warnRejectedSource(websiteId, hostname, headers) {
79
+ if (isOfferableSource(hostname, headers)) {
80
+ recordRejectedSource(websiteId, hostname);
81
+ }
37
82
  if (rejectionLogGate.get(websiteId)) {
38
83
  return;
39
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"origin-guard.js","sourceRoot":"","sources":["../../src/services/origin-guard.ts"],"names":[],"mappings":";;AAeA,sDAaC;AAED,wDAcC;AAID,gDAQC;AAvDD,gEAA6D;AAE7D,iDAAkD;AAClD,mDAA+C;AAC/C,+BAAuC;AAEvC,SAAS,gBAAgB,CACvB,KAAoC;IAEpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAID,SAAgB,qBAAqB,CACnC,OAA4B;IAE5B,MAAM,MAAM,GACV,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CACpC,OAAgB,EAChB,QAAgB;IAEhB,MAAM,IAAI,GAAG,IAAA,oBAAc,EAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QAC1E,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,SAAS,CAAC,CAAC;QACzC,OAAO,CACL,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CACzE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,4BAAY,CAAO,yBAAa,CAAC,CAAC;AAE/D,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;IACpE,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACtC,iBAAO,CAAC,IAAI,CACV,0DAA0D,SAAS,gBAAgB,QAAQ,8DAA8D,CAC1J,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"origin-guard.js","sourceRoot":"","sources":["../../src/services/origin-guard.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,27 @@
1
- export declare function parsePeriodDays(period: unknown): number;
2
1
  export declare function periodStart(days: number): Date;
2
+ export interface QueryWindow {
3
+ firstDay: number;
4
+ lastDay: number;
5
+ days: number;
6
+ since: Date;
7
+ until: Date;
8
+ inProgress: boolean;
9
+ localOffset: number;
10
+ }
11
+ export interface PeriodQuery {
12
+ from?: unknown;
13
+ to?: unknown;
14
+ compareFrom?: unknown;
15
+ compareTo?: unknown;
16
+ preset?: unknown;
17
+ comparison?: unknown;
18
+ }
19
+ export declare function periodQueryOf(url: URL): PeriodQuery;
20
+ export type ComparisonKind = "previous-period" | "previous-year";
21
+ export declare function comparisonKindOf(query: PeriodQuery): ComparisonKind;
22
+ export declare function trailingWindow(days: number): QueryWindow;
23
+ export declare function resolveQueryWindow(query: PeriodQuery): QueryWindow;
24
+ export declare function resolveCompareWindow(query: PeriodQuery): QueryWindow | null;
25
+ export declare function previousWindow(window: QueryWindow): QueryWindow;
26
+ export declare function elapsedShare(window: QueryWindow): number;
27
+ export declare function windowDays(window: QueryWindow): number[];