@happyvertical/smrt-marketing 0.39.16
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/AGENTS.md +79 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +67 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/collections/CampaignChannelCollection.d.ts +9 -0
- package/dist/collections/CampaignChannelCollection.d.ts.map +1 -0
- package/dist/collections/CampaignCollection.d.ts +10 -0
- package/dist/collections/CampaignCollection.d.ts.map +1 -0
- package/dist/collections/CampaignMetricSnapshotCollection.d.ts +15 -0
- package/dist/collections/CampaignMetricSnapshotCollection.d.ts.map +1 -0
- package/dist/collections/index.d.ts +4 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +625 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.json +1173 -0
- package/dist/models/Campaign.d.ts +31 -0
- package/dist/models/Campaign.d.ts.map +1 -0
- package/dist/models/CampaignChannel.d.ts +22 -0
- package/dist/models/CampaignChannel.d.ts.map +1 -0
- package/dist/models/CampaignMetricSnapshot.d.ts +29 -0
- package/dist/models/CampaignMetricSnapshot.d.ts.map +1 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/services/BudgetPacingService.d.ts +25 -0
- package/dist/services/BudgetPacingService.d.ts.map +1 -0
- package/dist/services/CampaignLifecycleService.d.ts +19 -0
- package/dist/services/CampaignLifecycleService.d.ts.map +1 -0
- package/dist/services/MetricIngestionService.d.ts +16 -0
- package/dist/services/MetricIngestionService.d.ts.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +875 -0
- package/dist/svelte/__tests__/components.test.js +115 -0
- package/dist/svelte/__tests__/helpers.test.js +94 -0
- package/dist/svelte/components/BudgetPacing.svelte +129 -0
- package/dist/svelte/components/BudgetPacing.svelte.d.ts +10 -0
- package/dist/svelte/components/BudgetPacing.svelte.d.ts.map +1 -0
- package/dist/svelte/components/CampaignDetail.svelte +208 -0
- package/dist/svelte/components/CampaignDetail.svelte.d.ts +14 -0
- package/dist/svelte/components/CampaignDetail.svelte.d.ts.map +1 -0
- package/dist/svelte/components/CampaignList.svelte +140 -0
- package/dist/svelte/components/CampaignList.svelte.d.ts +11 -0
- package/dist/svelte/components/CampaignList.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ChannelMix.svelte +138 -0
- package/dist/svelte/components/ChannelMix.svelte.d.ts +10 -0
- package/dist/svelte/components/ChannelMix.svelte.d.ts.map +1 -0
- package/dist/svelte/components/MarketingDashboard.svelte +129 -0
- package/dist/svelte/components/MarketingDashboard.svelte.d.ts +13 -0
- package/dist/svelte/components/MarketingDashboard.svelte.d.ts.map +1 -0
- package/dist/svelte/format.d.ts +8 -0
- package/dist/svelte/format.d.ts.map +1 -0
- package/dist/svelte/format.js +42 -0
- package/dist/svelte/index.d.ts +8 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +7 -0
- package/dist/svelte/types.d.ts +73 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +80 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export function campaignStatusBadgeVariant(status) {
|
|
2
|
+
switch (status) {
|
|
3
|
+
case 'active':
|
|
4
|
+
return 'success';
|
|
5
|
+
case 'scheduled':
|
|
6
|
+
return 'info';
|
|
7
|
+
case 'paused':
|
|
8
|
+
return 'warning';
|
|
9
|
+
case 'completed':
|
|
10
|
+
return 'primary';
|
|
11
|
+
case 'archived':
|
|
12
|
+
return 'default';
|
|
13
|
+
default:
|
|
14
|
+
return 'default';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function pacingStatusBadgeVariant(status) {
|
|
18
|
+
switch (status) {
|
|
19
|
+
case 'on_track':
|
|
20
|
+
case 'complete':
|
|
21
|
+
return 'success';
|
|
22
|
+
case 'ahead':
|
|
23
|
+
return 'info';
|
|
24
|
+
case 'behind':
|
|
25
|
+
case 'not_started':
|
|
26
|
+
return 'warning';
|
|
27
|
+
case 'over_budget':
|
|
28
|
+
return 'error';
|
|
29
|
+
default:
|
|
30
|
+
return 'default';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function summarizeMarketingDashboard(campaigns) {
|
|
34
|
+
const byCurrency = new Map();
|
|
35
|
+
let channelCount = 0;
|
|
36
|
+
let impressions = 0;
|
|
37
|
+
let clicks = 0;
|
|
38
|
+
let conversions = 0;
|
|
39
|
+
let leads = 0;
|
|
40
|
+
for (const campaign of campaigns) {
|
|
41
|
+
const currency = campaign.currency || 'USD';
|
|
42
|
+
const total = byCurrency.get(currency) ?? {
|
|
43
|
+
currency,
|
|
44
|
+
budgetCents: 0,
|
|
45
|
+
spendCents: 0,
|
|
46
|
+
};
|
|
47
|
+
total.budgetCents += campaign.budgetCents;
|
|
48
|
+
total.spendCents += campaign.spendCents ?? 0;
|
|
49
|
+
byCurrency.set(currency, total);
|
|
50
|
+
channelCount += campaign.channelCount ?? 0;
|
|
51
|
+
impressions += campaign.impressions ?? 0;
|
|
52
|
+
clicks += campaign.clicks ?? 0;
|
|
53
|
+
conversions += campaign.conversions ?? 0;
|
|
54
|
+
leads += campaign.leads ?? 0;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
campaignCount: campaigns.length,
|
|
58
|
+
activeCampaignCount: campaigns.filter((campaign) => campaign.status === 'active').length,
|
|
59
|
+
channelCount,
|
|
60
|
+
impressions,
|
|
61
|
+
clicks,
|
|
62
|
+
conversions,
|
|
63
|
+
leads,
|
|
64
|
+
currencyTotals: [...byCurrency.values()].sort((a, b) => a.currency.localeCompare(b.currency)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function calculateChannelMix(channels) {
|
|
68
|
+
const totalSpend = channels.reduce((sum, channel) => sum + channel.spendCents, 0);
|
|
69
|
+
const totalAllocation = channels.reduce((sum, channel) => sum + channel.allocatedBudgetCents, 0);
|
|
70
|
+
return channels.map((channel) => ({
|
|
71
|
+
...channel,
|
|
72
|
+
spendFraction: totalSpend > 0 ? channel.spendCents / totalSpend : 0,
|
|
73
|
+
allocationFraction: totalAllocation > 0 ? channel.allocatedBudgetCents / totalAllocation : 0,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
export function cappedBudgetProgress(pacing) {
|
|
77
|
+
if (pacing.budgetFraction === null)
|
|
78
|
+
return 0;
|
|
79
|
+
return Math.max(0, Math.min(1, pacing.budgetFraction));
|
|
80
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
export declare const CAMPAIGN_STATUSES: readonly ["draft", "scheduled", "active", "paused", "completed", "archived"];
|
|
3
|
+
export type CampaignStatus = (typeof CAMPAIGN_STATUSES)[number];
|
|
4
|
+
export declare const CAMPAIGN_CHANNEL_KINDS: readonly ["ad_group", "social_post", "message", "content", "event", "referral_program"];
|
|
5
|
+
export type CampaignChannelKind = (typeof CAMPAIGN_CHANNEL_KINDS)[number] | (string & {});
|
|
6
|
+
export declare const CAMPAIGN_CHANNEL_STATUSES: readonly ["planned", "scheduled", "active", "paused", "completed", "cancelled"];
|
|
7
|
+
export type CampaignChannelStatus = (typeof CAMPAIGN_CHANNEL_STATUSES)[number];
|
|
8
|
+
export interface CampaignOptions extends SmrtObjectOptions {
|
|
9
|
+
tenantId?: string | null;
|
|
10
|
+
campaignKey?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
objective?: string;
|
|
13
|
+
status?: CampaignStatus;
|
|
14
|
+
startAt?: Date | string | number | null;
|
|
15
|
+
endAt?: Date | string | number | null;
|
|
16
|
+
budgetCents?: number;
|
|
17
|
+
currency?: string;
|
|
18
|
+
metadata?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CampaignChannelOptions extends SmrtObjectOptions {
|
|
21
|
+
tenantId?: string | null;
|
|
22
|
+
campaignId?: string;
|
|
23
|
+
channelKind?: CampaignChannelKind;
|
|
24
|
+
channelRef?: string;
|
|
25
|
+
allocatedBudgetCents?: number;
|
|
26
|
+
startAt?: Date | string | number | null;
|
|
27
|
+
endAt?: Date | string | number | null;
|
|
28
|
+
status?: CampaignChannelStatus;
|
|
29
|
+
}
|
|
30
|
+
export interface CampaignMetricSnapshotOptions extends SmrtObjectOptions {
|
|
31
|
+
tenantId?: string | null;
|
|
32
|
+
campaignId?: string;
|
|
33
|
+
campaignChannelId?: string | null;
|
|
34
|
+
periodStart?: Date | string | number;
|
|
35
|
+
periodEnd?: Date | string | number;
|
|
36
|
+
spendCents?: number;
|
|
37
|
+
impressions?: number;
|
|
38
|
+
clicks?: number;
|
|
39
|
+
conversions?: number;
|
|
40
|
+
leads?: number;
|
|
41
|
+
revenueCents?: number | null;
|
|
42
|
+
source?: string;
|
|
43
|
+
dedupeKey?: string;
|
|
44
|
+
}
|
|
45
|
+
export type BudgetPacingStatus = 'unbudgeted' | 'not_started' | 'behind' | 'on_track' | 'ahead' | 'over_budget' | 'complete';
|
|
46
|
+
export interface BudgetPacingResult {
|
|
47
|
+
campaignId: string;
|
|
48
|
+
campaignChannelId?: string;
|
|
49
|
+
currency: string;
|
|
50
|
+
budgetCents: number;
|
|
51
|
+
spendCents: number;
|
|
52
|
+
remainingCents: number;
|
|
53
|
+
expectedSpendCents: number | null;
|
|
54
|
+
varianceCents: number | null;
|
|
55
|
+
budgetFraction: number | null;
|
|
56
|
+
elapsedFraction: number | null;
|
|
57
|
+
status: BudgetPacingStatus;
|
|
58
|
+
snapshotCount: number;
|
|
59
|
+
usedCampaignRollups: boolean;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/types.ts
|
|
2
|
+
var CAMPAIGN_STATUSES = [
|
|
3
|
+
"draft",
|
|
4
|
+
"scheduled",
|
|
5
|
+
"active",
|
|
6
|
+
"paused",
|
|
7
|
+
"completed",
|
|
8
|
+
"archived"
|
|
9
|
+
];
|
|
10
|
+
var CAMPAIGN_CHANNEL_KINDS = [
|
|
11
|
+
"ad_group",
|
|
12
|
+
"social_post",
|
|
13
|
+
"message",
|
|
14
|
+
"content",
|
|
15
|
+
"event",
|
|
16
|
+
"referral_program"
|
|
17
|
+
];
|
|
18
|
+
var CAMPAIGN_CHANNEL_STATUSES = [
|
|
19
|
+
"planned",
|
|
20
|
+
"scheduled",
|
|
21
|
+
"active",
|
|
22
|
+
"paused",
|
|
23
|
+
"completed",
|
|
24
|
+
"cancelled"
|
|
25
|
+
];
|
|
26
|
+
//#endregion
|
|
27
|
+
export { CAMPAIGN_CHANNEL_KINDS, CAMPAIGN_CHANNEL_STATUSES, CAMPAIGN_STATUSES };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["/** Shared model and service contracts for @happyvertical/smrt-marketing. */\n\nimport type { SmrtObjectOptions } from '@happyvertical/smrt-core';\n\nexport const CAMPAIGN_STATUSES = [\n 'draft',\n 'scheduled',\n 'active',\n 'paused',\n 'completed',\n 'archived',\n] as const;\n\nexport type CampaignStatus = (typeof CAMPAIGN_STATUSES)[number];\n\nexport const CAMPAIGN_CHANNEL_KINDS = [\n 'ad_group',\n 'social_post',\n 'message',\n 'content',\n 'event',\n 'referral_program',\n] as const;\n\nexport type CampaignChannelKind =\n | (typeof CAMPAIGN_CHANNEL_KINDS)[number]\n | (string & {});\n\nexport const CAMPAIGN_CHANNEL_STATUSES = [\n 'planned',\n 'scheduled',\n 'active',\n 'paused',\n 'completed',\n 'cancelled',\n] as const;\n\nexport type CampaignChannelStatus = (typeof CAMPAIGN_CHANNEL_STATUSES)[number];\n\nexport interface CampaignOptions extends SmrtObjectOptions {\n tenantId?: string | null;\n campaignKey?: string;\n name?: string;\n objective?: string;\n status?: CampaignStatus;\n startAt?: Date | string | number | null;\n endAt?: Date | string | number | null;\n budgetCents?: number;\n currency?: string;\n metadata?: string;\n}\n\nexport interface CampaignChannelOptions extends SmrtObjectOptions {\n tenantId?: string | null;\n campaignId?: string;\n channelKind?: CampaignChannelKind;\n channelRef?: string;\n allocatedBudgetCents?: number;\n startAt?: Date | string | number | null;\n endAt?: Date | string | number | null;\n status?: CampaignChannelStatus;\n}\n\nexport interface CampaignMetricSnapshotOptions extends SmrtObjectOptions {\n tenantId?: string | null;\n campaignId?: string;\n campaignChannelId?: string | null;\n periodStart?: Date | string | number;\n periodEnd?: Date | string | number;\n spendCents?: number;\n impressions?: number;\n clicks?: number;\n conversions?: number;\n leads?: number;\n revenueCents?: number | null;\n source?: string;\n dedupeKey?: string;\n}\n\nexport type BudgetPacingStatus =\n | 'unbudgeted'\n | 'not_started'\n | 'behind'\n | 'on_track'\n | 'ahead'\n | 'over_budget'\n | 'complete';\n\nexport interface BudgetPacingResult {\n campaignId: string;\n campaignChannelId?: string;\n currency: string;\n budgetCents: number;\n spendCents: number;\n remainingCents: number;\n expectedSpendCents: number | null;\n varianceCents: number | null;\n budgetFraction: number | null;\n elapsedFraction: number | null;\n status: BudgetPacingStatus;\n snapshotCount: number;\n usedCampaignRollups: boolean;\n}\n"],"mappings":";AAIO,IAAM,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;AACF;AAIO,IAAM,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;AACF;AAMO,IAAM,4BAA4B;CACvC;CACA;CACA;CACA;CACA;CACA;AACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@happyvertical/smrt-marketing",
|
|
3
|
+
"version": "0.39.16",
|
|
4
|
+
"description": "Cross-channel campaign coordination, immutable performance evidence, budget pacing, and reusable Svelte marketing surfaces for SMRT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"CLAUDE.md",
|
|
11
|
+
"AGENTS.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./svelte": {
|
|
19
|
+
"types": "./dist/svelte/index.d.ts",
|
|
20
|
+
"svelte": "./dist/svelte/index.js",
|
|
21
|
+
"import": "./dist/svelte/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./manifest": "./dist/manifest.json",
|
|
24
|
+
"./manifest.json": "./dist/manifest.json"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@happyvertical/smrt-core": "0.39.16",
|
|
28
|
+
"@happyvertical/smrt-tenancy": "0.39.16",
|
|
29
|
+
"@happyvertical/smrt-ui": "0.39.16"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"svelte": "^5.56.4"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@happyvertical/sql": "^0.78.1",
|
|
36
|
+
"@sveltejs/package": "^2.5.8",
|
|
37
|
+
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
38
|
+
"@testing-library/svelte": "^5.4.2",
|
|
39
|
+
"@types/node": "24.13.2",
|
|
40
|
+
"jsdom": "^26.1.0",
|
|
41
|
+
"svelte": "^5.56.4",
|
|
42
|
+
"svelte-check": "^4.7.1",
|
|
43
|
+
"typescript": "^5.9.3",
|
|
44
|
+
"vite": "^8.1.3",
|
|
45
|
+
"vitest": "^4.1.9",
|
|
46
|
+
"@happyvertical/smrt-vitest": "0.39.16"
|
|
47
|
+
},
|
|
48
|
+
"smrtRawPrimitives": "strict",
|
|
49
|
+
"keywords": [
|
|
50
|
+
"smrt",
|
|
51
|
+
"marketing",
|
|
52
|
+
"campaigns",
|
|
53
|
+
"budget-pacing",
|
|
54
|
+
"multi-tenant"
|
|
55
|
+
],
|
|
56
|
+
"author": "HappyVertical",
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"registry": "https://registry.npmjs.org",
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "https://github.com/happyvertical/smrt.git",
|
|
65
|
+
"directory": "packages/marketing"
|
|
66
|
+
},
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "vite build --mode library && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json",
|
|
69
|
+
"build:watch": "vite build --mode library --watch",
|
|
70
|
+
"clean": "rm -rf dist",
|
|
71
|
+
"dev": "vite dev",
|
|
72
|
+
"test": "vitest run && vitest run --config vitest.svelte.config.ts",
|
|
73
|
+
"test:coverage": "vitest run --coverage --coverage.reportsDirectory=coverage/models && vitest run --coverage --config vitest.svelte.config.ts --coverage.reportsDirectory=coverage/svelte",
|
|
74
|
+
"test:postgres": "node ../../scripts/run-with-ci-postgres.mjs -- pnpm exec vitest run src/__tests__/marketing.postgres.test.ts",
|
|
75
|
+
"test:watch": "vitest",
|
|
76
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && node ../../scripts/svelte-check-a11y.mjs --tsconfig ./tsconfig.svelte.json",
|
|
77
|
+
"verify:pack": "node ../../scripts/verify-package-types-exports.js ."
|
|
78
|
+
}
|
|
79
|
+
}
|