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.
- package/README.md +376 -4
- package/dist/angular.cjs +286 -0
- package/dist/angular.cjs.map +1 -0
- package/dist/angular.d.cts +229 -0
- package/dist/angular.d.ts +229 -0
- package/dist/angular.js +283 -0
- package/dist/angular.js.map +1 -0
- package/dist/featuredrop.cjs +1256 -0
- package/dist/featuredrop.cjs.map +1 -0
- package/dist/index.cjs +2762 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +979 -9
- package/dist/index.d.ts +979 -9
- package/dist/index.js +2720 -17
- package/dist/index.js.map +1 -1
- package/dist/preact.cjs +7289 -0
- package/dist/preact.cjs.map +1 -0
- package/dist/preact.d.cts +1266 -0
- package/dist/preact.d.ts +1266 -0
- package/dist/preact.js +7259 -0
- package/dist/preact.js.map +1 -0
- package/dist/react.cjs +6119 -101
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +798 -5
- package/dist/react.d.ts +798 -5
- package/dist/react.js +6103 -103
- package/dist/react.js.map +1 -1
- package/dist/schema.cjs +215 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +203 -0
- package/dist/schema.d.ts +203 -0
- package/dist/schema.js +209 -0
- package/dist/schema.js.map +1 -0
- package/dist/solid.cjs +373 -0
- package/dist/solid.cjs.map +1 -0
- package/dist/solid.d.cts +242 -0
- package/dist/solid.d.ts +242 -0
- package/dist/solid.js +366 -0
- package/dist/solid.js.map +1 -0
- package/dist/svelte.cjs +329 -0
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.js +324 -0
- package/dist/svelte.js.map +1 -0
- package/dist/testing.cjs +1422 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +339 -0
- package/dist/testing.d.ts +339 -0
- package/dist/testing.js +1415 -0
- package/dist/testing.js.map +1 -0
- package/dist/vue.cjs +1084 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.js +1072 -0
- package/dist/vue.js.map +1 -0
- package/dist/web-components.cjs +483 -0
- package/dist/web-components.cjs.map +1 -0
- package/dist/web-components.d.cts +211 -0
- package/dist/web-components.d.ts +211 -0
- package/dist/web-components.js +477 -0
- package/dist/web-components.js.map +1 -0
- package/package.json +126 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/analytics.ts","../src/semver.ts","../src/triggers.ts","../src/core.ts","../src/helpers.ts","../src/throttle.ts","../src/i18n.ts","../src/variants.ts","../src/react/context.ts","../src/react/provider.tsx","../src/testing.tsx"],"names":["value","jsx"],"mappings":"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","file":"testing.js","sourcesContent":["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","// 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 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 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 { 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 { createContext } from \"react\";\nimport type { FeatureEntry, FeaturePriority } from \"../types\";\nimport type { AdoptionEventInput } from \"../analytics\";\nimport type { FeatureDropTranslations } from \"../i18n\";\n\nexport interface FeatureDropContextValue {\n /** Full manifest provided to the provider */\n manifest: FeatureEntry[] | readonly FeatureEntry[];\n /** All currently \"new\" features */\n newFeatures: FeatureEntry[];\n /** New features currently queued by throttling rules */\n queuedFeatures: FeatureEntry[];\n /** Count of new features */\n newCount: number;\n /** Count before throttling (all pending new features) */\n totalNewCount: number;\n /** All new features sorted by priority then release date */\n newFeaturesSorted: FeatureEntry[];\n /** Check if a sidebar key has any new features */\n isNew: (sidebarKey: string) => boolean;\n /** Dismiss a single feature by ID */\n dismiss: (id: string) => void;\n /** Dismiss all features (marks all as seen) */\n dismissAll: () => Promise<void>;\n /** Get the feature entry for a sidebar key (if it's new) */\n getFeature: (sidebarKey: string) => FeatureEntry | undefined;\n /** Whether quiet mode (Do Not Disturb) is enabled */\n quietMode: boolean;\n /** Enable/disable quiet mode */\n setQuietMode: (enabled: boolean) => void;\n /** Mark a feature as seen for dependency-chain resolution */\n markFeatureSeen: (featureId: string) => void;\n /** Mark a feature as clicked for dependency-chain resolution */\n markFeatureClicked: (featureId: string) => void;\n /** Remaining toasts allowed in this session under throttle rules */\n getRemainingToastSlots: () => number;\n /** Mark toasts as shown in this session */\n markToastsShown: (featureIds: string[]) => void;\n /** Whether a modal can open right now under throttle rules */\n canShowModal: (priority?: FeaturePriority) => boolean;\n /** Record a modal display timestamp */\n markModalShown: () => void;\n /** Whether a tour can start right now under throttle rules */\n canShowTour: () => boolean;\n /** Record a tour start timestamp */\n markTourShown: () => void;\n /** Acquire/release spotlight slots under maxSimultaneousSpotlights */\n acquireSpotlightSlot: (id: string, priority?: FeaturePriority) => boolean;\n releaseSpotlightSlot: (id: string) => void;\n /** Number of currently active spotlight slots */\n activeSpotlightCount: number;\n /** Emit an adoption analytics event (collector-backed when configured) */\n trackAdoptionEvent: (event: AdoptionEventInput) => void;\n /** Active locale code used by built-in UI strings */\n locale: string;\n /** Resolved translation strings for built-in React components */\n translations: FeatureDropTranslations;\n /** Track a named usage event for trigger rules */\n trackUsageEvent: (event: string, delta?: number) => void;\n /** Track a named trigger event for trigger rules */\n trackTriggerEvent: (event: string) => void;\n /** Mark a milestone for trigger rules */\n trackMilestone: (event: string) => void;\n /** Manually override current path for page trigger rules */\n setTriggerPath: (path: string) => void;\n}\n\nexport const FeatureDropContext = createContext<FeatureDropContextValue | null>(\n null,\n);\n","import {\n useState,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport type {\n AudienceMatchFn,\n AnalyticsCallbacks,\n FeatureManifest,\n FeaturePriority,\n StorageAdapter,\n TriggerContext,\n UserContext,\n} from \"../types\";\nimport type { ThrottleOptions } from \"../throttle\";\nimport type { AdoptionEventInput, AnalyticsCollector } from \"../analytics\";\nimport { getNewFeatures } from \"../core\";\nimport { getFeatureById } from \"../helpers\";\nimport { applyAnnouncementThrottle } from \"../throttle\";\nimport { TriggerEngine } from \"../triggers\";\nimport { resolveTranslations, type FeatureDropTranslations } from \"../i18n\";\nimport {\n applyFeatureVariants,\n getFeatureVariantName,\n getOrCreateVariantKey,\n} from \"../variants\";\nimport { FeatureDropContext } from \"./context\";\n\nconst QUIET_MODE_STORAGE_KEY = \"featuredrop:quiet-mode\";\nconst SEEN_FEATURES_STORAGE_KEY = \"featuredrop:seen-features\";\nconst CLICKED_FEATURES_STORAGE_KEY = \"featuredrop:clicked-features\";\n\nfunction getCurrentPath(): string {\n if (typeof window === \"undefined\") return \"\";\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nfunction getScrollPercent(): number {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return 0;\n const root = document.documentElement;\n const max = root.scrollHeight - window.innerHeight;\n if (max <= 0) return 100;\n return Math.max(0, Math.min(100, Math.round((window.scrollY / max) * 100)));\n}\n\nfunction readQuietMode(): boolean {\n const storage = globalThis.localStorage as unknown as {\n getItem?: (key: string) => string | null;\n };\n if (!storage || typeof storage.getItem !== \"function\") return false;\n try {\n return storage.getItem(QUIET_MODE_STORAGE_KEY) === \"1\";\n } catch {\n return false;\n }\n}\n\nfunction writeQuietMode(enabled: boolean): void {\n const storage = globalThis.localStorage as unknown as {\n setItem?: (key: string, value: string) => void;\n };\n if (!storage || typeof storage.setItem !== \"function\") return;\n try {\n storage.setItem(QUIET_MODE_STORAGE_KEY, enabled ? \"1\" : \"0\");\n } catch {\n // noop\n }\n}\n\nfunction readIdSet(key: string): Set<string> {\n const storage = globalThis.localStorage as unknown as {\n getItem?: (storageKey: string) => string | null;\n };\n if (!storage || typeof storage.getItem !== \"function\") return new Set<string>();\n try {\n const raw = storage.getItem(key);\n if (!raw) return new Set<string>();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Set<string>();\n return new Set(parsed.filter((value): value is string => typeof value === \"string\"));\n } catch {\n return new Set<string>();\n }\n}\n\nfunction writeIdSet(key: string, values: ReadonlySet<string>): void {\n const storage = globalThis.localStorage as unknown as {\n setItem?: (storageKey: string, value: string) => void;\n };\n if (!storage || typeof storage.setItem !== \"function\") return;\n try {\n storage.setItem(key, JSON.stringify(Array.from(values)));\n } catch {\n // noop\n }\n}\n\ninterface FeatureState {\n allFeatures: ReturnType<typeof getNewFeatures>;\n visibleFeatures: ReturnType<typeof getNewFeatures>;\n queuedFeatures: ReturnType<typeof getNewFeatures>;\n}\n\nfunction computeFeatureState({\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n throttle,\n sessionStartedAt,\n quietMode,\n seenFeatureIds,\n clickedFeatureIds,\n triggerContext,\n}: {\n manifest: FeatureManifest;\n storage: StorageAdapter;\n now: Date;\n userContext?: UserContext;\n matchAudience?: AudienceMatchFn;\n appVersion?: string;\n throttle?: ThrottleOptions;\n sessionStartedAt: number;\n quietMode: boolean;\n seenFeatureIds: ReadonlySet<string>;\n clickedFeatureIds: ReadonlySet<string>;\n triggerContext?: TriggerContext;\n}): FeatureState {\n const dismissedIds = storage.getDismissedIds();\n const allFeatures = getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n {\n seenIds: seenFeatureIds,\n clickedIds: clickedFeatureIds,\n dismissedIds,\n },\n triggerContext,\n );\n\n const throttled = applyAnnouncementThrottle(\n allFeatures,\n throttle,\n {\n sessionStartedAt,\n quietMode,\n },\n now.getTime(),\n );\n\n return {\n allFeatures,\n visibleFeatures: throttled.visible,\n queuedFeatures: throttled.queued,\n };\n}\n\nexport interface FeatureDropProviderProps {\n /** The feature manifest — typically a frozen array of FeatureEntry objects */\n manifest: FeatureManifest;\n /** Storage adapter instance (e.g. LocalStorageAdapter, MemoryAdapter) */\n storage: StorageAdapter;\n /** Optional analytics callbacks — pipe to your analytics provider */\n analytics?: AnalyticsCallbacks;\n /** User context for audience targeting (plan, role, region, traits) */\n userContext?: UserContext;\n /** Custom audience matcher — overrides default AND/OR matching logic */\n matchAudience?: AudienceMatchFn;\n /** Current app version (semver) for version-pinned features */\n appVersion?: string;\n /** Announcement throttling and session cooldown controls */\n throttle?: ThrottleOptions;\n /** Stable identifier for A/B variant assignment (e.g. userId) */\n variantKey?: string;\n /** Optional adoption analytics collector */\n collector?: AnalyticsCollector;\n /** Locale code for built-in component translations (e.g. \"en\", \"fr\", \"es\") */\n locale?: string;\n /** Custom translation overrides for built-in component strings */\n translations?: Partial<FeatureDropTranslations>;\n children: ReactNode;\n}\n\n/**\n * Provides feature discovery state to the component tree.\n *\n * Wrap your app (or a subtree) with this provider to enable\n * `useFeatureDrop`, `useNewFeature`, `useNewCount`, and other hooks.\n */\nexport function FeatureDropProvider({\n manifest,\n storage,\n analytics,\n userContext,\n matchAudience: matchAudienceFn,\n appVersion,\n throttle,\n variantKey,\n collector,\n locale = \"en\",\n translations: translationOverrides,\n children,\n}: FeatureDropProviderProps) {\n const analyticsRef = useRef(analytics);\n analyticsRef.current = analytics;\n\n const sessionStartedAtRef = useRef(Date.now());\n const lastModalAtRef = useRef<number | null>(null);\n const lastTourAtRef = useRef<number | null>(null);\n const activeSpotlightIdsRef = useRef(new Set<string>());\n const triggerEngineRef = useRef<TriggerEngine | null>(null);\n if (!triggerEngineRef.current) {\n triggerEngineRef.current = new TriggerEngine({\n path: getCurrentPath(),\n scrollPercent: getScrollPercent(),\n });\n }\n const lastScrollPercentRef = useRef<number>(getScrollPercent());\n const [triggerVersion, setTriggerVersion] = useState(0);\n const [quietMode, setQuietModeState] = useState(() => readQuietMode());\n const [toastShownIds, setToastShownIds] = useState<Set<string>>(new Set());\n const [activeSpotlightIds, setActiveSpotlightIds] = useState<Set<string>>(new Set());\n const [seenFeatureIds, setSeenFeatureIds] = useState<Set<string>>(\n () => readIdSet(SEEN_FEATURES_STORAGE_KEY),\n );\n const [clickedFeatureIds, setClickedFeatureIds] = useState<Set<string>>(\n () => readIdSet(CLICKED_FEATURES_STORAGE_KEY),\n );\n const resolvedVariantKey = useMemo(() => getOrCreateVariantKey(variantKey), [variantKey]);\n const translations = useMemo(\n () => resolveTranslations(locale, translationOverrides),\n [locale, translationOverrides],\n );\n const resolvedManifest = useMemo(\n () => applyFeatureVariants(manifest, resolvedVariantKey),\n [manifest, resolvedVariantKey],\n );\n const [featureState, setFeatureState] = useState<FeatureState>(() =>\n computeFeatureState({\n manifest: resolvedManifest,\n storage,\n now: new Date(),\n userContext,\n matchAudience: matchAudienceFn,\n appVersion,\n throttle,\n sessionStartedAt: sessionStartedAtRef.current,\n quietMode: readQuietMode(),\n seenFeatureIds: readIdSet(SEEN_FEATURES_STORAGE_KEY),\n clickedFeatureIds: readIdSet(CLICKED_FEATURES_STORAGE_KEY),\n triggerContext: (() => {\n const engine = triggerEngineRef.current;\n if (!engine) return undefined;\n engine.setElapsedMs(Date.now() - sessionStartedAtRef.current);\n return engine.getContext();\n })(),\n }),\n );\n\n const recompute = useCallback(() => {\n const engine = triggerEngineRef.current;\n let triggerContext: TriggerContext | undefined;\n if (engine) {\n engine.setElapsedMs(Date.now() - sessionStartedAtRef.current);\n triggerContext = engine.getContext();\n }\n\n setFeatureState(\n computeFeatureState({\n manifest: resolvedManifest,\n storage,\n now: new Date(),\n userContext,\n matchAudience: matchAudienceFn,\n appVersion,\n throttle,\n sessionStartedAt: sessionStartedAtRef.current,\n quietMode,\n seenFeatureIds,\n clickedFeatureIds,\n triggerContext,\n }),\n );\n }, [\n resolvedManifest,\n storage,\n userContext,\n matchAudienceFn,\n appVersion,\n throttle,\n quietMode,\n seenFeatureIds,\n clickedFeatureIds,\n triggerVersion,\n ]);\n\n useEffect(() => {\n recompute();\n }, [recompute]);\n\n const hasTimeTriggers = useMemo(\n () => resolvedManifest.some((feature) => feature.trigger?.type === \"time\"),\n [resolvedManifest],\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const updatePath = () => {\n triggerEngineRef.current?.setPath(getCurrentPath());\n setTriggerVersion((value) => value + 1);\n };\n window.addEventListener(\"popstate\", updatePath);\n window.addEventListener(\"hashchange\", updatePath);\n return () => {\n window.removeEventListener(\"popstate\", updatePath);\n window.removeEventListener(\"hashchange\", updatePath);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const updateScroll = () => {\n const percent = getScrollPercent();\n if (percent === lastScrollPercentRef.current) return;\n lastScrollPercentRef.current = percent;\n triggerEngineRef.current?.setScrollPercent(percent);\n setTriggerVersion((value) => value + 1);\n };\n updateScroll();\n window.addEventListener(\"scroll\", updateScroll, { passive: true });\n window.addEventListener(\"resize\", updateScroll);\n return () => {\n window.removeEventListener(\"scroll\", updateScroll);\n window.removeEventListener(\"resize\", updateScroll);\n };\n }, []);\n\n useEffect(() => {\n if (!hasTimeTriggers) return;\n const timer = setInterval(() => {\n setTriggerVersion((value) => value + 1);\n }, 1000);\n return () => {\n clearInterval(timer);\n };\n }, [hasTimeTriggers]);\n\n useEffect(() => {\n const sessionCooldown = throttle?.sessionCooldown;\n if (!sessionCooldown || sessionCooldown <= 0) return;\n const elapsed = Date.now() - sessionStartedAtRef.current;\n const remaining = sessionCooldown - elapsed;\n if (remaining <= 0) return;\n const timer = setTimeout(() => {\n recompute();\n }, remaining + 5);\n return () => clearTimeout(timer);\n }, [recompute, throttle?.sessionCooldown]);\n\n useEffect(() => {\n let changed = false;\n const next = new Set(seenFeatureIds);\n for (const feature of featureState.visibleFeatures) {\n if (next.has(feature.id)) continue;\n next.add(feature.id);\n changed = true;\n }\n if (!changed) return;\n setSeenFeatureIds(next);\n writeIdSet(SEEN_FEATURES_STORAGE_KEY, next);\n }, [featureState.visibleFeatures, seenFeatureIds]);\n\n const dismiss = useCallback(\n (id: string) => {\n const feature = getFeatureById(resolvedManifest, id);\n storage.dismiss(id);\n if (feature) {\n analyticsRef.current?.onFeatureDismissed?.(feature);\n }\n collector?.track({\n type: \"feature_dismissed\",\n featureId: id,\n variant: feature ? getFeatureVariantName(feature) : undefined,\n });\n recompute();\n },\n [collector, resolvedManifest, storage, recompute],\n );\n\n const dismissAll = useCallback(async () => {\n await storage.dismissAll(new Date());\n analyticsRef.current?.onAllDismissed?.();\n recompute();\n }, [recompute, storage]);\n\n const inSessionCooldown = useCallback((now: number): boolean => {\n const sessionCooldown = throttle?.sessionCooldown ?? 0;\n if (!sessionCooldown || sessionCooldown <= 0) return false;\n return now - sessionStartedAtRef.current < sessionCooldown;\n }, [throttle?.sessionCooldown]);\n\n const shouldSuppressForQuietMode = useCallback((priority?: FeaturePriority): boolean => {\n if (!throttle?.respectDoNotDisturb || !quietMode) return false;\n return priority !== \"critical\";\n }, [quietMode, throttle?.respectDoNotDisturb]);\n\n const getRemainingToastSlots = useCallback((): number => {\n const maxToastsPerSession = throttle?.maxToastsPerSession;\n if (!maxToastsPerSession || maxToastsPerSession <= 0) return Number.POSITIVE_INFINITY;\n return Math.max(0, maxToastsPerSession - toastShownIds.size);\n }, [throttle?.maxToastsPerSession, toastShownIds.size]);\n\n const markToastsShown = useCallback((featureIds: string[]) => {\n if (featureIds.length === 0) return;\n setToastShownIds((previous) => {\n let changed = false;\n const next = new Set(previous);\n for (const id of featureIds) {\n if (!id || next.has(id)) continue;\n next.add(id);\n changed = true;\n }\n return changed ? next : previous;\n });\n }, []);\n\n const canShowModal = useCallback((priority?: FeaturePriority): boolean => {\n const now = Date.now();\n if (inSessionCooldown(now)) return false;\n if (shouldSuppressForQuietMode(priority)) return false;\n const minTime = throttle?.minTimeBetweenModals ?? 0;\n const lastShown = lastModalAtRef.current;\n if (minTime > 0 && lastShown && now - lastShown < minTime) return false;\n return true;\n }, [inSessionCooldown, shouldSuppressForQuietMode, throttle?.minTimeBetweenModals]);\n\n const markModalShown = useCallback(() => {\n lastModalAtRef.current = Date.now();\n }, []);\n\n const canShowTour = useCallback((): boolean => {\n const now = Date.now();\n if (inSessionCooldown(now)) return false;\n if (shouldSuppressForQuietMode(undefined)) return false;\n const minTime = throttle?.minTimeBetweenTours ?? 0;\n const lastShown = lastTourAtRef.current;\n if (minTime > 0 && lastShown && now - lastShown < minTime) return false;\n return true;\n }, [inSessionCooldown, shouldSuppressForQuietMode, throttle?.minTimeBetweenTours]);\n\n const markTourShown = useCallback(() => {\n lastTourAtRef.current = Date.now();\n }, []);\n\n const acquireSpotlightSlot = useCallback((id: string, priority?: FeaturePriority): boolean => {\n if (!id) return false;\n if (shouldSuppressForQuietMode(priority)) return false;\n const current = activeSpotlightIdsRef.current;\n if (current.has(id)) return true;\n const maxSpotlights = throttle?.maxSimultaneousSpotlights;\n if (maxSpotlights && maxSpotlights > 0 && current.size >= maxSpotlights) return false;\n const next = new Set(current);\n next.add(id);\n activeSpotlightIdsRef.current = next;\n setActiveSpotlightIds(next);\n return true;\n }, [shouldSuppressForQuietMode, throttle?.maxSimultaneousSpotlights]);\n\n const releaseSpotlightSlot = useCallback((id: string) => {\n if (!id) return;\n const current = activeSpotlightIdsRef.current;\n if (!current.has(id)) return;\n const next = new Set(current);\n next.delete(id);\n activeSpotlightIdsRef.current = next;\n setActiveSpotlightIds(next);\n }, []);\n\n const setQuietMode = useCallback((enabled: boolean) => {\n setQuietModeState(enabled);\n writeQuietMode(enabled);\n }, []);\n\n const markFeatureSeen = useCallback((featureId: string) => {\n setSeenFeatureIds((previous) => {\n if (previous.has(featureId)) return previous;\n const next = new Set(previous);\n next.add(featureId);\n writeIdSet(SEEN_FEATURES_STORAGE_KEY, next);\n const feature = getFeatureById(resolvedManifest, featureId);\n collector?.track({\n type: \"feature_seen\",\n featureId,\n variant: feature ? getFeatureVariantName(feature) : undefined,\n });\n return next;\n });\n }, [collector, resolvedManifest]);\n\n const markFeatureClicked = useCallback((featureId: string) => {\n setClickedFeatureIds((previous) => {\n if (previous.has(featureId)) return previous;\n const next = new Set(previous);\n next.add(featureId);\n writeIdSet(CLICKED_FEATURES_STORAGE_KEY, next);\n const feature = getFeatureById(resolvedManifest, featureId);\n collector?.track({\n type: \"feature_clicked\",\n featureId,\n variant: feature ? getFeatureVariantName(feature) : undefined,\n });\n return next;\n });\n }, [collector, resolvedManifest]);\n\n const trackAdoptionEvent = useCallback((event: AdoptionEventInput) => {\n if (!collector) return;\n const feature = event.featureId ? getFeatureById(resolvedManifest, event.featureId) : undefined;\n collector.track({\n ...event,\n variant: event.variant ?? (feature ? getFeatureVariantName(feature) : undefined),\n });\n }, [collector, resolvedManifest]);\n\n const trackUsageEvent = useCallback((event: string, delta = 1) => {\n if (!event) return;\n triggerEngineRef.current?.trackUsage(event, delta);\n setTriggerVersion((value) => value + 1);\n }, []);\n\n const trackTriggerEvent = useCallback((event: string) => {\n if (!event) return;\n triggerEngineRef.current?.trackEvent(event);\n setTriggerVersion((value) => value + 1);\n }, []);\n\n const trackMilestone = useCallback((event: string) => {\n if (!event) return;\n triggerEngineRef.current?.trackMilestone(event);\n setTriggerVersion((value) => value + 1);\n }, []);\n\n const setTriggerPath = useCallback((path: string) => {\n if (!path) return;\n triggerEngineRef.current?.setPath(path);\n setTriggerVersion((value) => value + 1);\n }, []);\n\n const isNewFn = useCallback(\n (sidebarKey: string) =>\n featureState.visibleFeatures.some((feature) => feature.sidebarKey === sidebarKey),\n [featureState.visibleFeatures],\n );\n\n const getFeature = useCallback(\n (sidebarKey: string) =>\n featureState.visibleFeatures.find((feature) => feature.sidebarKey === sidebarKey),\n [featureState.visibleFeatures],\n );\n\n const newFeaturesSorted = useMemo(() => {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return [...featureState.visibleFeatures].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 }, [featureState.visibleFeatures]);\n\n const value = useMemo(\n () => ({\n manifest: resolvedManifest,\n newFeatures: featureState.visibleFeatures,\n queuedFeatures: featureState.queuedFeatures,\n newCount: featureState.visibleFeatures.length,\n totalNewCount: featureState.allFeatures.length,\n newFeaturesSorted,\n isNew: isNewFn,\n dismiss,\n dismissAll,\n getFeature,\n quietMode,\n setQuietMode,\n markFeatureSeen,\n markFeatureClicked,\n getRemainingToastSlots,\n markToastsShown,\n canShowModal,\n markModalShown,\n canShowTour,\n markTourShown,\n acquireSpotlightSlot,\n releaseSpotlightSlot,\n activeSpotlightCount: activeSpotlightIds.size,\n trackAdoptionEvent,\n locale,\n translations,\n trackUsageEvent,\n trackTriggerEvent,\n trackMilestone,\n setTriggerPath,\n }),\n [\n resolvedManifest,\n featureState.visibleFeatures,\n featureState.queuedFeatures,\n featureState.allFeatures.length,\n newFeaturesSorted,\n isNewFn,\n dismiss,\n dismissAll,\n getFeature,\n quietMode,\n setQuietMode,\n markFeatureSeen,\n markFeatureClicked,\n getRemainingToastSlots,\n markToastsShown,\n canShowModal,\n markModalShown,\n canShowTour,\n markTourShown,\n acquireSpotlightSlot,\n releaseSpotlightSlot,\n activeSpotlightIds.size,\n trackAdoptionEvent,\n locale,\n translations,\n trackUsageEvent,\n trackTriggerEvent,\n trackMilestone,\n setTriggerPath,\n ],\n );\n\n return (\n <FeatureDropContext.Provider value={value}>\n {children}\n </FeatureDropContext.Provider>\n );\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { AnalyticsCollector } from \"./analytics\";\nimport type { AdoptionEvent, AnalyticsCollectorOptions } from \"./analytics\";\nimport { createManifest } from \"./helpers\";\nimport { FeatureDropProvider } from \"./react/provider\";\nimport type { FeatureDropProviderProps } from \"./react/provider\";\nimport type { FeatureEntry, FeatureManifest, FeatureType, StorageAdapter } from \"./types\";\n\nfunction toSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nfunction toIso(value: string, now: Date, fallbackDays = 0): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"today\") return new Date(now).toISOString();\n const rel = trimmed.match(/^([+-]\\d+)d$/);\n if (rel) {\n const days = Number(rel[1]);\n return new Date(now.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n }\n const parsed = new Date(trimmed).getTime();\n if (Number.isFinite(parsed)) return new Date(parsed).toISOString();\n return new Date(now.getTime() + fallbackDays * 24 * 60 * 60 * 1000).toISOString();\n}\n\nexport type MockFeatureInput = Partial<FeatureEntry> & {\n id?: string;\n label?: string;\n releasedAt?: string;\n showNewUntil?: string;\n type?: FeatureType;\n};\n\nexport function createMockManifest(\n entries: MockFeatureInput[],\n now: Date = new Date(),\n): FeatureManifest {\n const normalized = entries.map((entry, index) => {\n const label = entry.label?.trim() || `Feature ${index + 1}`;\n const id = entry.id?.trim() || toSlug(label) || `feature-${index + 1}`;\n const releasedAt = toIso(entry.releasedAt ?? \"today\", now);\n const showNewUntil = toIso(entry.showNewUntil ?? \"+14d\", now, 14);\n const normalizedEntry: FeatureEntry = {\n ...entry,\n id,\n label,\n releasedAt,\n showNewUntil,\n type: entry.type ?? \"feature\",\n };\n return normalizedEntry;\n });\n return createManifest(normalized);\n}\n\nexport interface MockStorage extends StorageAdapter {\n setWatermark: (watermark: string | null) => void;\n setDismissedIds: (ids: string[]) => void;\n reset: () => void;\n}\n\nclass MockStorageAdapter implements MockStorage {\n private watermark: string | null;\n private dismissed = new Set<string>();\n\n constructor(initial?: { watermark?: string | null; dismissedIds?: string[] }) {\n this.watermark = initial?.watermark ?? null;\n if (initial?.dismissedIds) {\n for (const id of initial.dismissedIds) this.dismissed.add(id);\n }\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 setWatermark(watermark: string | null): void {\n this.watermark = watermark;\n }\n\n setDismissedIds(ids: string[]): void {\n this.dismissed = new Set(ids);\n }\n\n reset(): void {\n this.watermark = null;\n this.dismissed.clear();\n }\n}\n\nexport function createMockStorage(initial?: { watermark?: string | null; dismissedIds?: string[] }): MockStorage {\n return new MockStorageAdapter(initial);\n}\n\nexport function createTestProvider(\n props: Omit<FeatureDropProviderProps, \"children\">,\n): ({ children }: { children?: ReactNode }) => ReactElement {\n return function TestProvider({ children }: { children?: ReactNode }): ReactElement {\n return <FeatureDropProvider {...props}>{children}</FeatureDropProvider>;\n };\n}\n\ninterface TimerController {\n advanceTimersByTime: (ms: number) => void;\n setSystemTime?: (now: number | Date) => void;\n}\n\nfunction getTimerController(): TimerController | null {\n const viController = (globalThis as { vi?: TimerController }).vi;\n if (viController && typeof viController.advanceTimersByTime === \"function\") return viController;\n const jestController = (globalThis as { jest?: TimerController }).jest;\n if (jestController && typeof jestController.advanceTimersByTime === \"function\") return jestController;\n return null;\n}\n\nexport function advanceTime(ms: number): void {\n const controller = getTimerController();\n if (!controller) throw new Error(\"No fake timer controller found (vi/jest).\");\n controller.advanceTimersByTime(ms);\n}\n\nexport function setMockTime(now: number | Date): void {\n const controller = getTimerController();\n if (!controller || typeof controller.setSystemTime !== \"function\") {\n throw new Error(\"Timer controller does not support setSystemTime.\");\n }\n controller.setSystemTime(now);\n}\n\nexport type MockAnalyticsCollectorOptions = Omit<AnalyticsCollectorOptions, \"adapter\">;\n\nexport class MockAnalyticsCollector extends AnalyticsCollector {\n readonly events: AdoptionEvent[] = [];\n\n constructor(options: MockAnalyticsCollectorOptions = {}) {\n const events: AdoptionEvent[] = [];\n super({\n adapter: {\n track: (event: AdoptionEvent) => {\n events.push(event);\n },\n trackBatch: (batch: AdoptionEvent[]) => {\n events.push(...batch);\n },\n },\n batchSize: options.batchSize ?? 1,\n flushInterval: options.flushInterval ?? 0,\n sampleRate: options.sampleRate,\n enabled: options.enabled,\n sessionId: options.sessionId,\n userId: options.userId,\n now: options.now,\n random: options.random,\n });\n this.events = events;\n }\n\n clear(): void {\n this.events.splice(0, this.events.length);\n }\n}\n"]}
|