featuredrop 1.2.0 → 1.4.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 +171 -0
- package/dist/admin.cjs +212 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +176 -0
- package/dist/admin.d.ts +176 -0
- package/dist/admin.js +207 -0
- package/dist/admin.js.map +1 -0
- package/dist/angular.cjs +13 -3
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +4 -0
- package/dist/angular.d.ts +4 -0
- package/dist/angular.js +13 -3
- package/dist/angular.js.map +1 -1
- package/dist/bridges.cjs +422 -0
- package/dist/bridges.cjs.map +1 -0
- package/dist/bridges.d.cts +194 -0
- package/dist/bridges.d.ts +194 -0
- package/dist/bridges.js +395 -0
- package/dist/bridges.js.map +1 -0
- package/dist/ci.cjs +328 -0
- package/dist/ci.cjs.map +1 -0
- package/dist/ci.d.cts +176 -0
- package/dist/ci.d.ts +176 -0
- package/dist/ci.js +324 -0
- package/dist/ci.js.map +1 -0
- package/dist/featuredrop.cjs +162 -20
- package/dist/featuredrop.cjs.map +1 -1
- package/dist/flags.cjs +51 -0
- package/dist/flags.cjs.map +1 -0
- package/dist/flags.d.cts +48 -0
- package/dist/flags.d.ts +48 -0
- package/dist/flags.js +47 -0
- package/dist/flags.js.map +1 -0
- package/dist/index.cjs +2599 -660
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +743 -206
- package/dist/index.d.ts +743 -206
- package/dist/index.js +2555 -668
- package/dist/index.js.map +1 -1
- package/dist/preact.cjs +747 -221
- package/dist/preact.cjs.map +1 -1
- package/dist/preact.d.cts +67 -120
- package/dist/preact.d.ts +67 -120
- package/dist/preact.js +713 -207
- package/dist/preact.js.map +1 -1
- package/dist/react.cjs +747 -221
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +67 -120
- package/dist/react.d.ts +67 -120
- package/dist/react.js +713 -207
- package/dist/react.js.map +1 -1
- package/dist/schema.cjs +78 -1
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +142 -0
- package/dist/schema.d.ts +142 -0
- package/dist/schema.js +78 -1
- package/dist/schema.js.map +1 -1
- package/dist/solid.cjs +13 -3
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.cts +4 -0
- package/dist/solid.d.ts +4 -0
- package/dist/solid.js +13 -3
- package/dist/solid.js.map +1 -1
- package/dist/svelte.cjs +13 -3
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.js +13 -3
- package/dist/svelte.js.map +1 -1
- package/dist/testing.cjs +136 -15
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +22 -0
- package/dist/testing.d.ts +22 -0
- package/dist/testing.js +136 -15
- package/dist/testing.js.map +1 -1
- package/dist/vue.cjs +36 -5
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +16 -5
- package/dist/vue.js.map +1 -1
- package/dist/web-components.cjs +14 -4
- package/dist/web-components.cjs.map +1 -1
- package/dist/web-components.d.cts +4 -0
- package/dist/web-components.d.ts +4 -0
- package/dist/web-components.js +14 -4
- package/dist/web-components.js.map +1 -1
- package/package.json +59 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
2
4
|
|
|
3
5
|
/** Entry type label — determines default icon/color in UI */
|
|
4
6
|
type FeatureType = "feature" | "improvement" | "fix" | "breaking";
|
|
5
7
|
/** Priority level for announcements */
|
|
6
8
|
type FeaturePriority = "critical" | "normal" | "low";
|
|
9
|
+
/** Motion preset for built-in component transitions */
|
|
10
|
+
type FeatureDropAnimationPreset = "none" | "subtle" | "normal" | "playful";
|
|
7
11
|
/** Call-to-action for a feature entry */
|
|
8
12
|
interface FeatureCTA {
|
|
9
13
|
/** Button/link label */
|
|
@@ -48,6 +52,10 @@ interface UserContext {
|
|
|
48
52
|
}
|
|
49
53
|
/** Custom audience matcher function */
|
|
50
54
|
type AudienceMatchFn = (audience: AudienceRule, userContext: UserContext) => boolean;
|
|
55
|
+
/** Feature flag resolver interface for gating announcement visibility */
|
|
56
|
+
interface FeatureFlagBridge {
|
|
57
|
+
isEnabled: (flagKey: string, userContext?: UserContext) => boolean;
|
|
58
|
+
}
|
|
51
59
|
/** Dependency gates for progressive feature discovery */
|
|
52
60
|
interface FeatureDependencies {
|
|
53
61
|
/** Features the user must have seen before this one can surface */
|
|
@@ -137,8 +145,12 @@ interface FeatureEntry {
|
|
|
137
145
|
sidebarKey?: string;
|
|
138
146
|
/** Optional grouping category (e.g. "ai", "billing", "core") */
|
|
139
147
|
category?: string;
|
|
148
|
+
/** Optional product scope (`"*"`, `"askverdict"`, etc.) for multi-product manifests */
|
|
149
|
+
product?: string;
|
|
140
150
|
/** Optional URL to link to (e.g. docs page, changelog entry) */
|
|
141
151
|
url?: string;
|
|
152
|
+
/** Optional feature flag key; requires a flag bridge to evaluate */
|
|
153
|
+
flagKey?: string;
|
|
142
154
|
/** Entry type — determines default icon/color in UI components */
|
|
143
155
|
type?: FeatureType;
|
|
144
156
|
/** Priority level — critical entries get special treatment in UI */
|
|
@@ -243,24 +255,26 @@ declare function matchesAudience(audience: AudienceRule, userContext: UserContex
|
|
|
243
255
|
* 3. Feature has not been individually dismissed
|
|
244
256
|
* 4. If `publishAt` is set, current time must be after it (scheduled publishing)
|
|
245
257
|
* 5. If `audience` is set, user must match the targeting rules
|
|
258
|
+
* 6. If `flagKey` is set, the flag bridge must resolve it as enabled
|
|
259
|
+
* 7. If `product` is set, it must match the current product scope
|
|
246
260
|
*/
|
|
247
|
-
declare function isNew(feature: FeatureEntry, watermark: string | null, dismissedIds: ReadonlySet<string>, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext): boolean;
|
|
261
|
+
declare function isNew(feature: FeatureEntry, watermark: string | null, dismissedIds: ReadonlySet<string>, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext, flagBridge?: FeatureFlagBridge, product?: string): boolean;
|
|
248
262
|
/**
|
|
249
263
|
* Get all features that are currently "new" for this user.
|
|
250
264
|
*/
|
|
251
|
-
declare function getNewFeatures(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext): FeatureEntry[];
|
|
265
|
+
declare function getNewFeatures(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext, flagBridge?: FeatureFlagBridge, product?: string): FeatureEntry[];
|
|
252
266
|
/**
|
|
253
267
|
* Get the count of new features.
|
|
254
268
|
*/
|
|
255
|
-
declare function getNewFeatureCount(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext): number;
|
|
269
|
+
declare function getNewFeatureCount(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext, flagBridge?: FeatureFlagBridge, product?: string): number;
|
|
256
270
|
/**
|
|
257
271
|
* Check if a specific sidebar key has a new feature.
|
|
258
272
|
*/
|
|
259
|
-
declare function hasNewFeature(manifest: FeatureManifest, sidebarKey: string, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext): boolean;
|
|
273
|
+
declare function hasNewFeature(manifest: FeatureManifest, sidebarKey: string, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext, flagBridge?: FeatureFlagBridge, product?: string): boolean;
|
|
260
274
|
/**
|
|
261
275
|
* Get all features sorted by priority (critical first) then by release date (newest first).
|
|
262
276
|
*/
|
|
263
|
-
declare function getNewFeaturesSorted(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext): FeatureEntry[];
|
|
277
|
+
declare function getNewFeaturesSorted(manifest: FeatureManifest, storage: StorageAdapter, now?: Date, userContext?: UserContext, matchAudience?: AudienceMatchFn, appVersion?: string, dependencyState?: FeatureDependencyState, triggerContext?: TriggerContext, flagBridge?: FeatureFlagBridge, product?: string): FeatureEntry[];
|
|
264
278
|
|
|
265
279
|
/**
|
|
266
280
|
* Create a frozen feature manifest from an array of entries.
|
|
@@ -285,6 +299,603 @@ declare function getNewFeaturesByCategory(manifest: FeatureManifest, category: s
|
|
|
285
299
|
*/
|
|
286
300
|
declare function parseDescription(markdown: string): string;
|
|
287
301
|
|
|
302
|
+
interface ChangelogRendererOptions {
|
|
303
|
+
manifest: FeatureManifest;
|
|
304
|
+
storage: StorageAdapter;
|
|
305
|
+
userContext?: UserContext;
|
|
306
|
+
matchAudience?: AudienceMatchFn;
|
|
307
|
+
appVersion?: string;
|
|
308
|
+
flagBridge?: FeatureFlagBridge;
|
|
309
|
+
product?: string;
|
|
310
|
+
now?: () => Date;
|
|
311
|
+
}
|
|
312
|
+
interface ChangelogRendererState {
|
|
313
|
+
manifest: FeatureManifest;
|
|
314
|
+
newFeatures: FeatureEntry[];
|
|
315
|
+
newFeaturesSorted: FeatureEntry[];
|
|
316
|
+
newCount: number;
|
|
317
|
+
watermark: string | null;
|
|
318
|
+
dismissedIds: ReadonlySet<string>;
|
|
319
|
+
}
|
|
320
|
+
interface ChangelogRendererActions {
|
|
321
|
+
refresh: () => void;
|
|
322
|
+
dismiss: (id: string) => void;
|
|
323
|
+
dismissAll: () => Promise<void>;
|
|
324
|
+
setManifest: (manifest: FeatureManifest) => void;
|
|
325
|
+
setUserContext: (userContext?: UserContext) => void;
|
|
326
|
+
setAppVersion: (appVersion?: string) => void;
|
|
327
|
+
setAudienceMatcher: (matchAudience?: AudienceMatchFn) => void;
|
|
328
|
+
setFlagBridge: (flagBridge?: FeatureFlagBridge) => void;
|
|
329
|
+
setProduct: (product?: string) => void;
|
|
330
|
+
}
|
|
331
|
+
interface ChangelogRendererComputed {
|
|
332
|
+
isNew: (sidebarKey: string) => boolean;
|
|
333
|
+
getFeature: (sidebarKey: string) => FeatureEntry | undefined;
|
|
334
|
+
getFeatureById: (id: string) => FeatureEntry | undefined;
|
|
335
|
+
getFeaturesByCategory: (category: string) => FeatureEntry[];
|
|
336
|
+
}
|
|
337
|
+
interface ChangelogRenderer {
|
|
338
|
+
readonly state: ChangelogRendererState;
|
|
339
|
+
readonly actions: ChangelogRendererActions;
|
|
340
|
+
readonly computed: ChangelogRendererComputed;
|
|
341
|
+
subscribe: (listener: (state: ChangelogRendererState) => void) => () => void;
|
|
342
|
+
}
|
|
343
|
+
declare function createChangelogRenderer({ manifest: initialManifest, storage, userContext: initialUserContext, matchAudience: initialMatchAudience, appVersion: initialAppVersion, flagBridge: initialFlagBridge, product: initialProduct, now, }: ChangelogRendererOptions): ChangelogRenderer;
|
|
344
|
+
|
|
345
|
+
interface SlackBridgeOptions {
|
|
346
|
+
webhookUrl: string;
|
|
347
|
+
username?: string;
|
|
348
|
+
iconEmoji?: string;
|
|
349
|
+
channel?: string;
|
|
350
|
+
formatter?: (feature: FeatureEntry) => Record<string, unknown>;
|
|
351
|
+
}
|
|
352
|
+
declare const SlackBridge: {
|
|
353
|
+
notify(feature: FeatureEntry, options: SlackBridgeOptions): Promise<void>;
|
|
354
|
+
};
|
|
355
|
+
interface DiscordBridgeOptions {
|
|
356
|
+
webhookUrl: string;
|
|
357
|
+
username?: string;
|
|
358
|
+
avatarUrl?: string;
|
|
359
|
+
formatter?: (feature: FeatureEntry) => Record<string, unknown>;
|
|
360
|
+
}
|
|
361
|
+
declare const DiscordBridge: {
|
|
362
|
+
notify(feature: FeatureEntry, options: DiscordBridgeOptions): Promise<void>;
|
|
363
|
+
};
|
|
364
|
+
interface WebhookBridgeOptions {
|
|
365
|
+
url: string;
|
|
366
|
+
headers?: Record<string, string>;
|
|
367
|
+
event?: string;
|
|
368
|
+
body?: Record<string, unknown>;
|
|
369
|
+
}
|
|
370
|
+
declare const WebhookBridge: {
|
|
371
|
+
post(feature: FeatureEntry, options: WebhookBridgeOptions): Promise<void>;
|
|
372
|
+
};
|
|
373
|
+
interface EmailDigestGeneratorOptions {
|
|
374
|
+
title?: string;
|
|
375
|
+
intro?: string;
|
|
376
|
+
template?: "default" | "minimal";
|
|
377
|
+
productName?: string;
|
|
378
|
+
}
|
|
379
|
+
declare const EmailDigestGenerator: {
|
|
380
|
+
generate(features: readonly FeatureEntry[], options?: EmailDigestGeneratorOptions): string;
|
|
381
|
+
};
|
|
382
|
+
interface RSSFeedGeneratorOptions {
|
|
383
|
+
title?: string;
|
|
384
|
+
link?: string;
|
|
385
|
+
description?: string;
|
|
386
|
+
}
|
|
387
|
+
declare const RSSFeedGenerator: {
|
|
388
|
+
generate(manifest: FeatureManifest, options?: RSSFeedGeneratorOptions): string;
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
interface ValidationIssue {
|
|
392
|
+
path: string;
|
|
393
|
+
message: string;
|
|
394
|
+
code: "invalid_type" | "missing_required" | "invalid_value" | "invalid_date" | "duplicate_id" | "circular_dependency";
|
|
395
|
+
}
|
|
396
|
+
interface ValidationResult {
|
|
397
|
+
valid: boolean;
|
|
398
|
+
errors: ValidationIssue[];
|
|
399
|
+
}
|
|
400
|
+
declare const featureEntryJsonSchema: {
|
|
401
|
+
readonly type: "object";
|
|
402
|
+
readonly required: readonly ["id", "label", "releasedAt", "showNewUntil"];
|
|
403
|
+
readonly properties: {
|
|
404
|
+
readonly id: {
|
|
405
|
+
readonly type: "string";
|
|
406
|
+
};
|
|
407
|
+
readonly label: {
|
|
408
|
+
readonly type: "string";
|
|
409
|
+
};
|
|
410
|
+
readonly description: {
|
|
411
|
+
readonly type: "string";
|
|
412
|
+
};
|
|
413
|
+
readonly releasedAt: {
|
|
414
|
+
readonly type: "string";
|
|
415
|
+
readonly format: "date-time";
|
|
416
|
+
};
|
|
417
|
+
readonly showNewUntil: {
|
|
418
|
+
readonly type: "string";
|
|
419
|
+
readonly format: "date-time";
|
|
420
|
+
};
|
|
421
|
+
readonly flagKey: {
|
|
422
|
+
readonly type: "string";
|
|
423
|
+
};
|
|
424
|
+
readonly product: {
|
|
425
|
+
readonly type: "string";
|
|
426
|
+
};
|
|
427
|
+
readonly url: {
|
|
428
|
+
readonly type: "string";
|
|
429
|
+
};
|
|
430
|
+
readonly image: {
|
|
431
|
+
readonly type: "string";
|
|
432
|
+
};
|
|
433
|
+
readonly type: {
|
|
434
|
+
readonly enum: readonly ["feature", "improvement", "fix", "breaking"];
|
|
435
|
+
};
|
|
436
|
+
readonly priority: {
|
|
437
|
+
readonly enum: readonly ["critical", "normal", "low"];
|
|
438
|
+
};
|
|
439
|
+
readonly cta: {
|
|
440
|
+
readonly type: "object";
|
|
441
|
+
readonly properties: {
|
|
442
|
+
readonly label: {
|
|
443
|
+
readonly type: "string";
|
|
444
|
+
};
|
|
445
|
+
readonly url: {
|
|
446
|
+
readonly type: "string";
|
|
447
|
+
};
|
|
448
|
+
};
|
|
449
|
+
};
|
|
450
|
+
readonly meta: {
|
|
451
|
+
readonly type: "object";
|
|
452
|
+
};
|
|
453
|
+
};
|
|
454
|
+
};
|
|
455
|
+
declare const featureManifestJsonSchema: {
|
|
456
|
+
readonly type: "array";
|
|
457
|
+
readonly items: {
|
|
458
|
+
readonly type: "object";
|
|
459
|
+
readonly required: readonly ["id", "label", "releasedAt", "showNewUntil"];
|
|
460
|
+
readonly properties: {
|
|
461
|
+
readonly id: {
|
|
462
|
+
readonly type: "string";
|
|
463
|
+
};
|
|
464
|
+
readonly label: {
|
|
465
|
+
readonly type: "string";
|
|
466
|
+
};
|
|
467
|
+
readonly description: {
|
|
468
|
+
readonly type: "string";
|
|
469
|
+
};
|
|
470
|
+
readonly releasedAt: {
|
|
471
|
+
readonly type: "string";
|
|
472
|
+
readonly format: "date-time";
|
|
473
|
+
};
|
|
474
|
+
readonly showNewUntil: {
|
|
475
|
+
readonly type: "string";
|
|
476
|
+
readonly format: "date-time";
|
|
477
|
+
};
|
|
478
|
+
readonly flagKey: {
|
|
479
|
+
readonly type: "string";
|
|
480
|
+
};
|
|
481
|
+
readonly product: {
|
|
482
|
+
readonly type: "string";
|
|
483
|
+
};
|
|
484
|
+
readonly url: {
|
|
485
|
+
readonly type: "string";
|
|
486
|
+
};
|
|
487
|
+
readonly image: {
|
|
488
|
+
readonly type: "string";
|
|
489
|
+
};
|
|
490
|
+
readonly type: {
|
|
491
|
+
readonly enum: readonly ["feature", "improvement", "fix", "breaking"];
|
|
492
|
+
};
|
|
493
|
+
readonly priority: {
|
|
494
|
+
readonly enum: readonly ["critical", "normal", "low"];
|
|
495
|
+
};
|
|
496
|
+
readonly cta: {
|
|
497
|
+
readonly type: "object";
|
|
498
|
+
readonly properties: {
|
|
499
|
+
readonly label: {
|
|
500
|
+
readonly type: "string";
|
|
501
|
+
};
|
|
502
|
+
readonly url: {
|
|
503
|
+
readonly type: "string";
|
|
504
|
+
};
|
|
505
|
+
};
|
|
506
|
+
};
|
|
507
|
+
readonly meta: {
|
|
508
|
+
readonly type: "object";
|
|
509
|
+
};
|
|
510
|
+
};
|
|
511
|
+
};
|
|
512
|
+
};
|
|
513
|
+
declare const featureEntrySchema: z.ZodObject<{
|
|
514
|
+
id: z.ZodString;
|
|
515
|
+
label: z.ZodString;
|
|
516
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
517
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
518
|
+
description: z.ZodOptional<z.ZodString>;
|
|
519
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
520
|
+
product: z.ZodOptional<z.ZodString>;
|
|
521
|
+
url: z.ZodOptional<z.ZodString>;
|
|
522
|
+
image: z.ZodOptional<z.ZodString>;
|
|
523
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
524
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
525
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
526
|
+
label: z.ZodString;
|
|
527
|
+
url: z.ZodString;
|
|
528
|
+
}, "strip", z.ZodTypeAny, {
|
|
529
|
+
label: string;
|
|
530
|
+
url: string;
|
|
531
|
+
}, {
|
|
532
|
+
label: string;
|
|
533
|
+
url: string;
|
|
534
|
+
}>>;
|
|
535
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
536
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
537
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
538
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
539
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
540
|
+
}, "strip", z.ZodTypeAny, {
|
|
541
|
+
seen?: string[] | undefined;
|
|
542
|
+
clicked?: string[] | undefined;
|
|
543
|
+
dismissed?: string[] | undefined;
|
|
544
|
+
}, {
|
|
545
|
+
seen?: string[] | undefined;
|
|
546
|
+
clicked?: string[] | undefined;
|
|
547
|
+
dismissed?: string[] | undefined;
|
|
548
|
+
}>>;
|
|
549
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
550
|
+
id: z.ZodString;
|
|
551
|
+
label: z.ZodString;
|
|
552
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
553
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
554
|
+
description: z.ZodOptional<z.ZodString>;
|
|
555
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
556
|
+
product: z.ZodOptional<z.ZodString>;
|
|
557
|
+
url: z.ZodOptional<z.ZodString>;
|
|
558
|
+
image: z.ZodOptional<z.ZodString>;
|
|
559
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
560
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
561
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
562
|
+
label: z.ZodString;
|
|
563
|
+
url: z.ZodString;
|
|
564
|
+
}, "strip", z.ZodTypeAny, {
|
|
565
|
+
label: string;
|
|
566
|
+
url: string;
|
|
567
|
+
}, {
|
|
568
|
+
label: string;
|
|
569
|
+
url: string;
|
|
570
|
+
}>>;
|
|
571
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
572
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
573
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
574
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
575
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
576
|
+
}, "strip", z.ZodTypeAny, {
|
|
577
|
+
seen?: string[] | undefined;
|
|
578
|
+
clicked?: string[] | undefined;
|
|
579
|
+
dismissed?: string[] | undefined;
|
|
580
|
+
}, {
|
|
581
|
+
seen?: string[] | undefined;
|
|
582
|
+
clicked?: string[] | undefined;
|
|
583
|
+
dismissed?: string[] | undefined;
|
|
584
|
+
}>>;
|
|
585
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
586
|
+
id: z.ZodString;
|
|
587
|
+
label: z.ZodString;
|
|
588
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
589
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
590
|
+
description: z.ZodOptional<z.ZodString>;
|
|
591
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
592
|
+
product: z.ZodOptional<z.ZodString>;
|
|
593
|
+
url: z.ZodOptional<z.ZodString>;
|
|
594
|
+
image: z.ZodOptional<z.ZodString>;
|
|
595
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
596
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
597
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
598
|
+
label: z.ZodString;
|
|
599
|
+
url: z.ZodString;
|
|
600
|
+
}, "strip", z.ZodTypeAny, {
|
|
601
|
+
label: string;
|
|
602
|
+
url: string;
|
|
603
|
+
}, {
|
|
604
|
+
label: string;
|
|
605
|
+
url: string;
|
|
606
|
+
}>>;
|
|
607
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
608
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
609
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
610
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
611
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
612
|
+
}, "strip", z.ZodTypeAny, {
|
|
613
|
+
seen?: string[] | undefined;
|
|
614
|
+
clicked?: string[] | undefined;
|
|
615
|
+
dismissed?: string[] | undefined;
|
|
616
|
+
}, {
|
|
617
|
+
seen?: string[] | undefined;
|
|
618
|
+
clicked?: string[] | undefined;
|
|
619
|
+
dismissed?: string[] | undefined;
|
|
620
|
+
}>>;
|
|
621
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
622
|
+
declare const featureManifestSchema: z.ZodArray<z.ZodObject<{
|
|
623
|
+
id: z.ZodString;
|
|
624
|
+
label: z.ZodString;
|
|
625
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
626
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
627
|
+
description: z.ZodOptional<z.ZodString>;
|
|
628
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
629
|
+
product: z.ZodOptional<z.ZodString>;
|
|
630
|
+
url: z.ZodOptional<z.ZodString>;
|
|
631
|
+
image: z.ZodOptional<z.ZodString>;
|
|
632
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
633
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
634
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
635
|
+
label: z.ZodString;
|
|
636
|
+
url: z.ZodString;
|
|
637
|
+
}, "strip", z.ZodTypeAny, {
|
|
638
|
+
label: string;
|
|
639
|
+
url: string;
|
|
640
|
+
}, {
|
|
641
|
+
label: string;
|
|
642
|
+
url: string;
|
|
643
|
+
}>>;
|
|
644
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
645
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
646
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
647
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
648
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
649
|
+
}, "strip", z.ZodTypeAny, {
|
|
650
|
+
seen?: string[] | undefined;
|
|
651
|
+
clicked?: string[] | undefined;
|
|
652
|
+
dismissed?: string[] | undefined;
|
|
653
|
+
}, {
|
|
654
|
+
seen?: string[] | undefined;
|
|
655
|
+
clicked?: string[] | undefined;
|
|
656
|
+
dismissed?: string[] | undefined;
|
|
657
|
+
}>>;
|
|
658
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
659
|
+
id: z.ZodString;
|
|
660
|
+
label: z.ZodString;
|
|
661
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
662
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
663
|
+
description: z.ZodOptional<z.ZodString>;
|
|
664
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
665
|
+
product: z.ZodOptional<z.ZodString>;
|
|
666
|
+
url: z.ZodOptional<z.ZodString>;
|
|
667
|
+
image: z.ZodOptional<z.ZodString>;
|
|
668
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
669
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
670
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
671
|
+
label: z.ZodString;
|
|
672
|
+
url: z.ZodString;
|
|
673
|
+
}, "strip", z.ZodTypeAny, {
|
|
674
|
+
label: string;
|
|
675
|
+
url: string;
|
|
676
|
+
}, {
|
|
677
|
+
label: string;
|
|
678
|
+
url: string;
|
|
679
|
+
}>>;
|
|
680
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
681
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
682
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
683
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
684
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
685
|
+
}, "strip", z.ZodTypeAny, {
|
|
686
|
+
seen?: string[] | undefined;
|
|
687
|
+
clicked?: string[] | undefined;
|
|
688
|
+
dismissed?: string[] | undefined;
|
|
689
|
+
}, {
|
|
690
|
+
seen?: string[] | undefined;
|
|
691
|
+
clicked?: string[] | undefined;
|
|
692
|
+
dismissed?: string[] | undefined;
|
|
693
|
+
}>>;
|
|
694
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
695
|
+
id: z.ZodString;
|
|
696
|
+
label: z.ZodString;
|
|
697
|
+
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
698
|
+
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
699
|
+
description: z.ZodOptional<z.ZodString>;
|
|
700
|
+
flagKey: z.ZodOptional<z.ZodString>;
|
|
701
|
+
product: z.ZodOptional<z.ZodString>;
|
|
702
|
+
url: z.ZodOptional<z.ZodString>;
|
|
703
|
+
image: z.ZodOptional<z.ZodString>;
|
|
704
|
+
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
705
|
+
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
706
|
+
cta: z.ZodOptional<z.ZodObject<{
|
|
707
|
+
label: z.ZodString;
|
|
708
|
+
url: z.ZodString;
|
|
709
|
+
}, "strip", z.ZodTypeAny, {
|
|
710
|
+
label: string;
|
|
711
|
+
url: string;
|
|
712
|
+
}, {
|
|
713
|
+
label: string;
|
|
714
|
+
url: string;
|
|
715
|
+
}>>;
|
|
716
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
717
|
+
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
718
|
+
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
719
|
+
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
720
|
+
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
721
|
+
}, "strip", z.ZodTypeAny, {
|
|
722
|
+
seen?: string[] | undefined;
|
|
723
|
+
clicked?: string[] | undefined;
|
|
724
|
+
dismissed?: string[] | undefined;
|
|
725
|
+
}, {
|
|
726
|
+
seen?: string[] | undefined;
|
|
727
|
+
clicked?: string[] | undefined;
|
|
728
|
+
dismissed?: string[] | undefined;
|
|
729
|
+
}>>;
|
|
730
|
+
}, z.ZodTypeAny, "passthrough">>, "many">;
|
|
731
|
+
declare function validateManifest(data: unknown): ValidationResult;
|
|
732
|
+
|
|
733
|
+
interface ChangedFeature {
|
|
734
|
+
id: string;
|
|
735
|
+
before: FeatureEntry;
|
|
736
|
+
after: FeatureEntry;
|
|
737
|
+
changedFields: string[];
|
|
738
|
+
}
|
|
739
|
+
interface ManifestDiff {
|
|
740
|
+
added: FeatureEntry[];
|
|
741
|
+
removed: FeatureEntry[];
|
|
742
|
+
changed: ChangedFeature[];
|
|
743
|
+
}
|
|
744
|
+
declare function diffManifest(before: FeatureManifest, after: FeatureManifest): ManifestDiff;
|
|
745
|
+
interface ChangelogDiffOptions {
|
|
746
|
+
includeFieldChanges?: boolean;
|
|
747
|
+
}
|
|
748
|
+
declare function generateChangelogDiff(diff: ManifestDiff, options?: ChangelogDiffOptions): string;
|
|
749
|
+
declare function validateManifestForCI(manifest: FeatureManifest): ValidationResult;
|
|
750
|
+
|
|
751
|
+
interface CreateFlagBridgeOptions {
|
|
752
|
+
isEnabled: (flagKey: string, userContext?: UserContext) => boolean;
|
|
753
|
+
}
|
|
754
|
+
declare function createFlagBridge(options: CreateFlagBridgeOptions): FeatureFlagBridge;
|
|
755
|
+
interface LaunchDarklyClientLike {
|
|
756
|
+
variation: (flagKey: string, user: Record<string, unknown>, defaultValue: boolean) => boolean;
|
|
757
|
+
}
|
|
758
|
+
interface LaunchDarklyBridgeOptions {
|
|
759
|
+
userResolver?: (userContext?: UserContext) => Record<string, unknown>;
|
|
760
|
+
defaultValue?: boolean;
|
|
761
|
+
}
|
|
762
|
+
declare class LaunchDarklyBridge implements FeatureFlagBridge {
|
|
763
|
+
private readonly client;
|
|
764
|
+
private readonly options;
|
|
765
|
+
constructor(client: LaunchDarklyClientLike, options?: LaunchDarklyBridgeOptions);
|
|
766
|
+
isEnabled(flagKey: string, userContext?: UserContext): boolean;
|
|
767
|
+
}
|
|
768
|
+
interface PostHogClientLike {
|
|
769
|
+
isFeatureEnabled: (flagKey: string, distinctId?: string, groups?: Record<string, string>, personProperties?: Record<string, unknown>) => boolean;
|
|
770
|
+
}
|
|
771
|
+
interface PostHogBridgeOptions {
|
|
772
|
+
distinctIdResolver?: (userContext?: UserContext) => string | undefined;
|
|
773
|
+
groupsResolver?: (userContext?: UserContext) => Record<string, string> | undefined;
|
|
774
|
+
}
|
|
775
|
+
declare class PostHogBridge implements FeatureFlagBridge {
|
|
776
|
+
private readonly client;
|
|
777
|
+
private readonly options;
|
|
778
|
+
constructor(client: PostHogClientLike, options?: PostHogBridgeOptions);
|
|
779
|
+
isEnabled(flagKey: string, userContext?: UserContext): boolean;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
interface ManifestEditorProps {
|
|
783
|
+
features: readonly FeatureEntry[];
|
|
784
|
+
onSave: (updated: FeatureEntry[]) => Promise<void> | void;
|
|
785
|
+
readOnly?: boolean;
|
|
786
|
+
children?: ReactNode;
|
|
787
|
+
}
|
|
788
|
+
declare function ManifestEditor({ features, onSave, readOnly, children, }: ManifestEditorProps): react_jsx_runtime.JSX.Element;
|
|
789
|
+
interface ScheduleCalendarProps {
|
|
790
|
+
features: readonly FeatureEntry[];
|
|
791
|
+
onSchedule: (featureId: string, publishAt: string) => Promise<void> | void;
|
|
792
|
+
}
|
|
793
|
+
declare function ScheduleCalendar({ features, onSchedule }: ScheduleCalendarProps): react_jsx_runtime.JSX.Element;
|
|
794
|
+
interface PreviewPanelProps {
|
|
795
|
+
feature?: FeatureEntry | null;
|
|
796
|
+
components?: Array<"badge" | "changelog" | "spotlight" | "banner" | "toast">;
|
|
797
|
+
}
|
|
798
|
+
declare function PreviewPanel({ feature, components }: PreviewPanelProps): react_jsx_runtime.JSX.Element;
|
|
799
|
+
interface AudienceBuilderProps {
|
|
800
|
+
segments?: string[];
|
|
801
|
+
roles?: string[];
|
|
802
|
+
regions?: string[];
|
|
803
|
+
value?: AudienceRule;
|
|
804
|
+
onChange?: (audience: AudienceRule) => void;
|
|
805
|
+
onSave?: (audience: AudienceRule) => Promise<void> | void;
|
|
806
|
+
}
|
|
807
|
+
declare function AudienceBuilder({ segments, roles, regions, value, onChange, onSave, }: AudienceBuilderProps): react_jsx_runtime.JSX.Element;
|
|
808
|
+
|
|
809
|
+
type CMSFieldResolver = string | ((record: unknown) => unknown);
|
|
810
|
+
interface CMSFieldMapping {
|
|
811
|
+
id?: CMSFieldResolver;
|
|
812
|
+
label?: CMSFieldResolver;
|
|
813
|
+
description?: CMSFieldResolver;
|
|
814
|
+
releasedAt?: CMSFieldResolver;
|
|
815
|
+
showNewUntil?: CMSFieldResolver;
|
|
816
|
+
sidebarKey?: CMSFieldResolver;
|
|
817
|
+
category?: CMSFieldResolver;
|
|
818
|
+
product?: CMSFieldResolver;
|
|
819
|
+
flagKey?: CMSFieldResolver;
|
|
820
|
+
url?: CMSFieldResolver;
|
|
821
|
+
image?: CMSFieldResolver;
|
|
822
|
+
publishAt?: CMSFieldResolver;
|
|
823
|
+
type?: CMSFieldResolver;
|
|
824
|
+
priority?: CMSFieldResolver;
|
|
825
|
+
ctaLabel?: CMSFieldResolver;
|
|
826
|
+
ctaUrl?: CMSFieldResolver;
|
|
827
|
+
}
|
|
828
|
+
interface CMSAdapter {
|
|
829
|
+
load: () => Promise<FeatureEntry[]>;
|
|
830
|
+
}
|
|
831
|
+
interface CMSAdapterBaseOptions {
|
|
832
|
+
fieldMapping?: CMSFieldMapping;
|
|
833
|
+
/** Throw when mapped entries are invalid. Default false (invalid entries are dropped). */
|
|
834
|
+
strictValidation?: boolean;
|
|
835
|
+
}
|
|
836
|
+
interface ContentfulAdapterOptions extends CMSAdapterBaseOptions {
|
|
837
|
+
spaceId: string;
|
|
838
|
+
accessToken: string;
|
|
839
|
+
contentType: string;
|
|
840
|
+
environment?: string;
|
|
841
|
+
locale?: string;
|
|
842
|
+
limit?: number;
|
|
843
|
+
}
|
|
844
|
+
interface SanityAdapterOptions extends CMSAdapterBaseOptions {
|
|
845
|
+
projectId: string;
|
|
846
|
+
dataset: string;
|
|
847
|
+
query: string;
|
|
848
|
+
token?: string;
|
|
849
|
+
apiVersion?: string;
|
|
850
|
+
}
|
|
851
|
+
interface StrapiAdapterOptions extends CMSAdapterBaseOptions {
|
|
852
|
+
baseUrl: string;
|
|
853
|
+
endpoint?: string;
|
|
854
|
+
token?: string;
|
|
855
|
+
query?: string;
|
|
856
|
+
}
|
|
857
|
+
interface NotionAdapterOptions extends CMSAdapterBaseOptions {
|
|
858
|
+
databaseId: string;
|
|
859
|
+
token: string;
|
|
860
|
+
notionVersion?: string;
|
|
861
|
+
filter?: Record<string, unknown>;
|
|
862
|
+
sorts?: Array<Record<string, unknown>>;
|
|
863
|
+
}
|
|
864
|
+
interface MarkdownAdapterFile {
|
|
865
|
+
source?: string;
|
|
866
|
+
markdown: string;
|
|
867
|
+
}
|
|
868
|
+
interface MarkdownAdapterOptions extends CMSAdapterBaseOptions {
|
|
869
|
+
pattern?: string;
|
|
870
|
+
cwd?: string;
|
|
871
|
+
entries?: MarkdownAdapterFile[];
|
|
872
|
+
}
|
|
873
|
+
declare class ContentfulAdapter implements CMSAdapter {
|
|
874
|
+
private readonly options;
|
|
875
|
+
constructor(options: ContentfulAdapterOptions);
|
|
876
|
+
load(): Promise<FeatureEntry[]>;
|
|
877
|
+
}
|
|
878
|
+
declare class SanityAdapter implements CMSAdapter {
|
|
879
|
+
private readonly options;
|
|
880
|
+
constructor(options: SanityAdapterOptions);
|
|
881
|
+
load(): Promise<FeatureEntry[]>;
|
|
882
|
+
}
|
|
883
|
+
declare class StrapiAdapter implements CMSAdapter {
|
|
884
|
+
private readonly options;
|
|
885
|
+
constructor(options: StrapiAdapterOptions);
|
|
886
|
+
load(): Promise<FeatureEntry[]>;
|
|
887
|
+
}
|
|
888
|
+
declare class NotionAdapter implements CMSAdapter {
|
|
889
|
+
private readonly options;
|
|
890
|
+
constructor(options: NotionAdapterOptions);
|
|
891
|
+
load(): Promise<FeatureEntry[]>;
|
|
892
|
+
}
|
|
893
|
+
declare class MarkdownAdapter implements CMSAdapter {
|
|
894
|
+
private readonly options;
|
|
895
|
+
constructor(options?: MarkdownAdapterOptions);
|
|
896
|
+
load(): Promise<FeatureEntry[]>;
|
|
897
|
+
}
|
|
898
|
+
|
|
288
899
|
interface FeatureDropTheme {
|
|
289
900
|
colors: {
|
|
290
901
|
primary: string;
|
|
@@ -357,6 +968,7 @@ interface FeatureDropTranslations {
|
|
|
357
968
|
loadMore: string;
|
|
358
969
|
share: string;
|
|
359
970
|
skipToEntries: string;
|
|
971
|
+
newFeatureCount: (count: number) => string;
|
|
360
972
|
stepOf: (current: number, total: number) => string;
|
|
361
973
|
back: string;
|
|
362
974
|
next: string;
|
|
@@ -371,11 +983,31 @@ interface FeatureDropTranslations {
|
|
|
371
983
|
cancel: string;
|
|
372
984
|
askLater: string;
|
|
373
985
|
}
|
|
986
|
+
declare function resolveLocale(locale?: string): string;
|
|
987
|
+
declare function getLocaleDirection(locale?: string): "ltr" | "rtl";
|
|
988
|
+
declare function formatDateForLocale(value: string | number | Date, locale?: string, options?: Intl.DateTimeFormatOptions): string;
|
|
989
|
+
declare function formatRelativeTimeForLocale(value: string | number | Date, locale?: string, options?: {
|
|
990
|
+
now?: string | number | Date;
|
|
991
|
+
numeric?: Intl.RelativeTimeFormatNumeric;
|
|
992
|
+
style?: Intl.RelativeTimeFormatStyle;
|
|
993
|
+
}): string;
|
|
374
994
|
declare function resolveTranslations(locale?: string, overrides?: Partial<FeatureDropTranslations>): FeatureDropTranslations;
|
|
375
995
|
declare const FEATUREDROP_TRANSLATIONS: {
|
|
376
996
|
readonly en: FeatureDropTranslations;
|
|
377
997
|
};
|
|
378
998
|
|
|
999
|
+
declare const FEATUREDROP_ANIMATION_PRESETS: readonly ["none", "subtle", "normal", "playful"];
|
|
1000
|
+
declare function resolveAnimationPreset(preset?: FeatureDropAnimationPreset, options?: {
|
|
1001
|
+
reducedMotion?: boolean;
|
|
1002
|
+
}): FeatureDropAnimationPreset;
|
|
1003
|
+
type AnimationSurface = "toast" | "panel" | "modal" | "popover";
|
|
1004
|
+
type AnimationPhase = "enter" | "exit";
|
|
1005
|
+
type PulseSurface = "dot" | "beacon";
|
|
1006
|
+
declare function getEnterAnimation(preset: FeatureDropAnimationPreset, surface: AnimationSurface): string | undefined;
|
|
1007
|
+
declare function getExitAnimation(preset: FeatureDropAnimationPreset, surface: AnimationSurface): string | undefined;
|
|
1008
|
+
declare function getPulseAnimation(preset: FeatureDropAnimationPreset, surface?: PulseSurface): string | undefined;
|
|
1009
|
+
declare function getAnimationDurationMs(preset: FeatureDropAnimationPreset, surface: AnimationSurface, phase: AnimationPhase): number;
|
|
1010
|
+
|
|
379
1011
|
/**
|
|
380
1012
|
* Generate a simple RSS 2.0 feed from a feature manifest.
|
|
381
1013
|
* Titles and descriptions are sanitized via `parseDescription`.
|
|
@@ -547,206 +1179,6 @@ interface DoctorReport {
|
|
|
547
1179
|
}
|
|
548
1180
|
declare function runDoctor(entries: FeatureEntry[], now?: Date): DoctorReport;
|
|
549
1181
|
|
|
550
|
-
interface ValidationIssue {
|
|
551
|
-
path: string;
|
|
552
|
-
message: string;
|
|
553
|
-
code: "invalid_type" | "missing_required" | "invalid_value" | "invalid_date" | "duplicate_id" | "circular_dependency";
|
|
554
|
-
}
|
|
555
|
-
interface ValidationResult {
|
|
556
|
-
valid: boolean;
|
|
557
|
-
errors: ValidationIssue[];
|
|
558
|
-
}
|
|
559
|
-
declare const featureEntryJsonSchema: {
|
|
560
|
-
readonly type: "object";
|
|
561
|
-
readonly required: readonly ["id", "label", "releasedAt", "showNewUntil"];
|
|
562
|
-
readonly properties: {
|
|
563
|
-
readonly id: {
|
|
564
|
-
readonly type: "string";
|
|
565
|
-
};
|
|
566
|
-
readonly label: {
|
|
567
|
-
readonly type: "string";
|
|
568
|
-
};
|
|
569
|
-
readonly description: {
|
|
570
|
-
readonly type: "string";
|
|
571
|
-
};
|
|
572
|
-
readonly releasedAt: {
|
|
573
|
-
readonly type: "string";
|
|
574
|
-
readonly format: "date-time";
|
|
575
|
-
};
|
|
576
|
-
readonly showNewUntil: {
|
|
577
|
-
readonly type: "string";
|
|
578
|
-
readonly format: "date-time";
|
|
579
|
-
};
|
|
580
|
-
readonly type: {
|
|
581
|
-
readonly enum: readonly ["feature", "improvement", "fix", "breaking"];
|
|
582
|
-
};
|
|
583
|
-
readonly priority: {
|
|
584
|
-
readonly enum: readonly ["critical", "normal", "low"];
|
|
585
|
-
};
|
|
586
|
-
};
|
|
587
|
-
};
|
|
588
|
-
declare const featureManifestJsonSchema: {
|
|
589
|
-
readonly type: "array";
|
|
590
|
-
readonly items: {
|
|
591
|
-
readonly type: "object";
|
|
592
|
-
readonly required: readonly ["id", "label", "releasedAt", "showNewUntil"];
|
|
593
|
-
readonly properties: {
|
|
594
|
-
readonly id: {
|
|
595
|
-
readonly type: "string";
|
|
596
|
-
};
|
|
597
|
-
readonly label: {
|
|
598
|
-
readonly type: "string";
|
|
599
|
-
};
|
|
600
|
-
readonly description: {
|
|
601
|
-
readonly type: "string";
|
|
602
|
-
};
|
|
603
|
-
readonly releasedAt: {
|
|
604
|
-
readonly type: "string";
|
|
605
|
-
readonly format: "date-time";
|
|
606
|
-
};
|
|
607
|
-
readonly showNewUntil: {
|
|
608
|
-
readonly type: "string";
|
|
609
|
-
readonly format: "date-time";
|
|
610
|
-
};
|
|
611
|
-
readonly type: {
|
|
612
|
-
readonly enum: readonly ["feature", "improvement", "fix", "breaking"];
|
|
613
|
-
};
|
|
614
|
-
readonly priority: {
|
|
615
|
-
readonly enum: readonly ["critical", "normal", "low"];
|
|
616
|
-
};
|
|
617
|
-
};
|
|
618
|
-
};
|
|
619
|
-
};
|
|
620
|
-
declare const featureEntrySchema: z.ZodObject<{
|
|
621
|
-
id: z.ZodString;
|
|
622
|
-
label: z.ZodString;
|
|
623
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
624
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
625
|
-
description: z.ZodOptional<z.ZodString>;
|
|
626
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
627
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
628
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
629
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
630
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
631
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
632
|
-
}, "strip", z.ZodTypeAny, {
|
|
633
|
-
seen?: string[] | undefined;
|
|
634
|
-
clicked?: string[] | undefined;
|
|
635
|
-
dismissed?: string[] | undefined;
|
|
636
|
-
}, {
|
|
637
|
-
seen?: string[] | undefined;
|
|
638
|
-
clicked?: string[] | undefined;
|
|
639
|
-
dismissed?: string[] | undefined;
|
|
640
|
-
}>>;
|
|
641
|
-
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
642
|
-
id: z.ZodString;
|
|
643
|
-
label: z.ZodString;
|
|
644
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
645
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
646
|
-
description: z.ZodOptional<z.ZodString>;
|
|
647
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
648
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
649
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
650
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
651
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
652
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
653
|
-
}, "strip", z.ZodTypeAny, {
|
|
654
|
-
seen?: string[] | undefined;
|
|
655
|
-
clicked?: string[] | undefined;
|
|
656
|
-
dismissed?: string[] | undefined;
|
|
657
|
-
}, {
|
|
658
|
-
seen?: string[] | undefined;
|
|
659
|
-
clicked?: string[] | undefined;
|
|
660
|
-
dismissed?: string[] | undefined;
|
|
661
|
-
}>>;
|
|
662
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
663
|
-
id: z.ZodString;
|
|
664
|
-
label: z.ZodString;
|
|
665
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
666
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
667
|
-
description: z.ZodOptional<z.ZodString>;
|
|
668
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
669
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
670
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
671
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
672
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
673
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
674
|
-
}, "strip", z.ZodTypeAny, {
|
|
675
|
-
seen?: string[] | undefined;
|
|
676
|
-
clicked?: string[] | undefined;
|
|
677
|
-
dismissed?: string[] | undefined;
|
|
678
|
-
}, {
|
|
679
|
-
seen?: string[] | undefined;
|
|
680
|
-
clicked?: string[] | undefined;
|
|
681
|
-
dismissed?: string[] | undefined;
|
|
682
|
-
}>>;
|
|
683
|
-
}, z.ZodTypeAny, "passthrough">>;
|
|
684
|
-
declare const featureManifestSchema: z.ZodArray<z.ZodObject<{
|
|
685
|
-
id: z.ZodString;
|
|
686
|
-
label: z.ZodString;
|
|
687
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
688
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
689
|
-
description: z.ZodOptional<z.ZodString>;
|
|
690
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
691
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
692
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
693
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
694
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
695
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
696
|
-
}, "strip", z.ZodTypeAny, {
|
|
697
|
-
seen?: string[] | undefined;
|
|
698
|
-
clicked?: string[] | undefined;
|
|
699
|
-
dismissed?: string[] | undefined;
|
|
700
|
-
}, {
|
|
701
|
-
seen?: string[] | undefined;
|
|
702
|
-
clicked?: string[] | undefined;
|
|
703
|
-
dismissed?: string[] | undefined;
|
|
704
|
-
}>>;
|
|
705
|
-
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
706
|
-
id: z.ZodString;
|
|
707
|
-
label: z.ZodString;
|
|
708
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
709
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
710
|
-
description: z.ZodOptional<z.ZodString>;
|
|
711
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
712
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
713
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
714
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
715
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
716
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
717
|
-
}, "strip", z.ZodTypeAny, {
|
|
718
|
-
seen?: string[] | undefined;
|
|
719
|
-
clicked?: string[] | undefined;
|
|
720
|
-
dismissed?: string[] | undefined;
|
|
721
|
-
}, {
|
|
722
|
-
seen?: string[] | undefined;
|
|
723
|
-
clicked?: string[] | undefined;
|
|
724
|
-
dismissed?: string[] | undefined;
|
|
725
|
-
}>>;
|
|
726
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
727
|
-
id: z.ZodString;
|
|
728
|
-
label: z.ZodString;
|
|
729
|
-
releasedAt: z.ZodEffects<z.ZodString, string, string>;
|
|
730
|
-
showNewUntil: z.ZodEffects<z.ZodString, string, string>;
|
|
731
|
-
description: z.ZodOptional<z.ZodString>;
|
|
732
|
-
type: z.ZodOptional<z.ZodEnum<["feature", "improvement", "fix", "breaking"]>>;
|
|
733
|
-
priority: z.ZodOptional<z.ZodEnum<["critical", "normal", "low"]>>;
|
|
734
|
-
dependsOn: z.ZodOptional<z.ZodObject<{
|
|
735
|
-
seen: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
736
|
-
clicked: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
737
|
-
dismissed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
738
|
-
}, "strip", z.ZodTypeAny, {
|
|
739
|
-
seen?: string[] | undefined;
|
|
740
|
-
clicked?: string[] | undefined;
|
|
741
|
-
dismissed?: string[] | undefined;
|
|
742
|
-
}, {
|
|
743
|
-
seen?: string[] | undefined;
|
|
744
|
-
clicked?: string[] | undefined;
|
|
745
|
-
dismissed?: string[] | undefined;
|
|
746
|
-
}>>;
|
|
747
|
-
}, z.ZodTypeAny, "passthrough">>, "many">;
|
|
748
|
-
declare function validateManifest(data: unknown): ValidationResult;
|
|
749
|
-
|
|
750
1182
|
interface LocalStorageAdapterOptions {
|
|
751
1183
|
/** Key prefix for localStorage entries. Default: "featuredrop" */
|
|
752
1184
|
prefix?: string;
|
|
@@ -777,6 +1209,65 @@ declare class LocalStorageAdapter implements StorageAdapter {
|
|
|
777
1209
|
dismissAll(now: Date): Promise<void>;
|
|
778
1210
|
}
|
|
779
1211
|
|
|
1212
|
+
interface IndexedDBAdapterOptions {
|
|
1213
|
+
prefix?: string;
|
|
1214
|
+
watermark?: string | null;
|
|
1215
|
+
dbName?: string;
|
|
1216
|
+
storeName?: string;
|
|
1217
|
+
onDismissAll?: (now: Date) => Promise<void>;
|
|
1218
|
+
/** Optional remote state fetch for offline-first sync reconciliation. */
|
|
1219
|
+
onSyncState?: () => Promise<{
|
|
1220
|
+
watermark?: string | null;
|
|
1221
|
+
dismissedIds?: string[];
|
|
1222
|
+
}>;
|
|
1223
|
+
/** Optional remote flush for queued single-dismiss operations. */
|
|
1224
|
+
onFlushDismissBatch?: (ids: string[]) => Promise<void>;
|
|
1225
|
+
/** Optional remote flush for queued dismiss-all operations. */
|
|
1226
|
+
onFlushDismissAll?: (watermark: string) => Promise<void>;
|
|
1227
|
+
/** Delay before queued operations are flushed. Default: 500ms. */
|
|
1228
|
+
flushDebounceMs?: number;
|
|
1229
|
+
/** Attach online/visibility listeners to trigger sync+flush. Default: true in browser. */
|
|
1230
|
+
autoSyncOnOnline?: boolean;
|
|
1231
|
+
}
|
|
1232
|
+
declare class IndexedDBAdapter implements StorageAdapter {
|
|
1233
|
+
private readonly prefix;
|
|
1234
|
+
private readonly dbName;
|
|
1235
|
+
private readonly storeName;
|
|
1236
|
+
private readonly onDismissAllCallback?;
|
|
1237
|
+
private readonly onSyncStateCallback?;
|
|
1238
|
+
private readonly onFlushDismissBatchCallback?;
|
|
1239
|
+
private readonly onFlushDismissAllCallback?;
|
|
1240
|
+
private readonly flushDebounceMs;
|
|
1241
|
+
private readonly autoSyncOnOnline;
|
|
1242
|
+
private watermark;
|
|
1243
|
+
private dismissed;
|
|
1244
|
+
private queue;
|
|
1245
|
+
private readonly hydratePromise;
|
|
1246
|
+
private flushTimer;
|
|
1247
|
+
private flushing;
|
|
1248
|
+
private readonly boundOnlineHandler;
|
|
1249
|
+
private readonly boundVisibilityHandler;
|
|
1250
|
+
constructor(options?: IndexedDBAdapterOptions);
|
|
1251
|
+
getWatermark(): string | null;
|
|
1252
|
+
getDismissedIds(): ReadonlySet<string>;
|
|
1253
|
+
dismiss(id: string): void;
|
|
1254
|
+
dismissAll(now: Date): Promise<void>;
|
|
1255
|
+
/** Flush queued dismiss operations to optional remote callbacks. */
|
|
1256
|
+
flushQueue(): Promise<void>;
|
|
1257
|
+
/** Merge local state with optional remote source, then flush queued writes. */
|
|
1258
|
+
syncFromRemote(): Promise<void>;
|
|
1259
|
+
/** Cleanup optional browser listeners. */
|
|
1260
|
+
destroy(): void;
|
|
1261
|
+
private persist;
|
|
1262
|
+
private hydrateFromIndexedDB;
|
|
1263
|
+
private readIndexedDBState;
|
|
1264
|
+
private writeIndexedDBState;
|
|
1265
|
+
private openDb;
|
|
1266
|
+
private scheduleFlush;
|
|
1267
|
+
private getLastDismissAll;
|
|
1268
|
+
private collectDismissBatch;
|
|
1269
|
+
}
|
|
1270
|
+
|
|
780
1271
|
/**
|
|
781
1272
|
* In-memory storage adapter.
|
|
782
1273
|
*
|
|
@@ -808,6 +1299,18 @@ interface RemoteAdapterOptions {
|
|
|
808
1299
|
format?: "rest";
|
|
809
1300
|
/** Optional user identifier to pass to state endpoint */
|
|
810
1301
|
userId?: string;
|
|
1302
|
+
/** Number of retries after the initial request (default: 3) */
|
|
1303
|
+
retryAttempts?: number;
|
|
1304
|
+
/** Base backoff delay used between retries (default: 250ms) */
|
|
1305
|
+
retryBaseDelayMs?: number;
|
|
1306
|
+
/** Consecutive failed operations before opening the circuit (default: 5) */
|
|
1307
|
+
circuitBreakerThreshold?: number;
|
|
1308
|
+
/** Cooldown period while the circuit is open (default: 60s) */
|
|
1309
|
+
circuitBreakerCooldownMs?: number;
|
|
1310
|
+
/** Optional sleep function override for test environments */
|
|
1311
|
+
sleep?: (delayMs: number) => Promise<void>;
|
|
1312
|
+
/** Optional timestamp function override for test environments */
|
|
1313
|
+
now?: () => number;
|
|
811
1314
|
}
|
|
812
1315
|
declare class RemoteAdapter implements StorageAdapter {
|
|
813
1316
|
private readonly baseUrl;
|
|
@@ -818,6 +1321,14 @@ declare class RemoteAdapter implements StorageAdapter {
|
|
|
818
1321
|
private watermark;
|
|
819
1322
|
private lastManifest;
|
|
820
1323
|
private lastFetchTs;
|
|
1324
|
+
private readonly retryAttempts;
|
|
1325
|
+
private readonly retryBaseDelayMs;
|
|
1326
|
+
private readonly circuitBreakerThreshold;
|
|
1327
|
+
private readonly circuitBreakerCooldownMs;
|
|
1328
|
+
private readonly sleep;
|
|
1329
|
+
private readonly now;
|
|
1330
|
+
private consecutiveFailures;
|
|
1331
|
+
private circuitOpenUntil;
|
|
821
1332
|
constructor(options: RemoteAdapterOptions);
|
|
822
1333
|
/** Fetch manifest with stale-while-revalidate */
|
|
823
1334
|
fetchManifest(force?: boolean): Promise<FeatureManifest>;
|
|
@@ -827,8 +1338,14 @@ declare class RemoteAdapter implements StorageAdapter {
|
|
|
827
1338
|
getDismissedIds(): ReadonlySet<string>;
|
|
828
1339
|
dismiss(id: string): void;
|
|
829
1340
|
dismissAll(now: Date): Promise<void>;
|
|
1341
|
+
/** Returns current adapter health; false while circuit breaker is open. */
|
|
1342
|
+
isHealthy(): Promise<boolean>;
|
|
830
1343
|
private flushDismiss;
|
|
831
1344
|
private flushDismissAll;
|
|
1345
|
+
private isCircuitOpen;
|
|
1346
|
+
private markFailure;
|
|
1347
|
+
private markSuccess;
|
|
1348
|
+
private withRetry;
|
|
832
1349
|
}
|
|
833
1350
|
|
|
834
1351
|
interface QueryResultRow {
|
|
@@ -930,6 +1447,14 @@ interface HybridAdapterOptions {
|
|
|
930
1447
|
remote: ServerStorageAdapter;
|
|
931
1448
|
/** If true, sync from remote before writes. Default false */
|
|
932
1449
|
syncBeforeWrite?: boolean;
|
|
1450
|
+
/** Batch window for queued dismiss writes. Default: 500ms */
|
|
1451
|
+
dismissBatchWindowMs?: number;
|
|
1452
|
+
/** Optional periodic sync interval in ms. Default: disabled (0) */
|
|
1453
|
+
syncIntervalMs?: number;
|
|
1454
|
+
/** Sync on browser visibility return. Default: true */
|
|
1455
|
+
syncOnVisibilityChange?: boolean;
|
|
1456
|
+
/** Sync on browser online event. Default: true */
|
|
1457
|
+
syncOnOnline?: boolean;
|
|
933
1458
|
}
|
|
934
1459
|
/**
|
|
935
1460
|
* Hybrid adapter that combines local immediacy with remote persistence.
|
|
@@ -939,6 +1464,15 @@ declare class HybridAdapter implements ServerStorageAdapter {
|
|
|
939
1464
|
private readonly local;
|
|
940
1465
|
private readonly remote;
|
|
941
1466
|
private readonly syncBeforeWrite;
|
|
1467
|
+
private readonly dismissBatchWindowMs;
|
|
1468
|
+
private readonly syncIntervalMs;
|
|
1469
|
+
private readonly syncOnVisibilityChange;
|
|
1470
|
+
private readonly syncOnOnline;
|
|
1471
|
+
private pendingDismissIds;
|
|
1472
|
+
private dismissTimer;
|
|
1473
|
+
private syncTimer;
|
|
1474
|
+
private readonly boundVisibilityHandler;
|
|
1475
|
+
private readonly boundOnlineHandler;
|
|
942
1476
|
constructor(options: HybridAdapterOptions);
|
|
943
1477
|
getWatermark(): string | null;
|
|
944
1478
|
getDismissedIds(): ReadonlySet<string>;
|
|
@@ -950,6 +1484,9 @@ declare class HybridAdapter implements ServerStorageAdapter {
|
|
|
950
1484
|
getBulkState(userIds: string[]): Promise<Map<string, DismissalState>>;
|
|
951
1485
|
isHealthy(): Promise<boolean>;
|
|
952
1486
|
destroy(): Promise<void>;
|
|
1487
|
+
/** Manually flush queued dismiss operations to the remote adapter. */
|
|
1488
|
+
flushPendingDismisses(): Promise<void>;
|
|
1489
|
+
private scheduleDismissFlush;
|
|
953
1490
|
}
|
|
954
1491
|
|
|
955
1492
|
interface MySQLRow {
|
|
@@ -1139,4 +1676,4 @@ declare class SupabaseAdapter implements ServerStorageAdapter {
|
|
|
1139
1676
|
private setupRealtime;
|
|
1140
1677
|
}
|
|
1141
1678
|
|
|
1142
|
-
export { type AdoptionEvent, type AdoptionEventInput, type AdoptionEventType, type AdoptionMetrics, AmplitudeAdapter, type AnalyticsAdapter, type AnalyticsCallbacks, AnalyticsCollector, type AnalyticsCollectorOptions, type AudienceMatchFn, type AudienceRule, CustomAdapter, type DismissalState, FEATUREDROP_THEMES, FEATUREDROP_TRANSLATIONS, type FeatureCTA, type FeatureDependencies, type FeatureDependencyState, type FeatureDropTheme, type FeatureDropThemeInput, type FeatureDropThemeOverrides, type FeatureDropThemePreset, type FeatureDropTranslations, type FeatureEngagementMetrics, type FeatureEntry, type FeatureManifest, type FeaturePriority, type FeatureTrigger, type FeatureType, type FeatureVariant, HybridAdapter, type HybridAdapterOptions, LocalStorageAdapter, type LocalStorageAdapterOptions, MemoryAdapter, MixpanelAdapter, MongoAdapter, type MongoAdapterOptions, type MongoLikeCollection, MySQLAdapter, type MySQLAdapterOptions, type MySQLQueryFn, type MySQLQueryResult, PostHogAdapter, PostgresAdapter, type PostgresAdapterOptions, type PostgresQueryFn, type PostgresQueryResult, RedisAdapter, type RedisAdapterOptions, type RedisLikeClient, type RedisLikePipeline, RemoteAdapter, type RemoteAdapterOptions, SQLiteAdapter, type SQLiteAdapterOptions, type SQLiteQueryFn, type SQLiteQueryResult, SegmentAdapter, type ServerStorageAdapter, type StorageAdapter, SupabaseAdapter, type SupabaseAdapterOptions, type SupabaseClientLike, type SupabaseRealtimeChannelLike, type ThrottleOptions, type ThrottleResult, type ThrottleRuntimeState, type TriggerContext, TriggerEngine, type UserContext, type ValidationIssue, type ValidationResult, applyAnnouncementThrottle, applyFeatureVariant, applyFeatureVariants, computeManifestStats, createAdoptionMetrics, createManifest, createTheme, featureEntryJsonSchema, featureEntrySchema, featureManifestJsonSchema, featureManifestSchema, generateMarkdownChangelog, generateRSS, getFeatureById, getFeatureVariantName, getNewFeatureCount, getNewFeatures, getNewFeaturesByCategory, getNewFeaturesSorted, getOrCreateVariantKey, hasDependencyCycle, hasNewFeature, isNew, isTriggerMatch, matchesAudience, parseDescription, resolveDependencyOrder, resolveTheme, resolveTranslations, runDoctor, sortFeaturesByDependencies, themeToCSSVariables, validateManifest };
|
|
1679
|
+
export { type AdoptionEvent, type AdoptionEventInput, type AdoptionEventType, type AdoptionMetrics, AmplitudeAdapter, type AnalyticsAdapter, type AnalyticsCallbacks, AnalyticsCollector, type AnalyticsCollectorOptions, AudienceBuilder, type AudienceBuilderProps, type AudienceMatchFn, type AudienceRule, type CMSAdapter, type CMSFieldMapping, type ChangedFeature, type ChangelogDiffOptions, type ChangelogRenderer, type ChangelogRendererActions, type ChangelogRendererComputed, type ChangelogRendererOptions, type ChangelogRendererState, ContentfulAdapter, type CreateFlagBridgeOptions, CustomAdapter, DiscordBridge, type DiscordBridgeOptions, type DismissalState, EmailDigestGenerator, type EmailDigestGeneratorOptions, FEATUREDROP_ANIMATION_PRESETS, FEATUREDROP_THEMES, FEATUREDROP_TRANSLATIONS, type FeatureCTA, type FeatureDependencies, type FeatureDependencyState, type FeatureDropAnimationPreset, type FeatureDropTheme, type FeatureDropThemeInput, type FeatureDropThemeOverrides, type FeatureDropThemePreset, type FeatureDropTranslations, type FeatureEngagementMetrics, type FeatureEntry, type FeatureFlagBridge, type FeatureManifest, type FeaturePriority, type FeatureTrigger, type FeatureType, type FeatureVariant, HybridAdapter, type HybridAdapterOptions, IndexedDBAdapter, type IndexedDBAdapterOptions, LaunchDarklyBridge, type LaunchDarklyBridgeOptions, type LaunchDarklyClientLike, LocalStorageAdapter, type LocalStorageAdapterOptions, type ManifestDiff, ManifestEditor, type ManifestEditorProps, MarkdownAdapter, MemoryAdapter, MixpanelAdapter, MongoAdapter, type MongoAdapterOptions, type MongoLikeCollection, MySQLAdapter, type MySQLAdapterOptions, type MySQLQueryFn, type MySQLQueryResult, NotionAdapter, PostHogAdapter, PostHogBridge, type PostHogBridgeOptions, type PostHogClientLike, PostgresAdapter, type PostgresAdapterOptions, type PostgresQueryFn, type PostgresQueryResult, PreviewPanel, type PreviewPanelProps, RSSFeedGenerator, type RSSFeedGeneratorOptions, RedisAdapter, type RedisAdapterOptions, type RedisLikeClient, type RedisLikePipeline, RemoteAdapter, type RemoteAdapterOptions, SQLiteAdapter, type SQLiteAdapterOptions, type SQLiteQueryFn, type SQLiteQueryResult, SanityAdapter, ScheduleCalendar, type ScheduleCalendarProps, SegmentAdapter, type ServerStorageAdapter, SlackBridge, type SlackBridgeOptions, type StorageAdapter, StrapiAdapter, SupabaseAdapter, type SupabaseAdapterOptions, type SupabaseClientLike, type SupabaseRealtimeChannelLike, type ThrottleOptions, type ThrottleResult, type ThrottleRuntimeState, type TriggerContext, TriggerEngine, type UserContext, type ValidationIssue, type ValidationResult, WebhookBridge, type WebhookBridgeOptions, applyAnnouncementThrottle, applyFeatureVariant, applyFeatureVariants, computeManifestStats, createAdoptionMetrics, createChangelogRenderer, createFlagBridge, createManifest, createTheme, diffManifest, featureEntryJsonSchema, featureEntrySchema, featureManifestJsonSchema, featureManifestSchema, formatDateForLocale, formatRelativeTimeForLocale, generateChangelogDiff, generateMarkdownChangelog, generateRSS, getAnimationDurationMs, getEnterAnimation, getExitAnimation, getFeatureById, getFeatureVariantName, getLocaleDirection, getNewFeatureCount, getNewFeatures, getNewFeaturesByCategory, getNewFeaturesSorted, getOrCreateVariantKey, getPulseAnimation, hasDependencyCycle, hasNewFeature, isNew, isTriggerMatch, matchesAudience, parseDescription, resolveAnimationPreset, resolveDependencyOrder, resolveLocale, resolveTheme, resolveTranslations, runDoctor, sortFeaturesByDependencies, themeToCSSVariables, validateManifest, validateManifestForCI };
|