feat: complete campaign wizards and retention reporting

This commit is contained in:
2026-07-31 04:21:34 +02:00
parent e689fdf495
commit fa4eb39e0b
18 changed files with 785 additions and 55 deletions
@@ -0,0 +1,55 @@
import { readFileSync } from "node:fs";
function read(path) {
return readFileSync(new URL(path, import.meta.url), "utf8");
}
function assert(condition, message) {
if (!condition) throw new Error(message);
}
const workspace = read("../src/features/campaigns/CampaignWorkspace.tsx");
const reviewWizard = read("../src/features/campaigns/wizard/ReviewWizard.tsx");
const sendWizard = read("../src/features/campaigns/wizard/SendWizard.tsx");
const directoryPage = read(
"../src/features/campaigns/wizard/WizardDirectoryPage.tsx"
);
const directory = read("../src/features/campaigns/wizard/directory.ts");
const moduleSource = read("../src/module.ts");
assert(
workspace.includes('path="wizard"')
&& workspace.includes("<WizardDirectoryPage"),
"campaign resources expose the wizard directory route"
);
assert(
reviewWizard.includes("<ReviewSendPage")
&& reviewWizard.includes('initialStageId="workflow-build-review"'),
"the review wizard focuses the canonical build and review stage"
);
assert(
sendWizard.includes("<ReviewSendPage")
&& sendWizard.includes('initialStageId="workflow-send"'),
"the send wizard focuses the canonical send stage"
);
assert(
!reviewWizard.includes("<MetricCard")
&& !sendWizard.includes("queue_dry_run"),
"placeholder review and send surfaces were removed"
);
assert(
directoryPage.includes("wizardEntriesForContext")
&& directoryPage.includes("<WizardDirectory"),
"the page uses the reusable wizard directory contract and renderer"
);
assert(
directory.includes('contextId: "campaign.resource"')
&& directory.includes('id: "configure"')
&& directory.includes('id: "review"')
&& directory.includes('id: "send"'),
"Campaign contributes configure, review, and send entries"
);
assert(
moduleSource.includes('"wizard.directories": campaignWizardDirectories'),
"Campaign publishes its wizard directory capability"
);