@antelopejs/dms-marketing 0.6.1 → 0.7.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.
- package/README.md +2 -2
- package/dist/config.d.ts +3 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/data-api/websites.d.ts +10 -4
- package/dist/data-api/websites.js +79 -3
- package/dist/data-api/websites.js.map +1 -1
- package/dist/db/models/funnels.model.d.ts +0 -1
- package/dist/db/models/funnels.model.js +0 -18
- package/dist/db/models/funnels.model.js.map +1 -1
- package/dist/db/models/page_snapshots.model.d.ts +2 -1
- package/dist/db/models/page_snapshots.model.js +6 -14
- package/dist/db/models/page_snapshots.model.js.map +1 -1
- package/dist/db/models/websites.model.d.ts +1 -1
- package/dist/db/models/websites.model.js +9 -29
- package/dist/db/models/websites.model.js.map +1 -1
- package/dist/db/tables/funnels.table.d.ts +0 -1
- package/dist/db/tables/funnels.table.js +0 -4
- package/dist/db/tables/funnels.table.js.map +1 -1
- package/dist/db/tables/page_snapshots.table.d.ts +1 -1
- package/dist/db/tables/page_snapshots.table.js +4 -4
- package/dist/db/tables/page_snapshots.table.js.map +1 -1
- package/dist/db/tables/websites.table.d.ts +2 -1
- package/dist/db/tables/websites.table.js +4 -4
- package/dist/db/tables/websites.table.js.map +1 -1
- package/dist/frontend-module.d.ts +6 -0
- package/dist/frontend-module.js +46 -0
- package/dist/frontend-module.js.map +1 -0
- package/dist/implementations/dms-marketing/index.js +0 -5
- package/dist/implementations/dms-marketing/index.js.map +1 -1
- package/dist/index.js +3 -13
- package/dist/index.js.map +1 -1
- package/dist/pages/acquisition/page.d.ts +1 -0
- package/dist/pages/acquisition/page.js +9 -4
- package/dist/pages/acquisition/page.js.map +1 -1
- package/dist/pages/blocks.d.ts +11 -2
- package/dist/pages/blocks.js +43 -5
- package/dist/pages/blocks.js.map +1 -1
- package/dist/pages/funnel/page.d.ts +1 -0
- package/dist/pages/funnel/page.js +1 -0
- package/dist/pages/funnel/page.js.map +1 -1
- package/dist/pages/funnels/page.d.ts +1 -0
- package/dist/pages/funnels/page.js +4 -2
- package/dist/pages/funnels/page.js.map +1 -1
- package/dist/pages/overview/page.d.ts +1 -0
- package/dist/pages/overview/page.js +5 -6
- package/dist/pages/overview/page.js.map +1 -1
- package/dist/pages/pages/page.d.ts +1 -0
- package/dist/pages/pages/page.js +1 -0
- package/dist/pages/pages/page.js.map +1 -1
- package/dist/pages/settings/form.js +1 -0
- package/dist/pages/settings/form.js.map +1 -1
- package/dist/pages/websites/page.d.ts +2 -3
- package/dist/pages/websites/page.js +63 -5
- package/dist/pages/websites/page.js.map +1 -1
- package/dist/routes/dashboard-tracking.js +5 -1
- package/dist/routes/dashboard-tracking.js.map +1 -1
- package/dist/routes/funnels.d.ts +2 -0
- package/dist/routes/funnels.js +6 -5
- package/dist/routes/funnels.js.map +1 -1
- package/dist/routes/public-endpoints.js +1 -1
- package/dist/routes/public-endpoints.js.map +1 -1
- package/dist/routes/snapshot.d.ts +1 -1
- package/dist/routes/snapshot.js +30 -13
- package/dist/routes/snapshot.js.map +1 -1
- package/dist/routes/stats.d.ts +10 -4
- package/dist/routes/stats.js +77 -23
- package/dist/routes/stats.js.map +1 -1
- package/dist/routes/websites.d.ts +5 -1
- package/dist/routes/websites.js +31 -13
- package/dist/routes/websites.js.map +1 -1
- package/dist/services/acquisition-report.d.ts +1 -0
- package/dist/services/acquisition-report.js +1 -0
- package/dist/services/acquisition-report.js.map +1 -1
- package/dist/services/collect.js +7 -2
- package/dist/services/collect.js.map +1 -1
- package/dist/services/dashboard-tracking.d.ts +7 -14
- package/dist/services/dashboard-tracking.js +42 -26
- package/dist/services/dashboard-tracking.js.map +1 -1
- package/dist/services/declarations.d.ts +0 -2
- package/dist/services/declarations.js +0 -11
- package/dist/services/declarations.js.map +1 -1
- package/dist/services/declared-funnel.js +11 -99
- package/dist/services/declared-funnel.js.map +1 -1
- package/dist/services/declared-snapshot.js +8 -37
- package/dist/services/declared-snapshot.js.map +1 -1
- package/dist/services/declared-website.js +5 -46
- package/dist/services/declared-website.js.map +1 -1
- package/dist/services/funnels-table.d.ts +3 -2
- package/dist/services/funnels-table.js +9 -9
- package/dist/services/funnels-table.js.map +1 -1
- package/dist/services/heatmap.d.ts +6 -0
- package/dist/services/heatmap.js +82 -17
- package/dist/services/heatmap.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/prune.js +6 -1
- package/dist/services/prune.js.map +1 -1
- package/dist/services/realtime.d.ts +3 -0
- package/dist/services/realtime.js +49 -0
- package/dist/services/realtime.js.map +1 -0
- package/dist/services/request-body.d.ts +1 -0
- package/dist/services/request-body.js +18 -0
- package/dist/services/request-body.js.map +1 -1
- package/dist/services/sessionize.d.ts +1 -0
- package/dist/services/sessionize.js +9 -0
- package/dist/services/sessionize.js.map +1 -1
- package/dist/services/snapshots.d.ts +29 -1
- package/dist/services/snapshots.js +151 -26
- package/dist/services/snapshots.js.map +1 -1
- package/dist/services/tenant-website.d.ts +11 -0
- package/dist/services/tenant-website.js +27 -5
- package/dist/services/tenant-website.js.map +1 -1
- package/dist/services/website-report.d.ts +5 -0
- package/dist/services/website-report.js +13 -1
- package/dist/services/website-report.js.map +1 -1
- package/dist/services/workspace-scope.d.ts +31 -0
- package/dist/services/workspace-scope.js +72 -0
- package/dist/services/workspace-scope.js.map +1 -0
- package/dist/types/constants.d.ts +7 -0
- package/dist/types/constants.js +8 -1
- package/dist/types/constants.js.map +1 -1
- package/dist/types/events.d.ts +25 -25
- package/dist/types/snapshots.d.ts +29 -29
- package/dist/types/snapshots.js +1 -1
- package/dist/types/snapshots.js.map +1 -1
- package/dist/utils/funnel-steps-type.d.ts +13 -13
- package/frontend-vue/app/components/ChannelsCard.vue +19 -2
- package/frontend-vue/app/components/Context.vue +50 -376
- package/frontend-vue/app/components/FunnelBuilder.vue +28 -22
- package/frontend-vue/app/components/FunnelFigure.vue +15 -2
- package/frontend-vue/app/components/FunnelReport.vue +3 -0
- package/frontend-vue/app/components/FunnelTemplates.vue +15 -13
- package/frontend-vue/app/components/InstallGuide.vue +1 -1
- package/frontend-vue/app/components/PagePreview.vue +330 -74
- package/frontend-vue/app/components/PagesExplorer.vue +230 -85
- package/frontend-vue/app/components/TopListTabs.vue +51 -18
- package/frontend-vue/app/components/WebsiteCard.vue +394 -0
- package/frontend-vue/app/components/WebsiteCreate.vue +159 -0
- package/frontend-vue/app/components/WebsitePicker.vue +210 -0
- package/frontend-vue/app/components/WebsiteSettings.vue +539 -0
- package/frontend-vue/app/components/WorkspaceScope.vue +119 -0
- package/frontend-vue/app/composables/useContextWebsite.ts +105 -0
- package/frontend-vue/app/composables/useCopyDraft.ts +47 -0
- package/frontend-vue/app/composables/useMarketingApi.ts +92 -4
- package/frontend-vue/app/composables/useMarketingReads.ts +32 -23
- package/frontend-vue/app/composables/useMarketingRoutes.ts +25 -2
- package/frontend-vue/app/composables/useRecordCrumb.ts +17 -0
- package/frontend-vue/app/composables/useSnapshotFrame.ts +35 -1
- package/frontend-vue/app/utils/anchor-drift.ts +58 -0
- package/frontend-vue/app/utils/drift-dismissals.ts +20 -0
- package/frontend-vue/app/utils/fill-height.ts +141 -0
- package/frontend-vue/app/utils/format.ts +21 -2
- package/frontend-vue/app/utils/funnel-draft.ts +22 -0
- package/frontend-vue/app/utils/heatmap.ts +17 -0
- package/frontend-vue/app/utils/page-snapshot.ts +75 -0
- package/frontend-vue/app/utils/snapshot-options.ts +148 -0
- package/frontend-vue/app/utils/snapshotScrollRoot.ts +93 -0
- package/frontend-vue/app/utils/website-card.ts +93 -0
- package/frontend-vue/app/utils/website-purge.ts +95 -0
- package/frontend-vue/app/utils/website-settings.ts +121 -0
- package/frontend-vue/app/utils/website-state.ts +93 -0
- package/frontend-vue/app/utils/workspace-scope.ts +51 -0
- package/frontend-vue/i18n/locales/marketing-en-GB.json +112 -36
- package/frontend-vue/i18n/locales/marketing-fr-FR.json +112 -36
- package/frontend-vue/package.json +1 -1
- package/frontend-vue/tests/anchor-drift.test.ts +59 -0
- package/frontend-vue/tests/build-flags.test.ts +38 -0
- package/frontend-vue/tests/context-bar.test.ts +226 -0
- package/frontend-vue/tests/copy-draft.test.ts +64 -0
- package/frontend-vue/tests/drift-dismissals.test.ts +12 -0
- package/frontend-vue/tests/fill-height.test.ts +110 -0
- package/frontend-vue/tests/format.test.ts +14 -0
- package/frontend-vue/tests/funnel-draft.test.ts +37 -0
- package/frontend-vue/tests/heatmap.test.ts +25 -0
- package/frontend-vue/tests/install-guide.test.ts +25 -0
- package/frontend-vue/tests/marketing-reads.test.ts +20 -6
- package/frontend-vue/tests/page-snapshot.test.ts +62 -0
- package/frontend-vue/tests/record-crumb.test.ts +43 -0
- package/frontend-vue/tests/registration.test.ts +4 -1
- package/frontend-vue/tests/routes.test.ts +21 -0
- package/frontend-vue/tests/save-funnel.test.ts +47 -0
- package/frontend-vue/tests/server-parity.test.ts +3 -0
- package/frontend-vue/tests/snapshot-options.test.ts +148 -0
- package/frontend-vue/tests/snapshot-scroll-root.test.ts +84 -0
- package/frontend-vue/tests/stubs/frontend-module.ts +5 -1
- package/frontend-vue/tests/top-list-tabs.test.ts +158 -0
- package/frontend-vue/tests/website-card.test.ts +119 -0
- package/frontend-vue/tests/website-purge.test.ts +70 -0
- package/frontend-vue/tests/website-settings.test.ts +133 -0
- package/frontend-vue/tests/website-state.test.ts +96 -0
- package/frontend-vue/tests/workspace-scope-control.test.ts +113 -0
- package/frontend-vue/tests/workspace-scope.test.ts +55 -0
- package/package.json +8 -7
- package/skills/dms-marketing/SKILL.md +54 -12
- package/static/snapshot.js +539 -48
- package/static/tracker.js +154 -5
- package/dist/services/readiness.d.ts +0 -2
- package/dist/services/readiness.js +0 -15
- package/dist/services/readiness.js.map +0 -1
- package/frontend-vue/app/components/WebsitesGrid.vue +0 -812
|
@@ -11,11 +11,6 @@ const declarations_1 = require("./declarations");
|
|
|
11
11
|
const experiment_definitions_1 = require("./experiment-definitions");
|
|
12
12
|
const website_rules_1 = require("./website-rules");
|
|
13
13
|
const OPERATION = "EnsureFunnel";
|
|
14
|
-
const DECLARED_TRANSITIONS = {
|
|
15
|
-
draft: ["draft", "running", "stopped"],
|
|
16
|
-
running: ["running", "stopped"],
|
|
17
|
-
stopped: ["stopped", "running"],
|
|
18
|
-
};
|
|
19
14
|
const windowSchema = zod_1.z
|
|
20
15
|
.number()
|
|
21
16
|
.finite()
|
|
@@ -64,25 +59,6 @@ function declaredContent(id, declaration) {
|
|
|
64
59
|
experiment: declaredExperiment(id, declaration.experiment),
|
|
65
60
|
};
|
|
66
61
|
}
|
|
67
|
-
function storedContent(funnel) {
|
|
68
|
-
const experiment = funnel.experiment ?? null;
|
|
69
|
-
return {
|
|
70
|
-
websiteId: funnel.websiteId,
|
|
71
|
-
name: funnel.name,
|
|
72
|
-
steps: funnel.steps.map((step) => ({ kind: step.kind, value: step.value })),
|
|
73
|
-
conversionWindowMs: funnel.conversionWindowMs,
|
|
74
|
-
experiment: experiment
|
|
75
|
-
? {
|
|
76
|
-
key: experiment.key,
|
|
77
|
-
variations: experiment.variations.map((v) => ({
|
|
78
|
-
key: v.key,
|
|
79
|
-
weight: v.weight,
|
|
80
|
-
})),
|
|
81
|
-
status: experiment.status,
|
|
82
|
-
}
|
|
83
|
-
: null,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
62
|
function runInstant(id, field, value) {
|
|
87
63
|
const now = Date.now();
|
|
88
64
|
if (value === undefined) {
|
|
@@ -94,52 +70,22 @@ function runInstant(id, field, value) {
|
|
|
94
70
|
}
|
|
95
71
|
return at;
|
|
96
72
|
}
|
|
97
|
-
function declaredRuns(id,
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (!DECLARED_TRANSITIONS[from].includes(to)) {
|
|
101
|
-
throw refuse(id, `the experiment cannot move from ${from} to ${to}`);
|
|
102
|
-
}
|
|
103
|
-
if (from === to) {
|
|
104
|
-
return runs;
|
|
105
|
-
}
|
|
106
|
-
const last = runs[runs.length - 1];
|
|
107
|
-
if (to === "stopped" && from === "running" && last) {
|
|
108
|
-
const stoppedAt = runInstant(id, "stoppedAt", declaration?.stoppedAt);
|
|
109
|
-
if (stoppedAt < last.startedAt) {
|
|
110
|
-
throw refuse(id, "experiment.stoppedAt: before the run started");
|
|
111
|
-
}
|
|
112
|
-
last.stoppedAt = stoppedAt;
|
|
113
|
-
return runs;
|
|
73
|
+
function declaredRuns(id, to, declaration) {
|
|
74
|
+
if (to === "draft") {
|
|
75
|
+
return [];
|
|
114
76
|
}
|
|
115
77
|
const startedAt = runInstant(id, "startedAt", declaration?.startedAt);
|
|
116
|
-
if (last?.stoppedAt != null && startedAt < last.stoppedAt) {
|
|
117
|
-
throw refuse(id, "experiment.startedAt: before the previous run ended");
|
|
118
|
-
}
|
|
119
78
|
if (to === "running") {
|
|
120
|
-
|
|
121
|
-
return runs;
|
|
79
|
+
return [{ startedAt, stoppedAt: null }];
|
|
122
80
|
}
|
|
123
81
|
const stoppedAt = runInstant(id, "stoppedAt", declaration?.stoppedAt);
|
|
124
82
|
if (stoppedAt < startedAt) {
|
|
125
83
|
throw refuse(id, "experiment.stoppedAt: before experiment.startedAt");
|
|
126
84
|
}
|
|
127
|
-
|
|
128
|
-
return runs;
|
|
85
|
+
return [{ startedAt, stoppedAt }];
|
|
129
86
|
}
|
|
130
|
-
function resolvedExperiment(id, content,
|
|
131
|
-
const existing = current?.experiment ?? null;
|
|
87
|
+
function resolvedExperiment(id, content, declaration) {
|
|
132
88
|
const requested = content.experiment;
|
|
133
|
-
if (existing && existing.status !== "draft") {
|
|
134
|
-
const frozen = requested !== null &&
|
|
135
|
-
requested.key === existing.key &&
|
|
136
|
-
JSON.stringify(requested.variations) ===
|
|
137
|
-
JSON.stringify(existing.variations.map((v) => ({ key: v.key, weight: v.weight }))) &&
|
|
138
|
-
content.websiteId === current?.websiteId;
|
|
139
|
-
if (!frozen) {
|
|
140
|
-
throw refuse(id, "the experiment has left draft: its key, variations and website can no longer change");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
89
|
if (!requested) {
|
|
144
90
|
return null;
|
|
145
91
|
}
|
|
@@ -147,7 +93,7 @@ function resolvedExperiment(id, content, current, declaration) {
|
|
|
147
93
|
key: requested.key,
|
|
148
94
|
status: requested.status,
|
|
149
95
|
variations: requested.variations,
|
|
150
|
-
runs: declaredRuns(id,
|
|
96
|
+
runs: declaredRuns(id, requested.status, declaration.experiment),
|
|
151
97
|
};
|
|
152
98
|
}
|
|
153
99
|
async function assertWebsiteOfTenant(id, websiteId, tenantId) {
|
|
@@ -161,38 +107,6 @@ async function assertUniqueKey(id, model, websiteId, experiment) {
|
|
|
161
107
|
throw refuse(id, `another funnel of the website already uses the experiment key "${experiment.key}"`);
|
|
162
108
|
}
|
|
163
109
|
}
|
|
164
|
-
async function refreshFunnel(model, existing, content, declaration) {
|
|
165
|
-
const id = existing._id;
|
|
166
|
-
if (!(0, declarations_1.isUntouchedSinceDeclared)(existing.declaredHash, storedContent(existing))) {
|
|
167
|
-
if (existing.declaredHash) {
|
|
168
|
-
await model.compareDeclared(existing, { declaredHash: "" });
|
|
169
|
-
}
|
|
170
|
-
return { id, status: "kept" };
|
|
171
|
-
}
|
|
172
|
-
const declaredHash = (0, declarations_1.contentHash)(content);
|
|
173
|
-
if (declaredHash === existing.declaredHash) {
|
|
174
|
-
return { id, status: "unchanged" };
|
|
175
|
-
}
|
|
176
|
-
const experiment = resolvedExperiment(id, content, existing, declaration);
|
|
177
|
-
await assertUniqueKey(id, model, content.websiteId, experiment);
|
|
178
|
-
const previousWebsiteId = existing.websiteId;
|
|
179
|
-
const applied = await model.compareDeclared(existing, {
|
|
180
|
-
websiteId: content.websiteId,
|
|
181
|
-
name: content.name,
|
|
182
|
-
steps: content.steps,
|
|
183
|
-
conversionWindowMs: content.conversionWindowMs,
|
|
184
|
-
experiment,
|
|
185
|
-
declaredHash,
|
|
186
|
-
});
|
|
187
|
-
if (!applied) {
|
|
188
|
-
return { id, status: "kept" };
|
|
189
|
-
}
|
|
190
|
-
(0, experiment_definitions_1.invalidateExperimentDefinitions)(content.websiteId);
|
|
191
|
-
if (previousWebsiteId !== content.websiteId) {
|
|
192
|
-
(0, experiment_definitions_1.invalidateExperimentDefinitions)(previousWebsiteId);
|
|
193
|
-
}
|
|
194
|
-
return { id, status: "updated" };
|
|
195
|
-
}
|
|
196
110
|
async function ensureFunnel(declaration) {
|
|
197
111
|
const id = (0, declarations_1.requireDeclaredId)(OPERATION, declaration?.id);
|
|
198
112
|
const tenantId = (0, declarations_1.declaredTenant)(OPERATION, id, declaration.tenantId);
|
|
@@ -201,9 +115,9 @@ async function ensureFunnel(declaration) {
|
|
|
201
115
|
const model = (0, interface_database_decorators_1.GetModel)(db_1.FunnelsModel, tenantId);
|
|
202
116
|
const existing = await model.get(id);
|
|
203
117
|
if (existing) {
|
|
204
|
-
return
|
|
118
|
+
return { id, status: "kept" };
|
|
205
119
|
}
|
|
206
|
-
const experiment = resolvedExperiment(id, content,
|
|
120
|
+
const experiment = resolvedExperiment(id, content, declaration);
|
|
207
121
|
await assertUniqueKey(id, model, content.websiteId, experiment);
|
|
208
122
|
const funnel = {
|
|
209
123
|
_id: id,
|
|
@@ -212,17 +126,15 @@ async function ensureFunnel(declaration) {
|
|
|
212
126
|
steps: content.steps,
|
|
213
127
|
conversionWindowMs: content.conversionWindowMs,
|
|
214
128
|
experiment,
|
|
215
|
-
declaredHash: (0, declarations_1.contentHash)(content),
|
|
216
129
|
};
|
|
217
130
|
try {
|
|
218
131
|
await model.insert(funnel);
|
|
219
132
|
}
|
|
220
133
|
catch (err) {
|
|
221
|
-
|
|
222
|
-
if (!raced) {
|
|
134
|
+
if (!(await model.get(id))) {
|
|
223
135
|
throw err;
|
|
224
136
|
}
|
|
225
|
-
return
|
|
137
|
+
return { id, status: "kept" };
|
|
226
138
|
}
|
|
227
139
|
(0, experiment_definitions_1.invalidateExperimentDefinitions)(content.websiteId);
|
|
228
140
|
return { id, status: "created" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-funnel.js","sourceRoot":"","sources":["../../src/services/declared-funnel.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"declared-funnel.js","sourceRoot":"","sources":["../../src/services/declared-funnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,17 +10,6 @@ const declarations_1 = require("./declarations");
|
|
|
10
10
|
const snapshots_1 = require("./snapshots");
|
|
11
11
|
const url_1 = require("./url");
|
|
12
12
|
const OPERATION = "EnsurePageSnapshot";
|
|
13
|
-
function storedContent(row) {
|
|
14
|
-
return {
|
|
15
|
-
origin: row.origin,
|
|
16
|
-
viewport: { width: row.viewportWidth, height: row.viewportHeight },
|
|
17
|
-
document: { width: row.documentWidth, height: row.documentHeight },
|
|
18
|
-
colorScheme: row.colorScheme ?? null,
|
|
19
|
-
html: row.html
|
|
20
|
-
? (0, node_zlib_1.gunzipSync)(Buffer.from(row.html, "base64")).toString("utf8")
|
|
21
|
-
: "",
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
13
|
function refuse(url, reason) {
|
|
25
14
|
return new declarations_1.MarketingDeclarationError(OPERATION, url, reason);
|
|
26
15
|
}
|
|
@@ -34,21 +23,10 @@ async function requireWebsite(url, websiteId, tenantId) {
|
|
|
34
23
|
}
|
|
35
24
|
return website;
|
|
36
25
|
}
|
|
37
|
-
async function refreshSnapshot(model, existing, row) {
|
|
38
|
-
if (!(0, declarations_1.isUntouchedSinceDeclared)(existing.declaredHash, storedContent(existing))) {
|
|
39
|
-
return "kept";
|
|
40
|
-
}
|
|
41
|
-
if (row.declaredHash === existing.declaredHash) {
|
|
42
|
-
return "unchanged";
|
|
43
|
-
}
|
|
44
|
-
const { _id: _unchangedId, ...patch } = row;
|
|
45
|
-
return (await model.replaceIfUnchanged(existing, patch)) ? "updated" : "kept";
|
|
46
|
-
}
|
|
47
26
|
async function writeSnapshot(tenantId, website, row) {
|
|
48
27
|
const model = (0, interface_database_decorators_1.GetModel)(db_1.PageSnapshotsModel, tenantId);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return refreshSnapshot(model, existing, row);
|
|
28
|
+
if (await model.get(row._id)) {
|
|
29
|
+
return "kept";
|
|
52
30
|
}
|
|
53
31
|
if ((await model.countByWebsite(website._id)) >= constants_1.MAX_SNAPSHOTS_PER_WEBSITE) {
|
|
54
32
|
throw refuse(row.url, `the website "${website._id}" already holds its ${constants_1.MAX_SNAPSHOTS_PER_WEBSITE} snapshots`);
|
|
@@ -57,11 +35,10 @@ async function writeSnapshot(tenantId, website, row) {
|
|
|
57
35
|
await model.insert(row);
|
|
58
36
|
}
|
|
59
37
|
catch (err) {
|
|
60
|
-
|
|
61
|
-
if (!raced) {
|
|
38
|
+
if (!(await model.get(row._id))) {
|
|
62
39
|
throw err;
|
|
63
40
|
}
|
|
64
|
-
return
|
|
41
|
+
return "kept";
|
|
65
42
|
}
|
|
66
43
|
return "created";
|
|
67
44
|
}
|
|
@@ -80,13 +57,7 @@ async function ensurePageSnapshot(declaration) {
|
|
|
80
57
|
}
|
|
81
58
|
const url = (0, url_1.parseTrackedUrl)(input.url).path;
|
|
82
59
|
const layout = (0, types_1.layoutOfWidth)(input.viewport.width);
|
|
83
|
-
const
|
|
84
|
-
origin,
|
|
85
|
-
viewport: input.viewport,
|
|
86
|
-
document: input.document,
|
|
87
|
-
colorScheme: input.colorScheme ?? null,
|
|
88
|
-
html: (0, snapshots_1.sanitizeSnapshotHtml)(input.html),
|
|
89
|
-
};
|
|
60
|
+
const html = (0, snapshots_1.sanitizeSnapshotHtml)(input.html);
|
|
90
61
|
const now = new Date();
|
|
91
62
|
const row = {
|
|
92
63
|
_id: (0, snapshots_1.snapshotId)(website._id, layout, url),
|
|
@@ -101,11 +72,11 @@ async function ensurePageSnapshot(declaration) {
|
|
|
101
72
|
colorScheme: input.colorScheme,
|
|
102
73
|
capturedAt: now,
|
|
103
74
|
bytes: Buffer.byteLength(input.html),
|
|
104
|
-
|
|
105
|
-
|
|
75
|
+
scrollRoot: (0, snapshots_1.hasScrollRoot)(html),
|
|
76
|
+
html: (0, node_zlib_1.gzipSync)(html).toString("base64"),
|
|
106
77
|
};
|
|
107
78
|
const status = await writeSnapshot(tenantId, website, row);
|
|
108
|
-
if (status === "created"
|
|
79
|
+
if (status === "created") {
|
|
109
80
|
(0, snapshots_1.rememberCaptureTime)(row._id, now.getTime());
|
|
110
81
|
}
|
|
111
82
|
return { url, layout, status };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-snapshot.js","sourceRoot":"","sources":["../../src/services/declared-snapshot.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"declared-snapshot.js","sourceRoot":"","sources":["../../src/services/declared-snapshot.ts"],"names":[],"mappings":";;AAkFA,gDA2CC;AA7HD,yCAAqC;AACrC,6FAAqE;AAMrE,6BAAyD;AAGzD,mCAAmE;AACnE,iDAA8D;AAC9D,iDAIwB;AACxB,2CAMqB;AACrB,+BAAwC;AAExC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC,SAAS,MAAM,CAAC,GAAW,EAAE,MAAc;IACzC,OAAO,IAAI,wCAAyB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,SAAiB,EACjB,QAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,IAAA,wCAAQ,EAAC,kBAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,MAAM,CAAC,GAAG,EAAE,eAAe,SAAS,oBAAoB,QAAQ,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,MAAM,CACV,GAAG,EACH,2CAA2C,SAAS,qCAAqC,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,OAAgB,EAChB,GAAiB;IAEjB,MAAM,KAAK,GAAG,IAAA,wCAAQ,EAAC,uBAAkB,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,qCAAyB,EAAE,CAAC;QAC3E,MAAM,MAAM,CACV,GAAG,CAAC,GAAG,EACP,gBAAgB,OAAO,CAAC,GAAG,uBAAuB,qCAAyB,YAAY,CACxF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAEb,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAOM,KAAK,UAAU,kBAAkB,CACtC,WAA6C;IAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAA,6BAAc,EAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,iCAAyB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,EAAE,IAAA,4BAAa,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,CACV,KAAK,EACL,8CAA8C,OAAO,CAAC,GAAG,WAAW,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,qBAAe,EAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAA,gCAAoB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG;QACV,GAAG,EAAE,IAAA,sBAAU,EAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;QACzC,SAAS,EAAE,OAAO,CAAC,GAAG;QACtB,GAAG;QACH,MAAM;QACN,MAAM;QACN,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QACnC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACrC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QACnC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACrC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,UAAU,EAAE,IAAA,yBAAa,EAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACxB,CAAC;IAClB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAA,+BAAmB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -5,9 +5,6 @@ const interface_database_decorators_1 = require("@antelopejs/interface-database-
|
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const db_1 = require("@/db");
|
|
7
7
|
const declarations_1 = require("./declarations");
|
|
8
|
-
const experiment_definitions_1 = require("./experiment-definitions");
|
|
9
|
-
const origin_guard_1 = require("./origin-guard");
|
|
10
|
-
const snapshots_1 = require("./snapshots");
|
|
11
8
|
const website_cache_1 = require("./website-cache");
|
|
12
9
|
const website_rules_1 = require("./website-rules");
|
|
13
10
|
const OPERATION = "EnsureWebsite";
|
|
@@ -34,54 +31,17 @@ function declaredContent(id, declaration) {
|
|
|
34
31
|
snapshotMaskText: data.snapshotMaskText ?? false,
|
|
35
32
|
};
|
|
36
33
|
}
|
|
37
|
-
function storedContent(website) {
|
|
38
|
-
return {
|
|
39
|
-
name: website.name,
|
|
40
|
-
domain: website.domain,
|
|
41
|
-
extraDomains: website.extraDomains ?? [],
|
|
42
|
-
trackingEnabled: website.trackingEnabled,
|
|
43
|
-
snapshotsEnabled: website.snapshotsEnabled ?? false,
|
|
44
|
-
snapshotMaskText: website.snapshotMaskText ?? false,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
34
|
async function assertHostsFree(website) {
|
|
48
35
|
const conflict = await (0, website_rules_1.tenantHostConflict)(website);
|
|
49
36
|
if (conflict) {
|
|
50
37
|
throw new declarations_1.MarketingDeclarationError(OPERATION, website._id, `the host "${conflict.hostname}" is already declared by the website "${conflict.website.name}"`);
|
|
51
38
|
}
|
|
52
39
|
}
|
|
53
|
-
|
|
54
|
-
const id = existing._id;
|
|
40
|
+
function keptWebsite(existing, tenantId) {
|
|
55
41
|
if (existing.tenantId !== tenantId) {
|
|
56
|
-
throw new declarations_1.MarketingDeclarationError(OPERATION,
|
|
57
|
-
}
|
|
58
|
-
if (!(0, declarations_1.isUntouchedSinceDeclared)(existing.declaredHash, storedContent(existing))) {
|
|
59
|
-
if (existing.declaredHash) {
|
|
60
|
-
await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).compareDeclared(existing, {
|
|
61
|
-
declaredHash: "",
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return { id, status: "kept" };
|
|
42
|
+
throw new declarations_1.MarketingDeclarationError(OPERATION, existing._id, "this id already names a website of another tenant");
|
|
65
43
|
}
|
|
66
|
-
|
|
67
|
-
if (declaredHash === existing.declaredHash) {
|
|
68
|
-
return { id, status: "unchanged" };
|
|
69
|
-
}
|
|
70
|
-
const before = storedContent(existing);
|
|
71
|
-
const patch = { ...content, declaredHash, updatedAt: new Date() };
|
|
72
|
-
const refreshed = Object.assign({}, existing, patch);
|
|
73
|
-
await assertHostsFree(refreshed);
|
|
74
|
-
if (!(await (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel).compareDeclared(existing, patch))) {
|
|
75
|
-
return { id, status: "kept" };
|
|
76
|
-
}
|
|
77
|
-
if (before.snapshotsEnabled !== content.snapshotsEnabled ||
|
|
78
|
-
before.snapshotMaskText !== content.snapshotMaskText) {
|
|
79
|
-
await (0, snapshots_1.deleteSnapshots)(tenantId, id);
|
|
80
|
-
}
|
|
81
|
-
(0, website_cache_1.invalidateWebsiteCache)(id);
|
|
82
|
-
(0, experiment_definitions_1.invalidateExperimentDefinitions)(id);
|
|
83
|
-
(0, origin_guard_1.forgetAcceptedSources)(refreshed);
|
|
84
|
-
return { id, status: "updated" };
|
|
44
|
+
return { id: existing._id, status: "kept" };
|
|
85
45
|
}
|
|
86
46
|
async function ensureWebsite(declaration) {
|
|
87
47
|
const id = (0, declarations_1.requireDeclaredId)(OPERATION, declaration?.id);
|
|
@@ -90,14 +50,13 @@ async function ensureWebsite(declaration) {
|
|
|
90
50
|
const model = (0, interface_database_decorators_1.GetModel)(db_1.WebsitesModel);
|
|
91
51
|
const existing = await model.get(id);
|
|
92
52
|
if (existing) {
|
|
93
|
-
return
|
|
53
|
+
return keptWebsite(existing, tenantId);
|
|
94
54
|
}
|
|
95
55
|
const now = new Date();
|
|
96
56
|
const website = {
|
|
97
57
|
_id: id,
|
|
98
58
|
tenantId,
|
|
99
59
|
...content,
|
|
100
|
-
declaredHash: (0, declarations_1.contentHash)(content),
|
|
101
60
|
createdAt: now,
|
|
102
61
|
updatedAt: now,
|
|
103
62
|
};
|
|
@@ -110,7 +69,7 @@ async function ensureWebsite(declaration) {
|
|
|
110
69
|
if (!raced) {
|
|
111
70
|
throw err;
|
|
112
71
|
}
|
|
113
|
-
return
|
|
72
|
+
return keptWebsite(raced, tenantId);
|
|
114
73
|
}
|
|
115
74
|
(0, website_cache_1.invalidateWebsiteCache)(id);
|
|
116
75
|
return { id, status: "created" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-website.js","sourceRoot":"","sources":["../../src/services/declared-website.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"declared-website.js","sourceRoot":"","sources":["../../src/services/declared-website.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { CellSubline, DefaultDisplays } from "@antelopejs/interface-dms/bas
|
|
|
3
3
|
import type { ComposedText } from "@antelopejs/interface-dms/base/types/composed-text";
|
|
4
4
|
import type { ConfirmDialog } from "@antelopejs/interface-dms/base/types/confirm-dialog";
|
|
5
5
|
import type { Funnel } from "@/db/tables/funnels.table";
|
|
6
|
+
import type { ComparisonKind } from "./period";
|
|
6
7
|
import type { FunnelSummaryRow } from "./funnel-report";
|
|
7
8
|
export interface FunnelTableRow {
|
|
8
9
|
_id: string;
|
|
@@ -18,7 +19,7 @@ export interface FunnelTableRow {
|
|
|
18
19
|
comparison: CellSubline | null;
|
|
19
20
|
status: string | null;
|
|
20
21
|
}
|
|
21
|
-
export declare function funnelTablePayload(rows: FunnelSummaryRow[], kind: string | undefined): {
|
|
22
|
+
export declare function funnelTablePayload(rows: FunnelSummaryRow[], kind: string | undefined, comparison?: ComparisonKind): {
|
|
22
23
|
results: FunnelTableRow[];
|
|
23
24
|
total: number;
|
|
24
25
|
};
|
|
@@ -27,5 +28,5 @@ export interface FunnelCoverage {
|
|
|
27
28
|
period: boolean;
|
|
28
29
|
previous: boolean;
|
|
29
30
|
}
|
|
30
|
-
export declare function winnerBanner(rows: FunnelSummaryRow[], coverage?: FunnelCoverage): BannerContent | null;
|
|
31
|
+
export declare function winnerBanner(rows: FunnelSummaryRow[], coverage?: FunnelCoverage, comparison?: ComparisonKind): BannerContent | null;
|
|
31
32
|
export declare function funnelDeleteConfirmation(funnel: Funnel): ConfirmDialog;
|
|
@@ -95,7 +95,7 @@ const day = (value) => ({
|
|
|
95
95
|
value,
|
|
96
96
|
format: "day",
|
|
97
97
|
});
|
|
98
|
-
function comparisonOf(row) {
|
|
98
|
+
function comparisonOf(row, comparison) {
|
|
99
99
|
const experiment = row.experiment;
|
|
100
100
|
if (experiment?.status === "running" && experiment.since) {
|
|
101
101
|
return {
|
|
@@ -125,7 +125,7 @@ function comparisonOf(row) {
|
|
|
125
125
|
const tone = (0, composed_1.deltaTone)(row.deltaPoints);
|
|
126
126
|
return {
|
|
127
127
|
text: {
|
|
128
|
-
key: `${COMPOSE_PREFIX}delta`,
|
|
128
|
+
key: `${COMPOSE_PREFIX}${comparison === "previous-year" ? "delta_previous_year" : "delta"}`,
|
|
129
129
|
params: {
|
|
130
130
|
sign,
|
|
131
131
|
value: {
|
|
@@ -137,7 +137,7 @@ function comparisonOf(row) {
|
|
|
137
137
|
tone: tone === "success" || tone === "error" ? tone : "muted",
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
|
-
function funnelTablePayload(rows, kind) {
|
|
140
|
+
function funnelTablePayload(rows, kind, comparison = "previous-period") {
|
|
141
141
|
const results = rows
|
|
142
142
|
.filter((row) => !kind || row.kind === kind)
|
|
143
143
|
.map((row) => ({
|
|
@@ -151,7 +151,7 @@ function funnelTablePayload(rows, kind) {
|
|
|
151
151
|
completed: row.completed,
|
|
152
152
|
conversion: row.conversion,
|
|
153
153
|
conversionText: (0, composed_1.percentText)(row.conversion),
|
|
154
|
-
comparison: comparisonOf(row),
|
|
154
|
+
comparison: comparisonOf(row, comparison),
|
|
155
155
|
status: row.experiment?.status ?? null,
|
|
156
156
|
}));
|
|
157
157
|
return { results, total: results.length };
|
|
@@ -191,7 +191,7 @@ function winnerOf(rows) {
|
|
|
191
191
|
],
|
|
192
192
|
};
|
|
193
193
|
}
|
|
194
|
-
function coverageBanner(coverage) {
|
|
194
|
+
function coverageBanner(coverage, comparison) {
|
|
195
195
|
if (coverage.since === null || (!coverage.period && !coverage.previous)) {
|
|
196
196
|
return null;
|
|
197
197
|
}
|
|
@@ -202,15 +202,15 @@ function coverageBanner(coverage) {
|
|
|
202
202
|
icon: "i-ph-clock-counter-clockwise",
|
|
203
203
|
title: coverage.period
|
|
204
204
|
? { key: `${COVERAGE_PREFIX}period_title`, params }
|
|
205
|
-
: `${COVERAGE_PREFIX}previous_title`,
|
|
205
|
+
: `${COVERAGE_PREFIX}${comparison === "previous-year" ? "previous_year_title" : "previous_title"}`,
|
|
206
206
|
description: { key: `${COVERAGE_PREFIX}description`, params },
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
|
-
function winnerBanner(rows, coverage) {
|
|
209
|
+
function winnerBanner(rows, coverage, comparison = "previous-period") {
|
|
210
210
|
if (coverage?.period) {
|
|
211
|
-
return coverageBanner(coverage);
|
|
211
|
+
return coverageBanner(coverage, comparison);
|
|
212
212
|
}
|
|
213
|
-
return winnerOf(rows) ?? (coverage ? coverageBanner(coverage) : null);
|
|
213
|
+
return (winnerOf(rows) ?? (coverage ? coverageBanner(coverage, comparison) : null));
|
|
214
214
|
}
|
|
215
215
|
function funnelDeleteConfirmation(funnel) {
|
|
216
216
|
const running = funnel.experiment?.status === "running";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnels-table.js","sourceRoot":"","sources":["../../src/services/funnels-table.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"funnels-table.js","sourceRoot":"","sources":["../../src/services/funnels-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,20 @@ export interface MarketingScrollDepthPayload {
|
|
|
5
5
|
reached: number[];
|
|
6
6
|
truncated: boolean;
|
|
7
7
|
}
|
|
8
|
+
export declare function mergeClickHeatmaps(heatmaps: MarketingHeatmapPayload[]): MarketingHeatmapPayload;
|
|
8
9
|
export declare function computeClickHeatmap(tenantId: string, websiteIds: string[], path: string, window: QueryWindow): Promise<MarketingHeatmapPayload>;
|
|
9
10
|
export declare function computeScrollDepth(tenantId: string, websiteIds: string[], path: string, window: QueryWindow): Promise<MarketingScrollDepthPayload>;
|
|
11
|
+
export declare function mergeScrollDepths(depths: MarketingScrollDepthPayload[]): MarketingScrollDepthPayload;
|
|
10
12
|
export interface PageActivity {
|
|
11
13
|
clicks: Map<string, number>;
|
|
12
14
|
sampled: Map<string, number>;
|
|
13
15
|
sampleRate: number | null;
|
|
14
16
|
}
|
|
15
17
|
export declare function computePageActivity(tenantId: string, websiteId: string, window: QueryWindow): Promise<PageActivity>;
|
|
18
|
+
export declare function computeScopedPageActivity(sites: Array<{
|
|
19
|
+
tenantId: string;
|
|
20
|
+
websiteId: string;
|
|
21
|
+
}>, window: QueryWindow): Promise<PageActivity>;
|
|
16
22
|
export interface HeatmapData {
|
|
17
23
|
events: number;
|
|
18
24
|
snapshots: number;
|