featuredrop 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +376 -4
  2. package/dist/angular.cjs +286 -0
  3. package/dist/angular.cjs.map +1 -0
  4. package/dist/angular.d.cts +229 -0
  5. package/dist/angular.d.ts +229 -0
  6. package/dist/angular.js +283 -0
  7. package/dist/angular.js.map +1 -0
  8. package/dist/featuredrop.cjs +1256 -0
  9. package/dist/featuredrop.cjs.map +1 -0
  10. package/dist/index.cjs +2762 -16
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +979 -9
  13. package/dist/index.d.ts +979 -9
  14. package/dist/index.js +2720 -17
  15. package/dist/index.js.map +1 -1
  16. package/dist/preact.cjs +7289 -0
  17. package/dist/preact.cjs.map +1 -0
  18. package/dist/preact.d.cts +1266 -0
  19. package/dist/preact.d.ts +1266 -0
  20. package/dist/preact.js +7259 -0
  21. package/dist/preact.js.map +1 -0
  22. package/dist/react.cjs +6119 -101
  23. package/dist/react.cjs.map +1 -1
  24. package/dist/react.d.cts +798 -5
  25. package/dist/react.d.ts +798 -5
  26. package/dist/react.js +6103 -103
  27. package/dist/react.js.map +1 -1
  28. package/dist/schema.cjs +215 -0
  29. package/dist/schema.cjs.map +1 -0
  30. package/dist/schema.d.cts +203 -0
  31. package/dist/schema.d.ts +203 -0
  32. package/dist/schema.js +209 -0
  33. package/dist/schema.js.map +1 -0
  34. package/dist/solid.cjs +373 -0
  35. package/dist/solid.cjs.map +1 -0
  36. package/dist/solid.d.cts +242 -0
  37. package/dist/solid.d.ts +242 -0
  38. package/dist/solid.js +366 -0
  39. package/dist/solid.js.map +1 -0
  40. package/dist/svelte.cjs +329 -0
  41. package/dist/svelte.cjs.map +1 -0
  42. package/dist/svelte.js +324 -0
  43. package/dist/svelte.js.map +1 -0
  44. package/dist/testing.cjs +1422 -0
  45. package/dist/testing.cjs.map +1 -0
  46. package/dist/testing.d.cts +339 -0
  47. package/dist/testing.d.ts +339 -0
  48. package/dist/testing.js +1415 -0
  49. package/dist/testing.js.map +1 -0
  50. package/dist/vue.cjs +1084 -0
  51. package/dist/vue.cjs.map +1 -0
  52. package/dist/vue.js +1072 -0
  53. package/dist/vue.js.map +1 -0
  54. package/dist/web-components.cjs +483 -0
  55. package/dist/web-components.cjs.map +1 -0
  56. package/dist/web-components.d.cts +211 -0
  57. package/dist/web-components.d.ts +211 -0
  58. package/dist/web-components.js +477 -0
  59. package/dist/web-components.js.map +1 -0
  60. package/package.json +126 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/helpers.ts","../src/adapters/local-storage.ts","../src/adapters/memory.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FeatureEntry, FeatureManifest, StorageAdapter } from \"./types\";\n\n/**\n * Check if a single feature should show as \"new\".\n *\n * A feature is \"new\" when ALL of these are true:\n * 1. Current time is before `showNewUntil`\n * 2. Feature was released after the watermark (or no watermark exists)\n * 3. Feature has not been individually dismissed\n * 4. If `publishAt` is set, current time must be after it (scheduled publishing)\n */\nexport function isNew(\n feature: FeatureEntry,\n watermark: string | null,\n dismissedIds: ReadonlySet<string>,\n now: Date = new Date(),\n): boolean {\n // Already dismissed by the user on this device\n if (dismissedIds.has(feature.id)) return false;\n\n const nowMs = now.getTime();\n\n // Scheduled publishing — hidden until publishAt\n if (feature.publishAt) {\n const publishMs = new Date(feature.publishAt).getTime();\n if (nowMs < publishMs) return false;\n }\n\n const showUntilMs = new Date(feature.showNewUntil).getTime();\n\n // Past the display window\n if (nowMs >= showUntilMs) return false;\n\n // If there's a watermark, feature must have been released after it\n if (watermark) {\n const watermarkMs = new Date(watermark).getTime();\n const releasedMs = new Date(feature.releasedAt).getTime();\n if (releasedMs <= watermarkMs) return false;\n }\n\n return true;\n}\n\n/**\n * Get all features that are currently \"new\" for this user.\n */\nexport function getNewFeatures(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter((f) => isNew(f, watermark, dismissedIds, now));\n}\n\n/**\n * Get the count of new features.\n */\nexport function getNewFeatureCount(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n): number {\n return getNewFeatures(manifest, storage, now).length;\n}\n\n/**\n * Check if a specific sidebar key has a new feature.\n */\nexport function hasNewFeature(\n manifest: FeatureManifest,\n sidebarKey: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n): boolean {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.some(\n (f) => f.sidebarKey === sidebarKey && isNew(f, watermark, dismissedIds, now),\n );\n}\n\n/**\n * Get all features sorted by priority (critical first) then by release date (newest first).\n */\nexport function getNewFeaturesSorted(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n): FeatureEntry[] {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return getNewFeatures(manifest, storage, now).sort((a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime();\n });\n}\n","import type { FeatureEntry, FeatureManifest, StorageAdapter } from \"./types\";\nimport { isNew } from \"./core\";\n\n/**\n * Create a frozen feature manifest from an array of entries.\n * Ensures the manifest is immutable at runtime.\n */\nexport function createManifest(\n entries: FeatureEntry[],\n): FeatureManifest {\n return Object.freeze([...entries]);\n}\n\n/**\n * Find a feature by its ID in the manifest.\n * Returns `undefined` if not found.\n */\nexport function getFeatureById(\n manifest: FeatureManifest,\n id: string,\n): FeatureEntry | undefined {\n return manifest.find((f) => f.id === id);\n}\n\n/**\n * Get all new features in a specific category.\n */\nexport function getNewFeaturesByCategory(\n manifest: FeatureManifest,\n category: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter(\n (f) => f.category === category && isNew(f, watermark, dismissedIds, now),\n );\n}\n","import type { StorageAdapter } from \"../types\";\n\nexport interface LocalStorageAdapterOptions {\n /** Key prefix for localStorage entries. Default: \"featuredrop\" */\n prefix?: string;\n /** Server-side watermark (ISO string). Typically from user profile. */\n watermark?: string | null;\n /** Callback when dismissAll is called. Use for server-side watermark updates. */\n onDismissAll?: (now: Date) => Promise<void>;\n}\n\nconst DISMISSED_SUFFIX = \":dismissed\";\n\n/**\n * localStorage-based storage adapter.\n *\n * Architecture:\n * - **Watermark** comes from the server (passed at construction time)\n * - **Per-feature dismissals** are stored in localStorage (zero server writes)\n * - **dismissAll()** optionally calls a server callback, then clears localStorage\n *\n * Gracefully handles SSR environments where `window`/`localStorage` is unavailable.\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private readonly prefix: string;\n private readonly watermarkValue: string | null;\n private readonly onDismissAllCallback?: (now: Date) => Promise<void>;\n private readonly dismissedKey: string;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.prefix = options.prefix ?? \"featuredrop\";\n this.watermarkValue = options.watermark ?? null;\n this.onDismissAllCallback = options.onDismissAll;\n this.dismissedKey = `${this.prefix}${DISMISSED_SUFFIX}`;\n }\n\n getWatermark(): string | null {\n return this.watermarkValue;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n try {\n if (typeof window === \"undefined\") return new Set();\n const raw = localStorage.getItem(this.dismissedKey);\n if (!raw) return new Set();\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) return new Set(parsed as string[]);\n return new Set();\n } catch {\n return new Set();\n }\n }\n\n dismiss(id: string): void {\n try {\n if (typeof window === \"undefined\") return;\n const raw = localStorage.getItem(this.dismissedKey);\n const existing: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!existing.includes(id)) {\n existing.push(id);\n localStorage.setItem(this.dismissedKey, JSON.stringify(existing));\n }\n } catch {\n // localStorage unavailable — silent fail\n }\n }\n\n async dismissAll(now: Date): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(this.dismissedKey);\n }\n } catch {\n // localStorage unavailable — silent fail\n }\n\n if (this.onDismissAllCallback) {\n await this.onDismissAllCallback(now);\n }\n }\n}\n","import type { StorageAdapter } from \"../types\";\n\n/**\n * In-memory storage adapter.\n *\n * Useful for:\n * - Testing (no side effects)\n * - Server-side rendering (no `window`/`localStorage`)\n * - Environments without persistent storage\n */\nexport class MemoryAdapter implements StorageAdapter {\n private watermark: string | null;\n private dismissed: Set<string>;\n\n constructor(options: { watermark?: string | null } = {}) {\n this.watermark = options.watermark ?? null;\n this.dismissed = new Set();\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissed;\n }\n\n dismiss(id: string): void {\n this.dismissed.add(id);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissed.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/semver.ts","../src/triggers.ts","../src/core.ts","../src/helpers.ts","../src/markdown.ts","../src/theme.ts","../src/i18n.ts","../src/rss.ts","../src/throttle.ts","../src/analytics.ts","../src/dependencies.ts","../src/variants.ts","../src/cli-utils.ts","../src/schema.ts","../src/adapters/local-storage.ts","../src/adapters/memory.ts","../src/adapters/remote.ts","../src/adapters/postgres.ts","../src/adapters/redis.ts","../src/adapters/hybrid.ts","../src/adapters/mysql.ts","../src/adapters/mongo.ts","../src/adapters/sqlite.ts","../src/adapters/supabase.ts"],"names":["createRequire","sanitized","decoded","z","normalizeDismissedIds","normalizeWatermark","normalizeLastSeen","parseDismissedIds"],"mappings":"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","file":"index.cjs","sourcesContent":["// Minimal semver comparison utilities (no build metadata sorting needed)\n\nexport type Comparator = \">=\" | \"<=\" | \">\" | \"<\" | \"=\";\n\nexport interface SemverParts {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/;\n\nexport function parseSemver(input: string): SemverParts | null {\n const match = input.trim().match(SEMVER_REGEX);\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : [],\n };\n}\n\nexport function compareSemver(a: string, b: string): number {\n const pa = parseSemver(a);\n const pb = parseSemver(b);\n if (!pa || !pb) return 0;\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (pa[key] !== pb[key]) return pa[key] - pb[key];\n }\n\n // Handle prerelease: absence > presence, otherwise lexicographic\n const aPre = pa.prerelease;\n const bPre = pb.prerelease;\n if (aPre.length === 0 && bPre.length === 0) return 0;\n if (aPre.length === 0) return 1;\n if (bPre.length === 0) return -1;\n\n const len = Math.max(aPre.length, bPre.length);\n for (let i = 0; i < len; i++) {\n const ai = aPre[i];\n const bi = bPre[i];\n if (ai === undefined) return -1;\n if (bi === undefined) return 1;\n const aNum = Number(ai);\n const bNum = Number(bi);\n const aIsNum = Number.isInteger(aNum);\n const bIsNum = Number.isInteger(bNum);\n if (aIsNum && bIsNum && aNum !== bNum) return aNum - bNum;\n if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;\n if (ai !== bi) return ai < bi ? -1 : 1;\n }\n return 0;\n}\n\nfunction parseComparator(comp: string): { op: Comparator; version: string } | null {\n const match = comp.trim().match(/^(>=|<=|>|<|=)?\\\\s*(.+)$/);\n if (!match) return null;\n const op = (match[1] as Comparator) || \">=\";\n const version = match[2];\n if (!parseSemver(version)) return null;\n return { op, version };\n}\n\nfunction satisfiesComparator(version: string, comp: { op: Comparator; version: string }): boolean {\n const diff = compareSemver(version, comp.version);\n switch (comp.op) {\n case \">\":\n return diff > 0;\n case \">=\":\n return diff >= 0;\n case \"<\":\n return diff < 0;\n case \"<=\":\n return diff <= 0;\n case \"=\":\n return diff === 0;\n default:\n return false;\n }\n}\n\n// Space-separated comparator list (AND semantics), e.g. \">=2.5.0 <3.0.0\"\nexport function satisfiesRange(version: string, range: string): boolean {\n const parts = range.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return true;\n for (const part of parts) {\n const comp = parseComparator(part);\n if (!comp) return false;\n if (!satisfiesComparator(version, comp)) return false;\n }\n return true;\n}\n","import type { FeatureEntry, FeatureTrigger, TriggerContext } from \"./types\";\n\nfunction wildcardToRegExp(value: string): RegExp {\n const escaped = value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = `^${escaped.replace(/\\*/g, \".*\")}$`;\n return new RegExp(pattern);\n}\n\nfunction matchPath(path: string, pattern: string | RegExp): boolean {\n if (pattern instanceof RegExp) return pattern.test(path);\n if (!pattern) return false;\n if (pattern.includes(\"*\")) return wildcardToRegExp(pattern).test(path);\n return path === pattern || path.startsWith(pattern);\n}\n\nexport function isTriggerMatch(trigger: FeatureTrigger | undefined, context?: TriggerContext): boolean {\n if (!trigger) return true;\n if (!context) return false;\n\n if (trigger.type === \"page\") {\n const path = context.path;\n if (!path) return false;\n return matchPath(path, trigger.match);\n }\n\n if (trigger.type === \"usage\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.event] ?? 0;\n return count >= (trigger.minActions ?? 1);\n }\n\n if (trigger.type === \"time\") {\n const elapsedMs = context.elapsedMs ?? 0;\n return elapsedMs >= trigger.minSeconds * 1000;\n }\n\n if (trigger.type === \"milestone\") {\n return context.milestones?.has(trigger.event) ?? false;\n }\n\n if (trigger.type === \"frustration\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.pattern] ?? 0;\n return count >= (trigger.threshold ?? 1);\n }\n\n if (trigger.type === \"scroll\") {\n return (context.scrollPercent ?? 0) >= (trigger.minPercent ?? 50);\n }\n\n try {\n return trigger.evaluate(context);\n } catch {\n return false;\n }\n}\n\nexport class TriggerEngine {\n private context: TriggerContext;\n\n constructor(initial?: TriggerContext) {\n this.context = {\n path: initial?.path,\n events: new Set(initial?.events ?? []),\n milestones: new Set(initial?.milestones ?? []),\n usage: { ...(initial?.usage ?? {}) },\n elapsedMs: initial?.elapsedMs ?? 0,\n scrollPercent: initial?.scrollPercent ?? 0,\n metadata: { ...(initial?.metadata ?? {}) },\n };\n }\n\n setPath(path: string): void {\n this.context.path = path;\n }\n\n trackEvent(event: string): void {\n const next = new Set(this.context.events ?? new Set<string>());\n next.add(event);\n this.context.events = next;\n }\n\n trackUsage(event: string, delta = 1): void {\n const usage = { ...(this.context.usage ?? {}) };\n usage[event] = (usage[event] ?? 0) + Math.max(1, delta);\n this.context.usage = usage;\n }\n\n trackMilestone(event: string): void {\n const next = new Set(this.context.milestones ?? new Set<string>());\n next.add(event);\n this.context.milestones = next;\n }\n\n setElapsedMs(elapsedMs: number): void {\n this.context.elapsedMs = Math.max(0, elapsedMs);\n }\n\n setScrollPercent(scrollPercent: number): void {\n const clamped = Math.max(0, Math.min(100, scrollPercent));\n this.context.scrollPercent = clamped;\n }\n\n setMetadata(next: Record<string, unknown>): void {\n this.context.metadata = { ...next };\n }\n\n getContext(): TriggerContext {\n return {\n path: this.context.path,\n events: new Set(this.context.events ?? []),\n milestones: new Set(this.context.milestones ?? []),\n usage: { ...(this.context.usage ?? {}) },\n elapsedMs: this.context.elapsedMs,\n scrollPercent: this.context.scrollPercent,\n metadata: { ...(this.context.metadata ?? {}) },\n };\n }\n\n evaluate(trigger: FeatureTrigger | undefined): boolean {\n return isTriggerMatch(trigger, this.context);\n }\n\n evaluateFeature(feature: Pick<FeatureEntry, \"trigger\">): boolean {\n return this.evaluate(feature.trigger);\n }\n}\n","import type {\n AudienceMatchFn,\n AudienceRule,\n FeatureEntry,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n FeatureDependencyState,\n TriggerContext,\n} from \"./types\";\nimport { compareSemver, satisfiesRange } from \"./semver\";\nimport { isTriggerMatch } from \"./triggers\";\n\n/**\n * Default audience matching logic.\n *\n * For each specified field (plan, role, region), checks if the user's\n * value is included in the allowed list. Fields use AND logic between them,\n * OR logic within each field's array. The `custom` field is ignored by\n * the default matcher — use a custom `AudienceMatchFn` for that.\n */\nexport function matchesAudience(\n audience: AudienceRule,\n userContext: UserContext,\n): boolean {\n if (audience.plan && audience.plan.length > 0) {\n if (!userContext.plan || !audience.plan.includes(userContext.plan)) {\n return false;\n }\n }\n if (audience.role && audience.role.length > 0) {\n if (!userContext.role || !audience.role.includes(userContext.role)) {\n return false;\n }\n }\n if (audience.region && audience.region.length > 0) {\n if (!userContext.region || !audience.region.includes(userContext.region)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Check if a feature's audience allows the given user context.\n *\n * - No `audience` field → visible to all\n * - Empty `audience` ({}) → visible to all\n * - `audience` specified but no `userContext` → hidden (safe default)\n * - Otherwise, delegate to `matchFn` (or default `matchesAudience`)\n */\nfunction isAudienceMatch(\n feature: FeatureEntry,\n userContext?: UserContext,\n matchFn?: AudienceMatchFn,\n): boolean {\n // No audience restriction → show to everyone\n if (!feature.audience) return true;\n\n // Check if audience is empty (no fields with values)\n const { plan, role, region, custom } = feature.audience;\n const hasRules =\n (plan && plan.length > 0) ||\n (role && role.length > 0) ||\n (region && region.length > 0) ||\n (custom && Object.keys(custom).length > 0);\n if (!hasRules) return true;\n\n // Audience specified but no user context → hidden (safe default)\n if (!userContext) return false;\n\n // Use custom matcher if provided, otherwise default\n if (matchFn) return matchFn(feature.audience, userContext);\n return matchesAudience(feature.audience, userContext);\n}\n\nfunction isVersionMatch(feature: FeatureEntry, appVersion?: string): boolean {\n const v = feature.version;\n if (!v || typeof v === \"string\") return true; // string = display only\n if (!appVersion) return false; // Safe default when constraints exist\n if (!v.introduced && !v.showNewUntil && !v.deprecatedAt && !v.showIn) return true;\n\n // Range check\n if (v.showIn && !satisfiesRange(appVersion, v.showIn)) return false;\n\n if (v.introduced && compareSemver(appVersion, v.introduced) < 0) return false;\n if (v.deprecatedAt && compareSemver(appVersion, v.deprecatedAt) >= 0) return false;\n\n // showNewUntil gates \"new\" state only\n if (v.showNewUntil && compareSemver(appVersion, v.showNewUntil) >= 0) return false;\n\n return true;\n}\n\nfunction isDependencyMatch(\n feature: FeatureEntry,\n dismissedIds: ReadonlySet<string>,\n dependencyState?: FeatureDependencyState,\n): boolean {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return true;\n\n const seenIds = dependencyState?.seenIds;\n const clickedIds = dependencyState?.clickedIds;\n const dismissedDependencyIds = dependencyState?.dismissedIds ?? dismissedIds;\n\n if (dependsOn.seen && dependsOn.seen.length > 0) {\n for (const id of dependsOn.seen) {\n const seen = seenIds?.has(id) ?? false;\n if (!seen && !dismissedDependencyIds.has(id)) return false;\n }\n }\n\n if (dependsOn.clicked && dependsOn.clicked.length > 0) {\n for (const id of dependsOn.clicked) {\n if (!(clickedIds?.has(id) ?? false)) return false;\n }\n }\n\n if (dependsOn.dismissed && dependsOn.dismissed.length > 0) {\n for (const id of dependsOn.dismissed) {\n if (!dismissedDependencyIds.has(id)) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if a single feature should show as \"new\".\n *\n * A feature is \"new\" when ALL of these are true:\n * 1. Current time is before `showNewUntil`\n * 2. Feature was released after the watermark (or no watermark exists)\n * 3. Feature has not been individually dismissed\n * 4. If `publishAt` is set, current time must be after it (scheduled publishing)\n * 5. If `audience` is set, user must match the targeting rules\n */\nexport function isNew(\n feature: FeatureEntry,\n watermark: string | null,\n dismissedIds: ReadonlySet<string>,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): boolean {\n // Already dismissed by the user on this device\n if (dismissedIds.has(feature.id)) return false;\n\n // Audience targeting — check before time-based checks\n if (!isAudienceMatch(feature, userContext, matchAudience)) return false;\n\n // Dependency targeting — defer features until prerequisites are satisfied\n if (!isDependencyMatch(feature, dismissedIds, dependencyState)) return false;\n\n // Version targeting — requires appVersion when constraints exist\n if (!isVersionMatch(feature, appVersion)) return false;\n\n // Contextual trigger rules — show only when trigger condition is satisfied.\n if (!isTriggerMatch(feature.trigger, triggerContext)) return false;\n\n const nowMs = now.getTime();\n\n // Scheduled publishing — hidden until publishAt\n if (feature.publishAt) {\n const publishMs = new Date(feature.publishAt).getTime();\n if (nowMs < publishMs) return false;\n }\n\n const showUntilMs = new Date(feature.showNewUntil).getTime();\n\n // Past the display window\n if (nowMs >= showUntilMs) return false;\n\n // If there's a watermark, feature must have been released after it\n if (watermark) {\n const watermarkMs = new Date(watermark).getTime();\n const releasedMs = new Date(feature.releasedAt).getTime();\n if (releasedMs <= watermarkMs) return false;\n }\n\n return true;\n}\n\n/**\n * Get all features that are currently \"new\" for this user.\n */\nexport function getNewFeatures(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter((f) =>\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ),\n );\n}\n\n/**\n * Get the count of new features.\n */\nexport function getNewFeatureCount(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): number {\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ).length;\n}\n\n/**\n * Check if a specific sidebar key has a new feature.\n */\nexport function hasNewFeature(\n manifest: FeatureManifest,\n sidebarKey: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): boolean {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.some(\n (f) =>\n f.sidebarKey === sidebarKey &&\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ),\n );\n}\n\n/**\n * Get all features sorted by priority (critical first) then by release date (newest first).\n */\nexport function getNewFeaturesSorted(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): FeatureEntry[] {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ).sort(\n (a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return (\n new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime()\n );\n },\n );\n}\n","import type {\n AudienceMatchFn,\n FeatureEntry,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n} from \"./types\";\nimport { isNew } from \"./core\";\n\n/**\n * Create a frozen feature manifest from an array of entries.\n * Ensures the manifest is immutable at runtime.\n */\nexport function createManifest(\n entries: FeatureEntry[],\n): FeatureManifest {\n return Object.freeze([...entries]);\n}\n\n/**\n * Find a feature by its ID in the manifest.\n * Returns `undefined` if not found.\n */\nexport function getFeatureById(\n manifest: FeatureManifest,\n id: string,\n): FeatureEntry | undefined {\n return manifest.find((f) => f.id === id);\n}\n\n/**\n * Get all new features in a specific category.\n */\nexport function getNewFeaturesByCategory(\n manifest: FeatureManifest,\n category: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter(\n (f) =>\n f.category === category &&\n isNew(f, watermark, dismissedIds, now, userContext, matchAudience, appVersion),\n );\n}\n","import { createRequire } from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire = createRequire(import.meta.url);\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/&lt;(\\/?)([a-z0-9]+)([^>]*)&gt;/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: ![alt](url)\n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","export interface FeatureDropTheme {\n colors: {\n primary: string;\n background: string;\n text: string;\n textMuted: string;\n border: string;\n success: string;\n warning: string;\n error: string;\n };\n fonts: {\n family: string;\n sizeBase: string;\n sizeSm: string;\n sizeLg: string;\n };\n spacing: {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n radii: {\n sm: string;\n md: string;\n lg: string;\n full: string;\n };\n shadows: {\n sm: string;\n md: string;\n lg: string;\n };\n zIndex: {\n base: number;\n tooltip: number;\n modal: number;\n overlay: number;\n };\n}\n\nexport type FeatureDropThemePreset = \"light\" | \"dark\" | \"auto\" | \"minimal\" | \"vibrant\";\n\nexport type FeatureDropThemeOverrides = {\n [K in keyof FeatureDropTheme]?: Partial<FeatureDropTheme[K]>;\n};\n\nexport type FeatureDropThemeInput =\n | FeatureDropThemePreset\n | FeatureDropThemeOverrides\n | FeatureDropTheme;\n\nconst LIGHT_THEME: FeatureDropTheme = {\n colors: {\n primary: \"#2563eb\",\n background: \"#ffffff\",\n text: \"#111827\",\n textMuted: \"#6b7280\",\n border: \"#e5e7eb\",\n success: \"#16a34a\",\n warning: \"#f59e0b\",\n error: \"#dc2626\",\n },\n fonts: {\n family: \"system-ui, -apple-system, Segoe UI, sans-serif\",\n sizeBase: \"14px\",\n sizeSm: \"12px\",\n sizeLg: \"16px\",\n },\n spacing: {\n xs: \"4px\",\n sm: \"8px\",\n md: \"12px\",\n lg: \"16px\",\n xl: \"24px\",\n },\n radii: {\n sm: \"6px\",\n md: \"8px\",\n lg: \"12px\",\n full: \"999px\",\n },\n shadows: {\n sm: \"0 2px 8px rgba(0, 0, 0, 0.08)\",\n md: \"0 8px 24px rgba(0, 0, 0, 0.12)\",\n lg: \"0 20px 60px rgba(0, 0, 0, 0.16)\",\n },\n zIndex: {\n base: 9998,\n tooltip: 10000,\n modal: 10001,\n overlay: 9997,\n },\n};\n\nconst DARK_THEME: FeatureDropTheme = {\n ...LIGHT_THEME,\n colors: {\n primary: \"#60a5fa\",\n background: \"#0b1220\",\n text: \"#f3f4f6\",\n textMuted: \"#9ca3af\",\n border: \"#1f2937\",\n success: \"#4ade80\",\n warning: \"#fbbf24\",\n error: \"#f87171\",\n },\n shadows: {\n sm: \"0 2px 8px rgba(0, 0, 0, 0.35)\",\n md: \"0 8px 24px rgba(0, 0, 0, 0.42)\",\n lg: \"0 20px 60px rgba(0, 0, 0, 0.52)\",\n },\n};\n\nconst MINIMAL_THEME: FeatureDropTheme = {\n ...LIGHT_THEME,\n colors: {\n ...LIGHT_THEME.colors,\n primary: \"#111827\",\n background: \"#ffffff\",\n text: \"#111827\",\n textMuted: \"#6b7280\",\n border: \"#d1d5db\",\n success: \"#111827\",\n warning: \"#111827\",\n error: \"#111827\",\n },\n shadows: {\n sm: \"none\",\n md: \"none\",\n lg: \"none\",\n },\n radii: {\n sm: \"0\",\n md: \"0\",\n lg: \"0\",\n full: \"0\",\n },\n};\n\nconst VIBRANT_THEME: FeatureDropTheme = {\n ...LIGHT_THEME,\n colors: {\n primary: \"#ec4899\",\n background: \"#fff7ed\",\n text: \"#3f1d57\",\n textMuted: \"#6d4c84\",\n border: \"#fdba74\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n },\n shadows: {\n sm: \"0 2px 10px rgba(236, 72, 153, 0.15)\",\n md: \"0 10px 26px rgba(236, 72, 153, 0.22)\",\n lg: \"0 22px 58px rgba(236, 72, 153, 0.28)\",\n },\n};\n\nexport const FEATUREDROP_THEMES = {\n light: LIGHT_THEME,\n dark: DARK_THEME,\n minimal: MINIMAL_THEME,\n vibrant: VIBRANT_THEME,\n} as const;\n\nfunction isThemePreset(value: unknown): value is FeatureDropThemePreset {\n return (\n value === \"light\" ||\n value === \"dark\" ||\n value === \"auto\" ||\n value === \"minimal\" ||\n value === \"vibrant\"\n );\n}\n\nfunction mergeTheme(base: FeatureDropTheme, overrides?: FeatureDropThemeOverrides): FeatureDropTheme {\n if (!overrides) return base;\n return {\n colors: {\n ...base.colors,\n ...(overrides.colors ?? {}),\n },\n fonts: {\n ...base.fonts,\n ...(overrides.fonts ?? {}),\n },\n spacing: {\n ...base.spacing,\n ...(overrides.spacing ?? {}),\n },\n radii: {\n ...base.radii,\n ...(overrides.radii ?? {}),\n },\n shadows: {\n ...base.shadows,\n ...(overrides.shadows ?? {}),\n },\n zIndex: {\n ...base.zIndex,\n ...(overrides.zIndex ?? {}),\n },\n };\n}\n\nexport function createTheme(overrides: FeatureDropThemeOverrides, base: FeatureDropTheme = LIGHT_THEME): FeatureDropTheme {\n return mergeTheme(base, overrides);\n}\n\nexport function resolveTheme(\n input: FeatureDropThemeInput = \"light\",\n options: { prefersDark?: boolean } = {},\n): FeatureDropTheme {\n if (isThemePreset(input)) {\n if (input === \"auto\") {\n return options.prefersDark ? DARK_THEME : LIGHT_THEME;\n }\n return FEATUREDROP_THEMES[input];\n }\n return mergeTheme(LIGHT_THEME, input);\n}\n\nfunction applyThemeSection(\n vars: Record<string, string | number>,\n key: string,\n values: Record<string, string | number>,\n): void {\n for (const [token, value] of Object.entries(values)) {\n vars[`--featuredrop-${key}-${token}`] = value;\n }\n}\n\nexport function themeToCSSVariables(theme: FeatureDropTheme): Record<string, string | number> {\n const vars: Record<string, string | number> = {};\n\n applyThemeSection(vars, \"color\", theme.colors);\n applyThemeSection(vars, \"font\", theme.fonts);\n applyThemeSection(vars, \"space\", theme.spacing);\n applyThemeSection(vars, \"radius\", theme.radii);\n applyThemeSection(vars, \"shadow\", theme.shadows);\n applyThemeSection(vars, \"z\", theme.zIndex as Record<string, number>);\n\n vars[\"--featuredrop-font-family\"] = theme.fonts.family;\n vars[\"--featuredrop-widget-bg\"] = theme.colors.background;\n vars[\"--featuredrop-trigger-bg\"] = theme.colors.background;\n vars[\"--featuredrop-trigger-color\"] = theme.colors.text;\n vars[\"--featuredrop-entry-title-color\"] = theme.colors.text;\n vars[\"--featuredrop-entry-desc-color\"] = theme.colors.textMuted;\n vars[\"--featuredrop-title-color\"] = theme.colors.text;\n vars[\"--featuredrop-border-color\"] = theme.colors.border;\n vars[\"--featuredrop-cta-bg\"] = theme.colors.primary;\n vars[\"--featuredrop-cta-color\"] = theme.colors.background;\n vars[\"--featuredrop-mark-all-color\"] = theme.colors.primary;\n vars[\"--featuredrop-widget-shadow\"] = theme.shadows.md;\n vars[\"--featuredrop-widget-radius\"] = theme.radii.lg;\n vars[\"--featuredrop-trigger-radius\"] = theme.radii.md;\n vars[\"--featuredrop-badge-bg\"] = theme.colors.warning;\n vars[\"--featuredrop-z-index\"] = theme.zIndex.base;\n vars[\"--featuredrop-toast-z-index\"] = theme.zIndex.tooltip;\n vars[\"--featuredrop-tour-z-index\"] = theme.zIndex.modal;\n vars[\"--featuredrop-tour-overlay-z-index\"] = theme.zIndex.overlay;\n\n return vars;\n}\n","export interface FeatureDropTranslations {\n newBadge: string;\n whatsNewTitle: string;\n markAllRead: string;\n allCaughtUp: string;\n close: string;\n changelogTitle: string;\n searchPlaceholder: string;\n allCategories: string;\n noUpdatesYet: string;\n loadMore: string;\n share: string;\n skipToEntries: string;\n stepOf: (current: number, total: number) => string;\n back: string;\n next: string;\n skip: string;\n finish: string;\n gotIt: string;\n announcement: string;\n feedbackTitle: string;\n feedbackTrigger: string;\n feedbackSubmitted: string;\n submit: string;\n cancel: string;\n askLater: string;\n}\n\nconst EN_TRANSLATIONS: FeatureDropTranslations = {\n newBadge: \"New\",\n whatsNewTitle: \"What's New\",\n markAllRead: \"Mark all as read\",\n allCaughtUp: \"You're all caught up!\",\n close: \"Close\",\n changelogTitle: \"Changelog\",\n searchPlaceholder: \"Search updates\",\n allCategories: \"All categories\",\n noUpdatesYet: \"No updates yet\",\n loadMore: \"Load more\",\n share: \"Share\",\n skipToEntries: \"Skip to changelog entries\",\n stepOf: (current: number, total: number) => `Step ${current} of ${total}`,\n back: \"Back\",\n next: \"Next\",\n skip: \"Skip\",\n finish: \"Finish\",\n gotIt: \"Got it\",\n announcement: \"Announcement\",\n feedbackTitle: \"Share feedback\",\n feedbackTrigger: \"Feedback\",\n feedbackSubmitted: \"Thanks for the feedback.\",\n submit: \"Submit\",\n cancel: \"Cancel\",\n askLater: \"Ask me later\",\n};\n\nconst SIMPLE_TRANSLATIONS: Record<string, Partial<FeatureDropTranslations>> = {\n es: {\n newBadge: \"Nuevo\",\n whatsNewTitle: \"Novedades\",\n markAllRead: \"Marcar todo como leído\",\n allCaughtUp: \"Estás al día.\",\n close: \"Cerrar\",\n changelogTitle: \"Registro de cambios\",\n searchPlaceholder: \"Buscar actualizaciones\",\n allCategories: \"Todas las categorías\",\n noUpdatesYet: \"Aún no hay actualizaciones\",\n loadMore: \"Cargar más\",\n share: \"Compartir\",\n skipToEntries: \"Saltar a las entradas del changelog\",\n back: \"Atrás\",\n next: \"Siguiente\",\n skip: \"Saltar\",\n finish: \"Finalizar\",\n gotIt: \"Entendido\",\n announcement: \"Anuncio\",\n feedbackTitle: \"Enviar comentarios\",\n feedbackTrigger: \"Comentarios\",\n feedbackSubmitted: \"Gracias por tus comentarios.\",\n submit: \"Enviar\",\n cancel: \"Cancelar\",\n askLater: \"Preguntar más tarde\",\n },\n fr: {\n newBadge: \"Nouveau\",\n whatsNewTitle: \"Nouveautés\",\n markAllRead: \"Tout marquer comme lu\",\n allCaughtUp: \"Vous êtes à jour.\",\n close: \"Fermer\",\n changelogTitle: \"Journal des changements\",\n searchPlaceholder: \"Rechercher des mises à jour\",\n allCategories: \"Toutes les catégories\",\n noUpdatesYet: \"Aucune mise à jour\",\n loadMore: \"Charger plus\",\n share: \"Partager\",\n skipToEntries: \"Aller aux entrées du changelog\",\n back: \"Retour\",\n next: \"Suivant\",\n skip: \"Passer\",\n finish: \"Terminer\",\n gotIt: \"Compris\",\n announcement: \"Annonce\",\n feedbackTitle: \"Partager un avis\",\n feedbackTrigger: \"Avis\",\n feedbackSubmitted: \"Merci pour votre avis.\",\n submit: \"Envoyer\",\n cancel: \"Annuler\",\n askLater: \"Demander plus tard\",\n },\n de: {\n newBadge: \"Neu\",\n whatsNewTitle: \"Neuigkeiten\",\n markAllRead: \"Alles als gelesen markieren\",\n allCaughtUp: \"Alles erledigt.\",\n close: \"Schließen\",\n changelogTitle: \"Änderungsprotokoll\",\n searchPlaceholder: \"Updates suchen\",\n allCategories: \"Alle Kategorien\",\n noUpdatesYet: \"Noch keine Updates\",\n loadMore: \"Mehr laden\",\n share: \"Teilen\",\n skipToEntries: \"Zu den Einträgen springen\",\n back: \"Zurück\",\n next: \"Weiter\",\n skip: \"Überspringen\",\n finish: \"Fertig\",\n gotIt: \"Verstanden\",\n announcement: \"Ankündigung\",\n feedbackTitle: \"Feedback teilen\",\n feedbackTrigger: \"Feedback\",\n feedbackSubmitted: \"Danke für dein Feedback.\",\n submit: \"Senden\",\n cancel: \"Abbrechen\",\n askLater: \"Später fragen\",\n },\n pt: {\n newBadge: \"Novo\",\n whatsNewTitle: \"Novidades\",\n markAllRead: \"Marcar tudo como lido\",\n allCaughtUp: \"Tudo em dia.\",\n close: \"Fechar\",\n changelogTitle: \"Histórico de mudanças\",\n searchPlaceholder: \"Buscar atualizações\",\n allCategories: \"Todas as categorias\",\n noUpdatesYet: \"Sem atualizações ainda\",\n loadMore: \"Carregar mais\",\n share: \"Compartilhar\",\n skipToEntries: \"Ir para entradas do changelog\",\n back: \"Voltar\",\n next: \"Próximo\",\n skip: \"Pular\",\n finish: \"Concluir\",\n gotIt: \"Entendi\",\n announcement: \"Anúncio\",\n feedbackTitle: \"Enviar feedback\",\n feedbackTrigger: \"Feedback\",\n feedbackSubmitted: \"Obrigado pelo feedback.\",\n submit: \"Enviar\",\n cancel: \"Cancelar\",\n askLater: \"Perguntar depois\",\n },\n \"zh-cn\": {\n newBadge: \"新\",\n whatsNewTitle: \"最新动态\",\n markAllRead: \"全部标记为已读\",\n allCaughtUp: \"你已查看全部更新。\",\n close: \"关闭\",\n changelogTitle: \"更新日志\",\n searchPlaceholder: \"搜索更新\",\n allCategories: \"全部分类\",\n noUpdatesYet: \"暂无更新\",\n loadMore: \"加载更多\",\n share: \"分享\",\n skipToEntries: \"跳转到更新条目\",\n back: \"返回\",\n next: \"下一步\",\n skip: \"跳过\",\n finish: \"完成\",\n gotIt: \"知道了\",\n announcement: \"公告\",\n feedbackTitle: \"提交反馈\",\n feedbackTrigger: \"反馈\",\n feedbackSubmitted: \"感谢你的反馈。\",\n submit: \"提交\",\n cancel: \"取消\",\n askLater: \"稍后询问\",\n },\n ja: {\n newBadge: \"新着\",\n whatsNewTitle: \"新機能\",\n markAllRead: \"すべて既読にする\",\n allCaughtUp: \"すべて確認済みです。\",\n close: \"閉じる\",\n changelogTitle: \"変更履歴\",\n searchPlaceholder: \"更新を検索\",\n allCategories: \"すべてのカテゴリ\",\n noUpdatesYet: \"更新はありません\",\n loadMore: \"さらに表示\",\n share: \"共有\",\n skipToEntries: \"変更履歴へ移動\",\n back: \"戻る\",\n next: \"次へ\",\n skip: \"スキップ\",\n finish: \"完了\",\n gotIt: \"了解\",\n announcement: \"お知らせ\",\n feedbackTitle: \"フィードバックを送信\",\n feedbackTrigger: \"フィードバック\",\n feedbackSubmitted: \"フィードバックありがとうございます。\",\n submit: \"送信\",\n cancel: \"キャンセル\",\n askLater: \"後で聞く\",\n },\n ko: {\n newBadge: \"새로움\",\n whatsNewTitle: \"새 소식\",\n markAllRead: \"모두 읽음 처리\",\n allCaughtUp: \"모든 업데이트를 확인했습니다.\",\n close: \"닫기\",\n changelogTitle: \"변경 로그\",\n searchPlaceholder: \"업데이트 검색\",\n allCategories: \"전체 카테고리\",\n noUpdatesYet: \"업데이트가 없습니다\",\n loadMore: \"더 보기\",\n share: \"공유\",\n skipToEntries: \"변경 항목으로 이동\",\n back: \"뒤로\",\n next: \"다음\",\n skip: \"건너뛰기\",\n finish: \"완료\",\n gotIt: \"확인\",\n announcement: \"공지\",\n feedbackTitle: \"피드백 보내기\",\n feedbackTrigger: \"피드백\",\n feedbackSubmitted: \"피드백 감사합니다.\",\n submit: \"제출\",\n cancel: \"취소\",\n askLater: \"나중에 묻기\",\n },\n ar: {\n newBadge: \"جديد\",\n whatsNewTitle: \"ما الجديد\",\n markAllRead: \"تحديد الكل كمقروء\",\n allCaughtUp: \"تمت متابعة كل التحديثات.\",\n close: \"إغلاق\",\n changelogTitle: \"سجل التغييرات\",\n searchPlaceholder: \"ابحث في التحديثات\",\n allCategories: \"كل الفئات\",\n noUpdatesYet: \"لا توجد تحديثات بعد\",\n loadMore: \"تحميل المزيد\",\n share: \"مشاركة\",\n skipToEntries: \"تخطي إلى عناصر السجل\",\n back: \"رجوع\",\n next: \"التالي\",\n skip: \"تخطي\",\n finish: \"إنهاء\",\n gotIt: \"تم\",\n announcement: \"إعلان\",\n feedbackTitle: \"شارك ملاحظاتك\",\n feedbackTrigger: \"ملاحظات\",\n feedbackSubmitted: \"شكرًا على ملاحظاتك.\",\n submit: \"إرسال\",\n cancel: \"إلغاء\",\n askLater: \"اسألني لاحقًا\",\n },\n hi: {\n newBadge: \"नया\",\n whatsNewTitle: \"नया क्या है\",\n markAllRead: \"सभी को पढ़ा हुआ चिह्नित करें\",\n allCaughtUp: \"आपने सभी अपडेट देख लिए हैं।\",\n close: \"बंद करें\",\n changelogTitle: \"परिवर्तन सूची\",\n searchPlaceholder: \"अपडेट खोजें\",\n allCategories: \"सभी श्रेणियां\",\n noUpdatesYet: \"अभी कोई अपडेट नहीं\",\n loadMore: \"और लोड करें\",\n share: \"साझा करें\",\n skipToEntries: \"चेंजलॉग प्रविष्टियों पर जाएं\",\n back: \"वापस\",\n next: \"अगला\",\n skip: \"छोड़ें\",\n finish: \"समाप्त\",\n gotIt: \"ठीक है\",\n announcement: \"घोषणा\",\n feedbackTitle: \"फीडबैक साझा करें\",\n feedbackTrigger: \"फीडबैक\",\n feedbackSubmitted: \"फीडबैक के लिए धन्यवाद।\",\n submit: \"जमा करें\",\n cancel: \"रद्द करें\",\n askLater: \"बाद में पूछें\",\n },\n};\n\nexport function resolveTranslations(\n locale?: string,\n overrides?: Partial<FeatureDropTranslations>,\n): FeatureDropTranslations {\n const normalizedLocale = (locale ?? \"en\").toLowerCase();\n const base =\n SIMPLE_TRANSLATIONS[normalizedLocale] ??\n SIMPLE_TRANSLATIONS[normalizedLocale.split(\"-\")[0]] ??\n {};\n\n return {\n ...EN_TRANSLATIONS,\n ...base,\n ...(overrides ?? {}),\n stepOf: overrides?.stepOf ?? EN_TRANSLATIONS.stepOf,\n };\n}\n\nexport const FEATUREDROP_TRANSLATIONS = {\n en: EN_TRANSLATIONS,\n ...SIMPLE_TRANSLATIONS,\n} as const;\n","import type { FeatureManifest } from \"./types\";\nimport { parseDescription } from \"./markdown\";\n\nfunction escape(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Generate a simple RSS 2.0 feed from a feature manifest.\n * Titles and descriptions are sanitized via `parseDescription`.\n */\nexport function generateRSS(manifest: FeatureManifest, options?: { title?: string; link?: string; description?: string }): string {\n const title = escape(options?.title ?? \"Featuredrop Changelog\");\n const link = escape(options?.link ?? \"\");\n const desc = escape(options?.description ?? \"Product updates\");\n\n const items = manifest\n .slice()\n .sort((a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime())\n .map((item) => {\n const descriptionHtml = item.description ? parseDescription(item.description) : \"\";\n const itemLink = item.url ? escape(item.url) : \"\";\n return [\n \"<item>\",\n `<title>${escape(item.label)}</title>`,\n itemLink ? `<link>${itemLink}</link>` : \"\",\n `<guid isPermaLink=\\\"false\\\">${escape(item.id)}</guid>`,\n `<pubDate>${new Date(item.releasedAt).toUTCString()}</pubDate>`,\n `<description><![CDATA[${descriptionHtml}]]></description>`,\n \"</item>\",\n ].join(\"\");\n })\n .join(\"\");\n\n return [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<rss version=\\\"2.0\\\">\",\n \"<channel>\",\n `<title>${title}</title>`,\n link ? `<link>${link}</link>` : \"\",\n `<description>${desc}</description>`,\n items,\n \"</channel>\",\n \"</rss>\",\n ].join(\"\");\n}\n","import type { FeatureEntry } from \"./types\";\n\nexport interface ThrottleOptions {\n maxSimultaneousBadges?: number;\n maxSimultaneousSpotlights?: number;\n maxToastsPerSession?: number;\n minTimeBetweenModals?: number;\n minTimeBetweenTours?: number;\n sessionCooldown?: number;\n respectDoNotDisturb?: boolean;\n}\n\nexport interface ThrottleRuntimeState {\n sessionStartedAt: number;\n quietMode?: boolean;\n}\n\nexport interface ThrottleResult {\n visible: FeatureEntry[];\n queued: FeatureEntry[];\n}\n\nfunction sortByPriorityAndRecency(features: FeatureEntry[]): FeatureEntry[] {\n const priorityWeight = { critical: 3, normal: 2, low: 1 };\n return [...features].sort((a, b) => {\n const scoreA = priorityWeight[a.priority ?? \"normal\"];\n const scoreB = priorityWeight[b.priority ?? \"normal\"];\n if (scoreA !== scoreB) return scoreB - scoreA;\n return new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime();\n });\n}\n\nexport function applyAnnouncementThrottle(\n features: FeatureEntry[],\n options: ThrottleOptions | undefined,\n state: ThrottleRuntimeState,\n now: number = Date.now(),\n): ThrottleResult {\n const sorted = sortByPriorityAndRecency(features);\n if (sorted.length === 0) {\n return { visible: [], queued: [] };\n }\n\n if (options?.sessionCooldown && options.sessionCooldown > 0) {\n const elapsed = now - state.sessionStartedAt;\n if (elapsed < options.sessionCooldown) {\n return { visible: [], queued: sorted };\n }\n }\n\n if (options?.respectDoNotDisturb && state.quietMode) {\n const visible = sorted.filter((feature) => feature.priority === \"critical\");\n const queued = sorted.filter((feature) => feature.priority !== \"critical\");\n return { visible, queued };\n }\n\n const maxVisible = options?.maxSimultaneousBadges;\n if (!maxVisible || !Number.isFinite(maxVisible) || maxVisible < 1) {\n return { visible: sorted, queued: [] };\n }\n\n return {\n visible: sorted.slice(0, maxVisible),\n queued: sorted.slice(maxVisible),\n };\n}\n","export type AdoptionEventType =\n | \"feature_seen\"\n | \"feature_clicked\"\n | \"feature_dismissed\"\n | \"tour_started\"\n | \"tour_completed\"\n | \"tour_skipped\"\n | \"checklist_task_completed\"\n | \"checklist_completed\"\n | \"survey_submitted\"\n | \"feedback_submitted\"\n | \"announcement_shown\"\n | \"cta_clicked\";\n\nexport interface AdoptionEvent {\n type: AdoptionEventType;\n featureId?: string;\n tourId?: string;\n variant?: string;\n timestamp: string;\n sessionId?: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type AdoptionEventInput = Omit<AdoptionEvent, \"timestamp\"> & {\n timestamp?: string;\n};\n\nexport interface AnalyticsAdapter {\n track: (event: AdoptionEvent) => void | Promise<void>;\n trackBatch?: (events: AdoptionEvent[]) => void | Promise<void>;\n}\n\nexport interface AnalyticsCollectorOptions {\n adapter: AnalyticsAdapter;\n batchSize?: number;\n flushInterval?: number;\n sampleRate?: number;\n enabled?: boolean;\n sessionId?: string;\n userId?: string;\n now?: () => Date;\n random?: () => number;\n}\n\nexport class AnalyticsCollector {\n private adapter: AnalyticsAdapter;\n private queue: AdoptionEvent[] = [];\n private batchSize: number;\n private flushInterval: number;\n private sampleRate: number;\n private enabled: boolean;\n private now: () => Date;\n private random: () => number;\n private sessionId?: string;\n private userId?: string;\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n\n constructor(options: AnalyticsCollectorOptions) {\n this.adapter = options.adapter;\n this.batchSize = options.batchSize ?? 20;\n this.flushInterval = options.flushInterval ?? 10_000;\n this.sampleRate = options.sampleRate ?? 1;\n this.enabled = options.enabled ?? true;\n this.sessionId = options.sessionId;\n this.userId = options.userId;\n this.now = options.now ?? (() => new Date());\n this.random = options.random ?? Math.random;\n this.startTimer();\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n setContext(context: { sessionId?: string; userId?: string }): void {\n if (context.sessionId !== undefined) this.sessionId = context.sessionId;\n if (context.userId !== undefined) this.userId = context.userId;\n }\n\n getQueueSize(): number {\n return this.queue.length;\n }\n\n track(event: AdoptionEventInput): void {\n if (!this.enabled) return;\n if (this.sampleRate < 1 && this.random() > this.sampleRate) return;\n const normalized: AdoptionEvent = {\n ...event,\n timestamp: event.timestamp ?? this.now().toISOString(),\n sessionId: event.sessionId ?? this.sessionId,\n userId: event.userId ?? this.userId,\n };\n this.queue.push(normalized);\n if (this.queue.length >= this.batchSize) {\n void this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.flushing) return;\n if (this.queue.length === 0) return;\n this.flushing = true;\n const batch = this.queue.splice(0, this.queue.length);\n try {\n if (this.adapter.trackBatch) {\n await this.adapter.trackBatch(batch);\n } else {\n for (const event of batch) {\n await this.adapter.track(event);\n }\n }\n } catch {\n // Requeue on transient failures.\n this.queue = [...batch, ...this.queue];\n } finally {\n this.flushing = false;\n }\n }\n\n async destroy(): Promise<void> {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n await this.flush();\n }\n\n private startTimer(): void {\n if (this.flushInterval <= 0) return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.flushInterval);\n }\n}\n\nexport class PostHogAdapter implements AnalyticsAdapter {\n constructor(\n private readonly client: {\n capture: (event: string, properties?: Record<string, unknown>) => void;\n },\n ) {}\n\n track(event: AdoptionEvent): void {\n this.client.capture(event.type, {\n featureId: event.featureId,\n tourId: event.tourId,\n variant: event.variant,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n userId: event.userId,\n ...event.metadata,\n });\n }\n}\n\nexport class AmplitudeAdapter implements AnalyticsAdapter {\n constructor(\n private readonly client: {\n track: (event: string, properties?: Record<string, unknown>) => void;\n },\n ) {}\n\n track(event: AdoptionEvent): void {\n this.client.track(event.type, {\n featureId: event.featureId,\n tourId: event.tourId,\n variant: event.variant,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n userId: event.userId,\n ...event.metadata,\n });\n }\n}\n\nexport class MixpanelAdapter implements AnalyticsAdapter {\n constructor(\n private readonly client: {\n track: (event: string, properties?: Record<string, unknown>) => void;\n },\n ) {}\n\n track(event: AdoptionEvent): void {\n this.client.track(event.type, {\n featureId: event.featureId,\n tourId: event.tourId,\n variant: event.variant,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n userId: event.userId,\n ...event.metadata,\n });\n }\n}\n\nexport class SegmentAdapter implements AnalyticsAdapter {\n constructor(\n private readonly client: {\n track: (event: string, properties?: Record<string, unknown>) => void;\n },\n ) {}\n\n track(event: AdoptionEvent): void {\n this.client.track(event.type, {\n featureId: event.featureId,\n tourId: event.tourId,\n variant: event.variant,\n timestamp: event.timestamp,\n sessionId: event.sessionId,\n userId: event.userId,\n ...event.metadata,\n });\n }\n}\n\nexport class CustomAdapter implements AnalyticsAdapter {\n constructor(private readonly handler: (event: AdoptionEvent) => void | Promise<void>) {}\n\n track(event: AdoptionEvent): void | Promise<void> {\n return this.handler(event);\n }\n}\n\nexport interface FeatureEngagementMetrics {\n seen: number;\n clicked: number;\n dismissed: number;\n}\n\nexport interface AdoptionMetrics {\n getAdoptionRate: (featureId: string) => number;\n getTourCompletionRate: (tourId: string) => number;\n getChecklistCompletionRate: (checklistId: string) => number;\n getFeatureEngagement: (featureId: string) => FeatureEngagementMetrics;\n getVariantPerformance: (featureId: string) => Record<string, number>;\n}\n\nexport function createAdoptionMetrics(events: AdoptionEvent[]): AdoptionMetrics {\n const getAdoptionRate = (featureId: string): number => {\n const seen = events.filter((event) => event.type === \"feature_seen\" && event.featureId === featureId).length;\n if (seen === 0) return 0;\n const clicked = events.filter((event) => event.type === \"feature_clicked\" && event.featureId === featureId).length;\n return clicked / seen;\n };\n\n const getTourCompletionRate = (tourId: string): number => {\n const started = events.filter((event) => event.type === \"tour_started\" && event.tourId === tourId).length;\n if (started === 0) return 0;\n const completed = events.filter((event) => event.type === \"tour_completed\" && event.tourId === tourId).length;\n return completed / started;\n };\n\n const getChecklistCompletionRate = (checklistId: string): number => {\n const taskCompleted = events.filter((event) =>\n event.type === \"checklist_task_completed\" &&\n event.metadata?.checklistId === checklistId\n ).length;\n if (taskCompleted === 0) return 0;\n const completed = events.filter((event) =>\n event.type === \"checklist_completed\" &&\n event.metadata?.checklistId === checklistId\n ).length;\n return completed / taskCompleted;\n };\n\n const getFeatureEngagement = (featureId: string): FeatureEngagementMetrics => ({\n seen: events.filter((event) => event.type === \"feature_seen\" && event.featureId === featureId).length,\n clicked: events.filter((event) => event.type === \"feature_clicked\" && event.featureId === featureId).length,\n dismissed: events.filter((event) => event.type === \"feature_dismissed\" && event.featureId === featureId).length,\n });\n\n const getVariantPerformance = (featureId: string): Record<string, number> => {\n const byVariant = new Map<string, { seen: number; clicked: number }>();\n for (const event of events) {\n if (event.featureId !== featureId) continue;\n const variant = event.variant ?? \"control\";\n const bucket = byVariant.get(variant) ?? { seen: 0, clicked: 0 };\n if (event.type === \"feature_seen\") bucket.seen += 1;\n if (event.type === \"feature_clicked\") bucket.clicked += 1;\n byVariant.set(variant, bucket);\n }\n const output: Record<string, number> = {};\n for (const [variant, bucket] of byVariant.entries()) {\n output[variant] = bucket.seen === 0 ? 0 : bucket.clicked / bucket.seen;\n }\n return output;\n };\n\n return {\n getAdoptionRate,\n getTourCompletionRate,\n getChecklistCompletionRate,\n getFeatureEngagement,\n getVariantPerformance,\n };\n}\n","import type { FeatureEntry, FeatureManifest } from \"./types\";\n\nfunction getDirectDependencies(feature: FeatureEntry): string[] {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return [];\n const seen = dependsOn.seen ?? [];\n const clicked = dependsOn.clicked ?? [];\n const dismissed = dependsOn.dismissed ?? [];\n const unique = new Set<string>();\n for (const id of [...seen, ...clicked, ...dismissed]) {\n if (id) unique.add(id);\n }\n return Array.from(unique);\n}\n\nexport function resolveDependencyOrder(manifest: FeatureManifest): string[] {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n ordered.push(id);\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n // On cycles, append remaining IDs in original order to keep behavior stable.\n if (ordered.length < manifest.length) {\n const included = new Set(ordered);\n for (const feature of manifest) {\n if (included.has(feature.id)) continue;\n ordered.push(feature.id);\n }\n }\n\n return ordered;\n}\n\nexport function hasDependencyCycle(manifest: FeatureManifest): boolean {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n visited += 1;\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n return visited !== manifest.length;\n}\n\nexport function sortFeaturesByDependencies(features: FeatureEntry[]): FeatureEntry[] {\n if (features.length <= 1) return [...features];\n const order = resolveDependencyOrder(features);\n const rank = new Map(order.map((id, index) => [id, index]));\n return [...features].sort((a, b) => {\n const ra = rank.get(a.id);\n const rb = rank.get(b.id);\n if (ra === undefined || rb === undefined) return 0;\n return ra - rb;\n });\n}\n","import type { FeatureEntry, FeatureManifest, FeatureVariant } from \"./types\";\n\nconst VARIANT_META_KEY = \"featuredropVariant\";\nconst VARIANT_KEY_STORAGE = \"featuredrop:variant-key\";\n\nfunction readStorageValue(key: string): string | null {\n const storage = globalThis.localStorage as unknown as {\n getItem?: (storageKey: string) => string | null;\n };\n if (!storage || typeof storage.getItem !== \"function\") return null;\n try {\n return storage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeStorageValue(key: string, value: string): void {\n const storage = globalThis.localStorage as unknown as {\n setItem?: (storageKey: string, storageValue: string) => void;\n };\n if (!storage || typeof storage.setItem !== \"function\") return;\n try {\n storage.setItem(key, value);\n } catch {\n // noop\n }\n}\n\nfunction hashToPercent(value: string): number {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) % 100;\n}\n\nfunction normalizeSplit(count: number, split?: number[]): number[] {\n if (!split || split.length !== count) {\n return Array.from({ length: count }, () => 100 / count);\n }\n const cleaned = split.map((value) => (Number.isFinite(value) && value > 0 ? value : 0));\n const total = cleaned.reduce((sum, value) => sum + value, 0);\n if (total <= 0) {\n return Array.from({ length: count }, () => 100 / count);\n }\n return cleaned.map((value) => (value / total) * 100);\n}\n\nfunction pickVariantName(feature: FeatureEntry, variantKey: string): string | null {\n const variants = feature.variants;\n if (!variants) return null;\n const names = Object.keys(variants);\n if (names.length === 0) return null;\n if (names.length === 1) return names[0];\n\n const split = normalizeSplit(names.length, feature.variantSplit);\n const bucket = hashToPercent(`${feature.id}:${variantKey}`);\n let cumulative = 0;\n for (let i = 0; i < names.length; i += 1) {\n cumulative += split[i];\n if (bucket < cumulative) return names[i];\n }\n return names[names.length - 1];\n}\n\nexport function getFeatureVariantName(feature: FeatureEntry): string | undefined {\n const raw = feature.meta?.[VARIANT_META_KEY];\n return typeof raw === \"string\" ? raw : undefined;\n}\n\nexport function applyFeatureVariant(\n feature: FeatureEntry,\n variantKey: string,\n): FeatureEntry {\n const variantName = pickVariantName(feature, variantKey);\n if (!variantName) return feature;\n const variant: FeatureVariant | undefined = feature.variants?.[variantName];\n if (!variant) return feature;\n\n return {\n ...feature,\n label: variant.label ?? feature.label,\n description: variant.description ?? feature.description,\n image: variant.image ?? feature.image,\n cta: variant.cta ?? feature.cta,\n meta: {\n ...(feature.meta ?? {}),\n ...(variant.meta ?? {}),\n [VARIANT_META_KEY]: variantName,\n },\n };\n}\n\nexport function applyFeatureVariants(\n manifest: FeatureManifest,\n variantKey: string,\n): FeatureEntry[] {\n return manifest.map((feature) => applyFeatureVariant(feature, variantKey));\n}\n\nfunction createRandomKey(): string {\n return Math.random().toString(36).slice(2, 12);\n}\n\nexport function getOrCreateVariantKey(explicitKey?: string): string {\n if (explicitKey) return explicitKey;\n const existing = readStorageValue(VARIANT_KEY_STORAGE);\n if (existing) return existing;\n const next = createRandomKey();\n writeStorageValue(VARIANT_KEY_STORAGE, next);\n return next;\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry } from \"./types\";\n\nexport interface ManifestStats {\n total: number;\n byType: Record<string, number>;\n byCategory: Record<string, number>;\n newestRelease: string | null;\n oldestRelease: string | null;\n}\n\nexport function computeManifestStats(entries: FeatureEntry[]): ManifestStats {\n const byType: Record<string, number> = {};\n const byCategory: Record<string, number> = {};\n\n for (const entry of entries) {\n const type = entry.type ?? \"feature\";\n byType[type] = (byType[type] ?? 0) + 1;\n if (entry.category) {\n byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;\n }\n }\n\n const sortedByDate = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n\n return {\n total: entries.length,\n byType,\n byCategory,\n newestRelease: sortedByDate[0]?.releasedAt ?? null,\n oldestRelease: sortedByDate[sortedByDate.length - 1]?.releasedAt ?? null,\n };\n}\n\nexport function generateMarkdownChangelog(entries: FeatureEntry[]): string {\n const sorted = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n const sections = sorted.map((entry) => {\n const lines = [\n `## ${entry.label}`,\n \"\",\n `- **ID**: \\`${entry.id}\\``,\n `- **Released**: ${entry.releasedAt}`,\n ];\n if (entry.type) lines.push(`- **Type**: ${entry.type}`);\n if (entry.category) lines.push(`- **Category**: ${entry.category}`);\n if (entry.showNewUntil) lines.push(`- **Show new until**: ${entry.showNewUntil}`);\n if (entry.cta) lines.push(`- **CTA**: [${entry.cta.label}](${entry.cta.url})`);\n if (entry.description) {\n lines.push(\"\", entry.description.trim());\n }\n return lines.join(\"\\n\");\n });\n\n return `# Generated Changelog\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction isIsoWithTimezone(value: string): boolean {\n if (!value.includes(\"T\")) return false;\n if (!(value.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(value))) return false;\n return Number.isFinite(new Date(value).getTime());\n}\n\nexport interface DoctorReport {\n checks: string[];\n warnings: string[];\n errors: string[];\n}\n\nexport function runDoctor(entries: FeatureEntry[], now: Date = new Date()): DoctorReport {\n const checks: string[] = [];\n const warnings: string[] = [];\n const errors: string[] = [];\n\n checks.push(`Manifest entries loaded: ${entries.length}`);\n\n const ids = new Set<string>();\n let duplicateCount = 0;\n for (const entry of entries) {\n if (ids.has(entry.id)) duplicateCount += 1;\n ids.add(entry.id);\n }\n if (duplicateCount > 0) {\n errors.push(`${duplicateCount} duplicate feature id(s) found`);\n } else {\n checks.push(\"No duplicate IDs\");\n }\n\n let invalidDateCount = 0;\n let reversedDateCount = 0;\n let expiredCount = 0;\n let scheduledCount = 0;\n let missingDescriptionCount = 0;\n\n for (const entry of entries) {\n if (!entry.description?.trim()) missingDescriptionCount += 1;\n if (!isIsoWithTimezone(entry.releasedAt) || !isIsoWithTimezone(entry.showNewUntil)) {\n invalidDateCount += 1;\n continue;\n }\n const released = new Date(entry.releasedAt).getTime();\n const showUntil = new Date(entry.showNewUntil).getTime();\n if (showUntil <= released) reversedDateCount += 1;\n if (showUntil < now.getTime()) expiredCount += 1;\n if (entry.publishAt) {\n const publishMs = new Date(entry.publishAt).getTime();\n if (Number.isFinite(publishMs) && publishMs > now.getTime()) scheduledCount += 1;\n }\n }\n\n if (invalidDateCount > 0) {\n errors.push(`${invalidDateCount} entries have invalid ISO 8601 dates with timezone`);\n } else {\n checks.push(\"All dates are valid ISO 8601 with timezone\");\n }\n\n if (reversedDateCount > 0) {\n errors.push(`${reversedDateCount} entries have showNewUntil before/at releasedAt`);\n }\n\n if (expiredCount > 0) warnings.push(`${expiredCount} entries have showNewUntil in the past`);\n if (scheduledCount > 0) warnings.push(`${scheduledCount} entries have publishAt in the future`);\n\n if (missingDescriptionCount > 0) {\n errors.push(`${missingDescriptionCount} entries have no description`);\n } else {\n checks.push(\"All entries have descriptions\");\n }\n\n if (hasDependencyCycle(entries)) {\n errors.push(\"Circular dependsOn relationship detected\");\n } else {\n checks.push(\"No circular dependencies in dependsOn chains\");\n }\n\n return { checks, warnings, errors };\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry, FeatureManifest } from \"./types\";\nimport { z } from \"zod\";\n\nexport interface ValidationIssue {\n path: string;\n message: string;\n code:\n | \"invalid_type\"\n | \"missing_required\"\n | \"invalid_value\"\n | \"invalid_date\"\n | \"duplicate_id\"\n | \"circular_dependency\";\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationIssue[];\n}\n\nexport const featureEntryJsonSchema = {\n type: \"object\",\n required: [\"id\", \"label\", \"releasedAt\", \"showNewUntil\"],\n properties: {\n id: { type: \"string\" },\n label: { type: \"string\" },\n description: { type: \"string\" },\n releasedAt: { type: \"string\", format: \"date-time\" },\n showNewUntil: { type: \"string\", format: \"date-time\" },\n type: { enum: [\"feature\", \"improvement\", \"fix\", \"breaking\"] },\n priority: { enum: [\"critical\", \"normal\", \"low\"] },\n },\n} as const;\n\nexport const featureManifestJsonSchema = {\n type: \"array\",\n items: featureEntryJsonSchema,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidDate(value: string): boolean {\n return Number.isFinite(new Date(value).getTime());\n}\n\nconst nonEmptyString = z.string().trim().min(1, \"must be a non-empty string\");\n\nconst isoDateString = nonEmptyString.refine(isValidDate, {\n message: \"must be a valid date\",\n params: { featuredropCode: \"invalid_date\" },\n});\n\nconst dependsOnSchema = z\n .object({\n seen: z.array(z.string()).optional(),\n clicked: z.array(z.string()).optional(),\n dismissed: z.array(z.string()).optional(),\n })\n .optional();\n\nexport const featureEntrySchema = z\n .object({\n id: nonEmptyString,\n label: nonEmptyString,\n releasedAt: isoDateString,\n showNewUntil: isoDateString,\n description: z.string().optional(),\n type: z.enum([\"feature\", \"improvement\", \"fix\", \"breaking\"]).optional(),\n priority: z.enum([\"critical\", \"normal\", \"low\"]).optional(),\n dependsOn: dependsOnSchema,\n })\n .passthrough();\n\nexport const featureManifestSchema = z.array(featureEntrySchema);\n\nfunction toIssuePath(path: Array<string | number>): string {\n if (path.length === 0) return \"$\";\n let output = \"\";\n for (const part of path) {\n if (typeof part === \"number\") output += `[${part}]`;\n else output += output ? `.${part}` : part;\n }\n return output;\n}\n\nfunction mapZodIssue(issue: z.ZodIssue): ValidationIssue {\n const codeParam = (issue as { params?: Record<string, unknown> }).params?.featuredropCode;\n if (codeParam === \"invalid_date\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_date\",\n };\n }\n if (issue.code === \"invalid_type\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: issue.received === \"undefined\" ? \"missing_required\" : \"invalid_type\",\n };\n }\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_value\",\n };\n}\n\nfunction validateFeatureEntry(raw: unknown, index: number): { entry?: FeatureEntry; issues: ValidationIssue[] } {\n if (!isRecord(raw)) {\n return {\n issues: [\n {\n path: `[${index}]`,\n message: \"Feature entry must be an object\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const parsed = featureEntrySchema.safeParse(raw);\n if (!parsed.success) {\n return {\n issues: parsed.error.issues.map((issue) => ({\n ...mapZodIssue(issue),\n path: `[${index}]${issue.path.length > 0 ? `.${toIssuePath(issue.path)}` : \"\"}`,\n })),\n };\n }\n\n return {\n issues: [],\n entry: parsed.data as FeatureEntry,\n };\n}\n\nexport function validateManifest(data: unknown): ValidationResult {\n const errors: ValidationIssue[] = [];\n if (!Array.isArray(data)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Manifest must be an array\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n data.forEach((item, index) => {\n const result = validateFeatureEntry(item, index);\n errors.push(...result.issues);\n if (!result.entry) return;\n if (seenIds.has(result.entry.id)) {\n errors.push({\n path: `[${index}].id`,\n message: `Duplicate feature id \"${result.entry.id}\"`,\n code: \"duplicate_id\",\n });\n return;\n }\n seenIds.add(result.entry.id);\n entries.push(result.entry);\n });\n\n if (entries.length > 0 && hasDependencyCycle(entries as FeatureManifest)) {\n errors.push({\n path: \"$\",\n message: \"Circular dependsOn relationship detected\",\n code: \"circular_dependency\",\n });\n }\n\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index];\n if (new Date(entry.showNewUntil).getTime() <= new Date(entry.releasedAt).getTime()) {\n errors.push({\n path: `[${index}].showNewUntil`,\n message: \"showNewUntil must be after releasedAt\",\n code: \"invalid_value\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { StorageAdapter } from \"../types\";\n\nexport interface LocalStorageAdapterOptions {\n /** Key prefix for localStorage entries. Default: \"featuredrop\" */\n prefix?: string;\n /** Server-side watermark (ISO string). Typically from user profile. */\n watermark?: string | null;\n /** Callback when dismissAll is called. Use for server-side watermark updates. */\n onDismissAll?: (now: Date) => Promise<void>;\n}\n\nconst DISMISSED_SUFFIX = \":dismissed\";\n\n/**\n * localStorage-based storage adapter.\n *\n * Architecture:\n * - **Watermark** comes from the server (passed at construction time)\n * - **Per-feature dismissals** are stored in localStorage (zero server writes)\n * - **dismissAll()** optionally calls a server callback, then clears localStorage\n *\n * Gracefully handles SSR environments where `window`/`localStorage` is unavailable.\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private readonly prefix: string;\n private readonly watermarkValue: string | null;\n private readonly onDismissAllCallback?: (now: Date) => Promise<void>;\n private readonly dismissedKey: string;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.prefix = options.prefix ?? \"featuredrop\";\n this.watermarkValue = options.watermark ?? null;\n this.onDismissAllCallback = options.onDismissAll;\n this.dismissedKey = `${this.prefix}${DISMISSED_SUFFIX}`;\n }\n\n getWatermark(): string | null {\n return this.watermarkValue;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n try {\n if (typeof window === \"undefined\") return new Set();\n const raw = localStorage.getItem(this.dismissedKey);\n if (!raw) return new Set();\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) return new Set(parsed as string[]);\n return new Set();\n } catch {\n return new Set();\n }\n }\n\n dismiss(id: string): void {\n try {\n if (typeof window === \"undefined\") return;\n const raw = localStorage.getItem(this.dismissedKey);\n const existing: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!existing.includes(id)) {\n existing.push(id);\n localStorage.setItem(this.dismissedKey, JSON.stringify(existing));\n }\n } catch {\n // localStorage unavailable — silent fail\n }\n }\n\n async dismissAll(now: Date): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(this.dismissedKey);\n }\n } catch {\n // localStorage unavailable — silent fail\n }\n\n if (this.onDismissAllCallback) {\n await this.onDismissAllCallback(now);\n }\n }\n}\n","import type { StorageAdapter } from \"../types\";\n\n/**\n * In-memory storage adapter.\n *\n * Useful for:\n * - Testing (no side effects)\n * - Server-side rendering (no `window`/`localStorage`)\n * - Environments without persistent storage\n */\nexport class MemoryAdapter implements StorageAdapter {\n private watermark: string | null;\n private dismissed: Set<string>;\n\n constructor(options: { watermark?: string | null } = {}) {\n this.watermark = options.watermark ?? null;\n this.dismissed = new Set();\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissed;\n }\n\n dismiss(id: string): void {\n this.dismissed.add(id);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissed.clear();\n }\n}\n","import type { FeatureManifest, StorageAdapter } from \"../types\";\n\nexport interface RemoteAdapterOptions {\n /** Base URL for the feature API (e.g. https://api.example.com/api/features) */\n url: string;\n /** Optional headers applied to all requests */\n headers?: Record<string, string>;\n /** Polling interval in ms for stale-while-revalidate (default: 5 minutes) */\n fetchInterval?: number;\n /** Data format, currently supports 'rest' (default) */\n format?: \"rest\";\n /** Optional user identifier to pass to state endpoint */\n userId?: string;\n}\n\ninterface RemoteStateResponse {\n watermark?: string | null;\n dismissedIds?: string[];\n}\n\nfunction assertFetch(): typeof fetch {\n if (typeof fetch === \"undefined\") {\n throw new Error(\"RemoteAdapter requires global fetch (Node 18+ or polyfill)\");\n }\n return fetch;\n}\n\nexport class RemoteAdapter implements StorageAdapter {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly fetchInterval: number;\n private readonly userId?: string;\n private dismissedIds: Set<string> = new Set();\n private watermark: string | null = null;\n private lastManifest: FeatureManifest | null = null;\n private lastFetchTs = 0;\n\n constructor(options: RemoteAdapterOptions) {\n this.baseUrl = options.url.replace(/\\/$/, \"\");\n this.headers = options.headers ?? {};\n this.fetchInterval = options.fetchInterval ?? 5 * 60 * 1000;\n this.userId = options.userId;\n }\n\n /** Fetch manifest with stale-while-revalidate */\n async fetchManifest(force = false): Promise<FeatureManifest> {\n const now = Date.now();\n if (!force && this.lastManifest && now - this.lastFetchTs < this.fetchInterval) {\n return this.lastManifest;\n }\n\n const fetchImpl = assertFetch();\n const res = await fetchImpl(this.baseUrl, {\n method: \"GET\",\n headers: this.headers,\n });\n if (!res.ok) throw new Error(`RemoteAdapter manifest fetch failed: ${res.status}`);\n const json = (await res.json()) as FeatureManifest;\n this.lastManifest = json;\n this.lastFetchTs = now;\n return json;\n }\n\n /** Fetch state (watermark + dismissed IDs) */\n async syncState(): Promise<void> {\n const fetchImpl = assertFetch();\n const url = this.userId ? `${this.baseUrl}/state?userId=${encodeURIComponent(this.userId)}` : `${this.baseUrl}/state`;\n const res = await fetchImpl(url, {\n method: \"GET\",\n headers: this.headers,\n });\n if (!res.ok) return;\n const json = (await res.json()) as RemoteStateResponse;\n if (json.watermark !== undefined) this.watermark = json.watermark;\n if (Array.isArray(json.dismissedIds)) this.dismissedIds = new Set(json.dismissedIds);\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n this.flushDismiss(id).catch(() => {\n /* silent fail */\n });\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.flushDismissAll(now).catch(() => {});\n }\n\n private async flushDismiss(id: string): Promise<void> {\n const fetchImpl = assertFetch();\n await fetchImpl(`${this.baseUrl}/dismiss`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...this.headers },\n body: JSON.stringify({ featureId: id }),\n });\n }\n\n private async flushDismissAll(now: Date): Promise<void> {\n const fetchImpl = assertFetch();\n await fetchImpl(`${this.baseUrl}/dismiss-all`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...this.headers },\n body: JSON.stringify({ watermark: now.toISOString() }),\n });\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\ninterface QueryResultRow {\n watermark?: string | null;\n dismissed_ids?: string[] | null;\n dismissedIds?: string[] | null;\n last_seen?: string | null;\n lastSeen?: string | null;\n}\n\nexport interface PostgresQueryResult<T = QueryResultRow> {\n rows: T[];\n rowCount?: number | null;\n}\n\nexport type PostgresQueryFn = <T = QueryResultRow>(\n sql: string,\n params?: unknown[],\n) => Promise<PostgresQueryResult<T>>;\n\nexport interface PostgresAdapterOptions {\n userId: string;\n query: PostgresQueryFn;\n tableName?: string;\n autoMigrate?: boolean;\n}\n\nfunction normalizeDismissedIds(row: QueryResultRow | undefined): string[] {\n if (!row) return [];\n const ids = row.dismissed_ids ?? row.dismissedIds;\n if (!Array.isArray(ids)) return [];\n return ids.filter((id): id is string => typeof id === \"string\");\n}\n\nfunction normalizeWatermark(row: QueryResultRow | undefined): string | null {\n if (!row) return null;\n return row.watermark ?? null;\n}\n\nfunction normalizeLastSeen(row: QueryResultRow | undefined): string {\n if (!row) return new Date(0).toISOString();\n return row.last_seen ?? row.lastSeen ?? new Date(0).toISOString();\n}\n\n/**\n * Postgres-backed storage adapter.\n *\n * This adapter is dependency-free by design and accepts a user-provided\n * query function, allowing integration with pg, drizzle, prisma, etc.\n */\nexport class PostgresAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly query: PostgresQueryFn;\n private readonly tableName: string;\n private readonly autoMigrate: boolean;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n private initialized = false;\n\n constructor(options: PostgresAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"PostgresAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.query = options.query;\n this.tableName = options.tableName ?? \"featuredrop_state\";\n this.autoMigrate = options.autoMigrate ?? true;\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.dismissBatch([id]);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.ensureReady();\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES ($1, $2, '{}', NOW(), NOW(), NOW())\n ON CONFLICT (user_id)\n DO UPDATE SET watermark = EXCLUDED.watermark, dismissed_ids = '{}', last_seen = NOW(), updated_at = NOW()`,\n [this.userId, this.watermark],\n );\n }\n\n async sync(): Promise<void> {\n await this.ensureReady();\n const result = await this.query<QueryResultRow>(\n `SELECT watermark, dismissed_ids, last_seen\n FROM ${this.tableName}\n WHERE user_id = $1`,\n [this.userId],\n );\n const row = result.rows[0];\n this.watermark = normalizeWatermark(row);\n this.dismissedIds = new Set(normalizeDismissedIds(row));\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n await this.ensureReady();\n const uniqueIds = Array.from(new Set(ids));\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES ($1, NULL, $2::text[], NOW(), NOW(), NOW())\n ON CONFLICT (user_id)\n DO UPDATE SET\n dismissed_ids = (\n SELECT ARRAY(\n SELECT DISTINCT x FROM UNNEST(\n COALESCE(${this.tableName}.dismissed_ids, '{}') || EXCLUDED.dismissed_ids\n ) AS x\n )\n ),\n last_seen = NOW(),\n updated_at = NOW()`,\n [this.userId, uniqueIds],\n );\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.ensureReady();\n await this.query(\n `DELETE FROM ${this.tableName} WHERE user_id = $1`,\n [userId],\n );\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n await this.ensureReady();\n if (userIds.length === 0) return new Map();\n\n const result = await this.query<QueryResultRow & { user_id: string }>(\n `SELECT user_id, watermark, dismissed_ids, last_seen\n FROM ${this.tableName}\n WHERE user_id = ANY($1::text[])`,\n [userIds],\n );\n\n const out = new Map<string, DismissalState>();\n for (const row of result.rows) {\n out.set(row.user_id, {\n watermark: normalizeWatermark(row),\n dismissedIds: normalizeDismissedIds(row),\n lastSeen: normalizeLastSeen(row),\n deviceCount: 1,\n });\n }\n return out;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n await this.query(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n // No-op by default. Caller owns the pool/connection lifecycle.\n }\n\n private async ensureReady(): Promise<void> {\n if (this.initialized) return;\n if (this.autoMigrate) {\n await this.query(\n `CREATE TABLE IF NOT EXISTS ${this.tableName} (\n user_id TEXT PRIMARY KEY,\n watermark TIMESTAMPTZ,\n dismissed_ids TEXT[] DEFAULT '{}',\n last_seen TIMESTAMPTZ DEFAULT NOW(),\n created_at TIMESTAMPTZ DEFAULT NOW(),\n updated_at TIMESTAMPTZ DEFAULT NOW()\n )`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_${this.tableName}_last_seen ON ${this.tableName}(last_seen)`,\n );\n }\n this.initialized = true;\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\nexport interface RedisLikePipeline {\n set(key: string, value: string): RedisLikePipeline;\n del(key: string): RedisLikePipeline;\n sadd(key: string, ...members: string[]): RedisLikePipeline;\n exec(): Promise<unknown>;\n}\n\nexport interface RedisLikeClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<unknown>;\n del(key: string): Promise<unknown>;\n smembers(key: string): Promise<string[]>;\n sadd(key: string, ...members: string[]): Promise<unknown>;\n ping(): Promise<string>;\n multi(): RedisLikePipeline;\n quit?(): Promise<unknown>;\n disconnect?(): void;\n}\n\nexport interface RedisAdapterOptions {\n userId: string;\n client: RedisLikeClient;\n keyPrefix?: string;\n}\n\n/**\n * Redis-backed storage adapter.\n * Uses simple key + set structures to keep operations predictable.\n */\nexport class RedisAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly client: RedisLikeClient;\n private readonly keyPrefix: string;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n\n constructor(options: RedisAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"RedisAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.client = options.client;\n this.keyPrefix = options.keyPrefix ?? \"fd:\";\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.client.sadd(this.dismissedKey(this.userId), id);\n void this.client.set(this.lastSeenKey(this.userId), new Date().toISOString());\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.client\n .multi()\n .set(this.watermarkKey(this.userId), this.watermark)\n .del(this.dismissedKey(this.userId))\n .set(this.lastSeenKey(this.userId), now.toISOString())\n .exec();\n }\n\n async sync(): Promise<void> {\n const [watermark, dismissedIds] = await Promise.all([\n this.client.get(this.watermarkKey(this.userId)),\n this.client.smembers(this.dismissedKey(this.userId)),\n ]);\n this.watermark = watermark;\n this.dismissedIds = new Set(dismissedIds);\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n const uniqueIds = Array.from(new Set(ids));\n if (uniqueIds.length === 0) return;\n this.dismissedIds = new Set([...this.dismissedIds, ...uniqueIds]);\n await this.client.sadd(this.dismissedKey(this.userId), ...uniqueIds);\n await this.client.set(this.lastSeenKey(this.userId), new Date().toISOString());\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.client\n .multi()\n .del(this.watermarkKey(userId))\n .del(this.dismissedKey(userId))\n .del(this.lastSeenKey(userId))\n .exec();\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n const map = new Map<string, DismissalState>();\n await Promise.all(\n userIds.map(async (userId) => {\n const [watermark, dismissedIds, lastSeen] = await Promise.all([\n this.client.get(this.watermarkKey(userId)),\n this.client.smembers(this.dismissedKey(userId)),\n this.client.get(this.lastSeenKey(userId)),\n ]);\n map.set(userId, {\n watermark,\n dismissedIds,\n lastSeen: lastSeen ?? new Date(0).toISOString(),\n deviceCount: 1,\n });\n }),\n );\n return map;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n const response = await this.client.ping();\n return response.toUpperCase() === \"PONG\";\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n if (this.client.quit) {\n await this.client.quit();\n return;\n }\n this.client.disconnect?.();\n }\n\n private watermarkKey(userId: string): string {\n return `${this.keyPrefix}${userId}:watermark`;\n }\n\n private dismissedKey(userId: string): string {\n return `${this.keyPrefix}${userId}:dismissed`;\n }\n\n private lastSeenKey(userId: string): string {\n return `${this.keyPrefix}${userId}:last_seen`;\n }\n}\n","import type { DismissalState, ServerStorageAdapter, StorageAdapter } from \"../types\";\n\nexport interface HybridAdapterOptions {\n local: StorageAdapter;\n remote: ServerStorageAdapter;\n /** If true, sync from remote before writes. Default false */\n syncBeforeWrite?: boolean;\n}\n\n/**\n * Hybrid adapter that combines local immediacy with remote persistence.\n */\nexport class HybridAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly local: StorageAdapter;\n private readonly remote: ServerStorageAdapter;\n private readonly syncBeforeWrite: boolean;\n\n constructor(options: HybridAdapterOptions) {\n this.local = options.local;\n this.remote = options.remote;\n this.userId = options.remote.userId;\n this.syncBeforeWrite = options.syncBeforeWrite ?? false;\n }\n\n getWatermark(): string | null {\n return this.local.getWatermark() ?? this.remote.getWatermark();\n }\n\n getDismissedIds(): ReadonlySet<string> {\n const merged = new Set<string>();\n for (const id of this.local.getDismissedIds()) merged.add(id);\n for (const id of this.remote.getDismissedIds()) merged.add(id);\n return merged;\n }\n\n dismiss(id: string): void {\n this.local.dismiss(id);\n this.remote.dismiss(id);\n }\n\n async dismissAll(now: Date): Promise<void> {\n await Promise.all([\n this.local.dismissAll(now),\n this.remote.dismissAll(now),\n ]);\n }\n\n async sync(): Promise<void> {\n await this.remote.sync();\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n if (this.syncBeforeWrite) {\n await this.remote.sync();\n }\n for (const id of ids) {\n this.local.dismiss(id);\n }\n await this.remote.dismissBatch(ids);\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.remote.resetUser(userId);\n if (userId === this.userId) {\n await this.local.dismissAll(new Date(0));\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n return this.remote.getBulkState(userIds);\n }\n\n async isHealthy(): Promise<boolean> {\n return this.remote.isHealthy();\n }\n\n async destroy(): Promise<void> {\n await this.remote.destroy();\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\ninterface MySQLRow {\n user_id?: string;\n watermark?: string | null;\n dismissed_ids?: string[] | string | null;\n dismissedIds?: string[] | string | null;\n last_seen?: string | null;\n lastSeen?: string | null;\n}\n\nexport interface MySQLQueryResult<T = MySQLRow> {\n rows: T[];\n}\n\nexport type MySQLQueryFn = <T = MySQLRow>(\n sql: string,\n params?: unknown[],\n) => Promise<MySQLQueryResult<T>>;\n\nexport interface MySQLAdapterOptions {\n userId: string;\n query: MySQLQueryFn;\n tableName?: string;\n autoMigrate?: boolean;\n}\n\nfunction parseDismissedIds(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\" && value.trim()) {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === \"string\");\n }\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction normalizeDismissedIds(row: MySQLRow | undefined): string[] {\n if (!row) return [];\n return parseDismissedIds(row.dismissed_ids ?? row.dismissedIds);\n}\n\nfunction normalizeWatermark(row: MySQLRow | undefined): string | null {\n if (!row) return null;\n return row.watermark ?? null;\n}\n\nfunction normalizeLastSeen(row: MySQLRow | undefined): string {\n if (!row) return new Date(0).toISOString();\n return row.last_seen ?? row.lastSeen ?? new Date(0).toISOString();\n}\n\nexport class MySQLAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly query: MySQLQueryFn;\n private readonly tableName: string;\n private readonly autoMigrate: boolean;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n private initialized = false;\n\n constructor(options: MySQLAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"MySQLAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.query = options.query;\n this.tableName = options.tableName ?? \"featuredrop_state\";\n this.autoMigrate = options.autoMigrate ?? true;\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.dismissBatch([id]);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.ensureReady();\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES (?, ?, ?, NOW(3), NOW(3), NOW(3))\n ON DUPLICATE KEY UPDATE watermark = VALUES(watermark), dismissed_ids = VALUES(dismissed_ids), last_seen = NOW(3), updated_at = NOW(3)`,\n [this.userId, this.watermark, JSON.stringify([])],\n );\n }\n\n async sync(): Promise<void> {\n await this.ensureReady();\n const result = await this.query<MySQLRow>(\n `SELECT watermark, dismissed_ids, last_seen FROM ${this.tableName} WHERE user_id = ? LIMIT 1`,\n [this.userId],\n );\n const row = result.rows[0];\n this.watermark = normalizeWatermark(row);\n this.dismissedIds = new Set(normalizeDismissedIds(row));\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n const uniqueIds = Array.from(new Set(ids));\n if (uniqueIds.length === 0) return;\n await this.ensureReady();\n\n const merged = new Set<string>([\n ...Array.from(this.dismissedIds),\n ...uniqueIds,\n ]);\n const mergedArray = Array.from(merged);\n this.dismissedIds = merged;\n\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES (?, ?, ?, NOW(3), NOW(3), NOW(3))\n ON DUPLICATE KEY UPDATE dismissed_ids = VALUES(dismissed_ids), last_seen = NOW(3), updated_at = NOW(3)`,\n [this.userId, this.watermark, JSON.stringify(mergedArray)],\n );\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.ensureReady();\n await this.query(`DELETE FROM ${this.tableName} WHERE user_id = ?`, [userId]);\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n await this.ensureReady();\n if (userIds.length === 0) return new Map();\n const placeholders = userIds.map(() => \"?\").join(\", \");\n const result = await this.query<MySQLRow & { user_id: string }>(\n `SELECT user_id, watermark, dismissed_ids, last_seen\n FROM ${this.tableName}\n WHERE user_id IN (${placeholders})`,\n userIds,\n );\n const out = new Map<string, DismissalState>();\n for (const row of result.rows) {\n out.set(row.user_id, {\n watermark: normalizeWatermark(row),\n dismissedIds: normalizeDismissedIds(row),\n lastSeen: normalizeLastSeen(row),\n deviceCount: 1,\n });\n }\n return out;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n await this.query(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n // No-op by default. Caller owns the client/pool lifecycle.\n }\n\n private async ensureReady(): Promise<void> {\n if (this.initialized) return;\n if (this.autoMigrate) {\n await this.query(\n `CREATE TABLE IF NOT EXISTS ${this.tableName} (\n user_id VARCHAR(255) PRIMARY KEY,\n watermark DATETIME(3) NULL,\n dismissed_ids JSON NOT NULL,\n last_seen DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),\n created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),\n updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)\n )`,\n );\n await this.query(\n `CREATE INDEX idx_${this.tableName}_last_seen ON ${this.tableName}(last_seen)`,\n );\n }\n this.initialized = true;\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\ninterface MongoStateDoc {\n userId: string;\n watermark?: string | null;\n dismissedIds?: string[];\n lastSeen?: string;\n}\n\ninterface MongoFindCursor<T> {\n toArray: () => Promise<T[]>;\n}\n\nexport interface MongoLikeCollection {\n findOne: (filter: Record<string, unknown>) => Promise<MongoStateDoc | null>;\n updateOne: (\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n options?: Record<string, unknown>,\n ) => Promise<unknown>;\n deleteOne: (filter: Record<string, unknown>) => Promise<unknown>;\n find?: (filter: Record<string, unknown>) => MongoFindCursor<MongoStateDoc>;\n}\n\nexport interface MongoAdapterOptions {\n userId: string;\n collection: MongoLikeCollection;\n}\n\nfunction normalizeDismissedIds(ids: unknown): string[] {\n if (!Array.isArray(ids)) return [];\n return ids.filter((id): id is string => typeof id === \"string\");\n}\n\nfunction normalizeLastSeen(value: unknown): string {\n return typeof value === \"string\" && value ? value : new Date(0).toISOString();\n}\n\nexport class MongoAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly collection: MongoLikeCollection;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n\n constructor(options: MongoAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"MongoAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.collection = options.collection;\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.collection.updateOne(\n { userId: this.userId },\n {\n $addToSet: { dismissedIds: id },\n $set: { lastSeen: new Date().toISOString() },\n },\n { upsert: true },\n );\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.collection.updateOne(\n { userId: this.userId },\n {\n $set: {\n userId: this.userId,\n watermark: this.watermark,\n dismissedIds: [],\n lastSeen: this.watermark,\n },\n },\n { upsert: true },\n );\n }\n\n async sync(): Promise<void> {\n const doc = await this.collection.findOne({ userId: this.userId });\n this.watermark = doc?.watermark ?? null;\n this.dismissedIds = new Set(normalizeDismissedIds(doc?.dismissedIds));\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n const unique = Array.from(new Set(ids));\n if (unique.length === 0) return;\n this.dismissedIds = new Set([...this.dismissedIds, ...unique]);\n await this.collection.updateOne(\n { userId: this.userId },\n {\n $addToSet: { dismissedIds: { $each: unique } },\n $set: { lastSeen: new Date().toISOString() },\n },\n { upsert: true },\n );\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.collection.deleteOne({ userId });\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n const out = new Map<string, DismissalState>();\n if (userIds.length === 0) return out;\n\n if (this.collection.find) {\n const rows = await this.collection.find({ userId: { $in: userIds } }).toArray();\n for (const row of rows) {\n out.set(row.userId, {\n watermark: row.watermark ?? null,\n dismissedIds: normalizeDismissedIds(row.dismissedIds),\n lastSeen: normalizeLastSeen(row.lastSeen),\n deviceCount: 1,\n });\n }\n return out;\n }\n\n await Promise.all(\n userIds.map(async (userId) => {\n const row = await this.collection.findOne({ userId });\n if (!row) return;\n out.set(userId, {\n watermark: row.watermark ?? null,\n dismissedIds: normalizeDismissedIds(row.dismissedIds),\n lastSeen: normalizeLastSeen(row.lastSeen),\n deviceCount: 1,\n });\n }),\n );\n return out;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n await this.collection.findOne({});\n return true;\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n // No-op by default. Caller owns the Mongo client lifecycle.\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\ninterface SQLiteRow {\n user_id?: string;\n watermark?: string | null;\n dismissed_ids?: string[] | string | null;\n dismissedIds?: string[] | string | null;\n last_seen?: string | null;\n lastSeen?: string | null;\n}\n\nexport interface SQLiteQueryResult<T = SQLiteRow> {\n rows: T[];\n}\n\nexport type SQLiteQueryFn = <T = SQLiteRow>(\n sql: string,\n params?: unknown[],\n) => Promise<SQLiteQueryResult<T>>;\n\nexport interface SQLiteAdapterOptions {\n userId: string;\n query: SQLiteQueryFn;\n tableName?: string;\n autoMigrate?: boolean;\n}\n\nfunction parseDismissedIds(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\" && value.trim()) {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === \"string\");\n }\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction normalizeDismissedIds(row: SQLiteRow | undefined): string[] {\n if (!row) return [];\n return parseDismissedIds(row.dismissed_ids ?? row.dismissedIds);\n}\n\nfunction normalizeWatermark(row: SQLiteRow | undefined): string | null {\n if (!row) return null;\n return row.watermark ?? null;\n}\n\nfunction normalizeLastSeen(row: SQLiteRow | undefined): string {\n if (!row) return new Date(0).toISOString();\n return row.last_seen ?? row.lastSeen ?? new Date(0).toISOString();\n}\n\nexport class SQLiteAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly query: SQLiteQueryFn;\n private readonly tableName: string;\n private readonly autoMigrate: boolean;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n private initialized = false;\n\n constructor(options: SQLiteAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"SQLiteAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.query = options.query;\n this.tableName = options.tableName ?? \"featuredrop_state\";\n this.autoMigrate = options.autoMigrate ?? true;\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.dismissBatch([id]);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.ensureReady();\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id)\n DO UPDATE SET watermark = excluded.watermark, dismissed_ids = excluded.dismissed_ids, last_seen = excluded.last_seen, updated_at = excluded.updated_at`,\n [this.userId, this.watermark, JSON.stringify([]), this.watermark, this.watermark, this.watermark],\n );\n }\n\n async sync(): Promise<void> {\n await this.ensureReady();\n const result = await this.query<SQLiteRow>(\n `SELECT watermark, dismissed_ids, last_seen FROM ${this.tableName} WHERE user_id = ? LIMIT 1`,\n [this.userId],\n );\n const row = result.rows[0];\n this.watermark = normalizeWatermark(row);\n this.dismissedIds = new Set(normalizeDismissedIds(row));\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n const uniqueIds = Array.from(new Set(ids));\n if (uniqueIds.length === 0) return;\n await this.ensureReady();\n\n const merged = new Set<string>([\n ...Array.from(this.dismissedIds),\n ...uniqueIds,\n ]);\n const mergedArray = Array.from(merged);\n this.dismissedIds = merged;\n const nowIso = new Date().toISOString();\n\n await this.query(\n `INSERT INTO ${this.tableName} (user_id, watermark, dismissed_ids, last_seen, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id)\n DO UPDATE SET dismissed_ids = excluded.dismissed_ids, last_seen = excluded.last_seen, updated_at = excluded.updated_at`,\n [this.userId, this.watermark, JSON.stringify(mergedArray), nowIso, nowIso, nowIso],\n );\n }\n\n async resetUser(userId: string): Promise<void> {\n await this.ensureReady();\n await this.query(`DELETE FROM ${this.tableName} WHERE user_id = ?`, [userId]);\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n await this.ensureReady();\n if (userIds.length === 0) return new Map();\n const placeholders = userIds.map(() => \"?\").join(\", \");\n const result = await this.query<SQLiteRow & { user_id: string }>(\n `SELECT user_id, watermark, dismissed_ids, last_seen\n FROM ${this.tableName}\n WHERE user_id IN (${placeholders})`,\n userIds,\n );\n const out = new Map<string, DismissalState>();\n for (const row of result.rows) {\n out.set(row.user_id, {\n watermark: normalizeWatermark(row),\n dismissedIds: normalizeDismissedIds(row),\n lastSeen: normalizeLastSeen(row),\n deviceCount: 1,\n });\n }\n return out;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n await this.query(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n // No-op by default. Caller owns db lifecycle.\n }\n\n private async ensureReady(): Promise<void> {\n if (this.initialized) return;\n if (this.autoMigrate) {\n await this.query(\n `CREATE TABLE IF NOT EXISTS ${this.tableName} (\n user_id TEXT PRIMARY KEY,\n watermark TEXT,\n dismissed_ids TEXT NOT NULL,\n last_seen TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_${this.tableName}_last_seen ON ${this.tableName}(last_seen)`,\n );\n }\n this.initialized = true;\n }\n}\n","import type { DismissalState, ServerStorageAdapter } from \"../types\";\n\ninterface SupabaseErrorLike {\n message?: string;\n}\n\ninterface SupabaseMaybeSingleResult<T> {\n data: T | null;\n error: SupabaseErrorLike | null;\n}\n\ninterface SupabaseMutationResult {\n error: SupabaseErrorLike | null;\n}\n\ninterface SupabaseSelectQuery<T> {\n eq: (column: string, value: unknown) => SupabaseSelectQuery<T>;\n maybeSingle: () => Promise<SupabaseMaybeSingleResult<T>>;\n}\n\ninterface SupabaseMutationQuery {\n eq: (column: string, value: unknown) => Promise<SupabaseMutationResult>;\n}\n\ninterface SupabaseTableClient<T> {\n select: (columns: string) => SupabaseSelectQuery<T>;\n upsert: (value: Record<string, unknown>) => Promise<SupabaseMutationResult>;\n update: (value: Record<string, unknown>) => SupabaseMutationQuery;\n delete: () => SupabaseMutationQuery;\n}\n\nexport interface SupabaseRealtimeChannelLike {\n on: (\n event: \"postgres_changes\",\n filter: Record<string, unknown>,\n callback: () => void,\n ) => SupabaseRealtimeChannelLike;\n subscribe: (callback?: (status: string) => void) => SupabaseRealtimeChannelLike;\n}\n\nexport interface SupabaseClientLike {\n from: <T = SupabaseStateRow>(table: string) => SupabaseTableClient<T>;\n channel?: (name: string) => SupabaseRealtimeChannelLike;\n removeChannel?: (channel: SupabaseRealtimeChannelLike) => void | Promise<void>;\n}\n\ninterface SupabaseStateRow {\n [key: string]: unknown;\n user_id: string;\n watermark?: string | null;\n dismissed_ids?: string[] | null;\n last_seen?: string | null;\n}\n\nexport interface SupabaseAdapterOptions {\n userId: string;\n client: SupabaseClientLike;\n tableName?: string;\n realtime?: boolean;\n}\n\nfunction normalizeDismissedIds(row: SupabaseStateRow | null): string[] {\n if (!row || !Array.isArray(row.dismissed_ids)) return [];\n return row.dismissed_ids.filter((id): id is string => typeof id === \"string\");\n}\n\nfunction normalizeWatermark(row: SupabaseStateRow | null): string | null {\n if (!row) return null;\n return row.watermark ?? null;\n}\n\nfunction normalizeLastSeen(row: SupabaseStateRow | null): string {\n if (!row) return new Date(0).toISOString();\n return row.last_seen ?? new Date(0).toISOString();\n}\n\nfunction throwOnError(error: SupabaseErrorLike | null): void {\n if (!error) return;\n throw new Error(`SupabaseAdapter: ${error.message ?? \"unknown error\"}`);\n}\n\nexport class SupabaseAdapter implements ServerStorageAdapter {\n readonly userId: string;\n\n private readonly client: SupabaseClientLike;\n private readonly tableName: string;\n private readonly realtime: boolean;\n private watermark: string | null = null;\n private dismissedIds = new Set<string>();\n private realtimeChannel: SupabaseRealtimeChannelLike | null = null;\n private syncing = false;\n\n constructor(options: SupabaseAdapterOptions) {\n if (!options.userId) {\n throw new Error(\"SupabaseAdapter: userId is required\");\n }\n this.userId = options.userId;\n this.client = options.client;\n this.tableName = options.tableName ?? \"featuredrop_state\";\n this.realtime = options.realtime ?? false;\n\n if (this.realtime && this.client.channel) {\n this.setupRealtime();\n }\n }\n\n getWatermark(): string | null {\n return this.watermark;\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this.dismissedIds;\n }\n\n dismiss(id: string): void {\n this.dismissedIds.add(id);\n void this.dismissBatch([id]);\n }\n\n async dismissAll(now: Date): Promise<void> {\n this.watermark = now.toISOString();\n this.dismissedIds.clear();\n await this.upsertState({\n watermark: this.watermark,\n dismissed_ids: [],\n last_seen: this.watermark,\n });\n }\n\n async sync(): Promise<void> {\n if (this.syncing) return;\n this.syncing = true;\n try {\n const row = await this.fetchState(this.userId);\n this.watermark = normalizeWatermark(row);\n this.dismissedIds = new Set(normalizeDismissedIds(row));\n } finally {\n this.syncing = false;\n }\n }\n\n async dismissBatch(ids: string[]): Promise<void> {\n const uniqueIds = Array.from(new Set(ids));\n if (uniqueIds.length === 0) return;\n\n const merged = new Set<string>([\n ...Array.from(this.dismissedIds),\n ...uniqueIds,\n ]);\n this.dismissedIds = merged;\n\n await this.upsertState({\n watermark: this.watermark,\n dismissed_ids: Array.from(merged),\n last_seen: new Date().toISOString(),\n });\n }\n\n async resetUser(userId: string): Promise<void> {\n const result = await this.client\n .from(this.tableName)\n .delete()\n .eq(\"user_id\", userId);\n throwOnError(result.error);\n if (userId === this.userId) {\n this.watermark = null;\n this.dismissedIds.clear();\n }\n }\n\n async getBulkState(userIds: string[]): Promise<Map<string, DismissalState>> {\n const out = new Map<string, DismissalState>();\n if (userIds.length === 0) return out;\n\n await Promise.all(\n userIds.map(async (userId) => {\n const row = await this.fetchState(userId);\n if (!row) return;\n out.set(userId, {\n watermark: normalizeWatermark(row),\n dismissedIds: normalizeDismissedIds(row),\n lastSeen: normalizeLastSeen(row),\n deviceCount: 1,\n });\n }),\n );\n return out;\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n await this.client\n .from(this.tableName)\n .select(\"user_id\")\n .eq(\"user_id\", this.userId)\n .maybeSingle();\n return true;\n } catch {\n return false;\n }\n }\n\n async destroy(): Promise<void> {\n if (this.realtimeChannel && this.client.removeChannel) {\n await this.client.removeChannel(this.realtimeChannel);\n }\n this.realtimeChannel = null;\n }\n\n private async fetchState(userId: string): Promise<SupabaseStateRow | null> {\n const result = await this.client\n .from<SupabaseStateRow>(this.tableName)\n .select(\"user_id, watermark, dismissed_ids, last_seen\")\n .eq(\"user_id\", userId)\n .maybeSingle();\n throwOnError(result.error);\n return result.data;\n }\n\n private async upsertState(state: {\n watermark: string | null;\n dismissed_ids: string[];\n last_seen: string;\n }): Promise<void> {\n const payload: SupabaseStateRow = {\n user_id: this.userId,\n watermark: state.watermark,\n dismissed_ids: state.dismissed_ids,\n last_seen: state.last_seen,\n };\n const result = await this.client.from(this.tableName).upsert(payload as Record<string, unknown>);\n throwOnError(result.error);\n }\n\n private setupRealtime(): void {\n const channelFactory = this.client.channel;\n if (!channelFactory) return;\n this.realtimeChannel = channelFactory(`featuredrop:${this.tableName}:${this.userId}`)\n .on(\n \"postgres_changes\",\n {\n event: \"*\",\n schema: \"public\",\n table: this.tableName,\n filter: `user_id=eq.${this.userId}`,\n },\n () => {\n void this.sync();\n },\n )\n .subscribe();\n }\n}\n"]}