@dr-sentry/react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +258 -0
  2. package/dist/cjs/client.d.ts +121 -0
  3. package/dist/cjs/client.d.ts.map +1 -0
  4. package/dist/cjs/client.js +483 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/context.d.ts +10 -0
  7. package/dist/cjs/context.d.ts.map +1 -0
  8. package/dist/cjs/context.js +14 -0
  9. package/dist/cjs/context.js.map +1 -0
  10. package/dist/cjs/hooks.d.ts +86 -0
  11. package/dist/cjs/hooks.d.ts.map +1 -0
  12. package/dist/cjs/hooks.js +186 -0
  13. package/dist/cjs/hooks.js.map +1 -0
  14. package/dist/cjs/index.d.ts +7 -0
  15. package/dist/cjs/index.d.ts.map +1 -0
  16. package/dist/cjs/index.js +23 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/local-evaluator.d.ts +12 -0
  19. package/dist/cjs/local-evaluator.d.ts.map +1 -0
  20. package/dist/cjs/local-evaluator.js +44 -0
  21. package/dist/cjs/local-evaluator.js.map +1 -0
  22. package/dist/cjs/package.json +1 -0
  23. package/dist/cjs/provider.d.ts +24 -0
  24. package/dist/cjs/provider.d.ts.map +1 -0
  25. package/dist/cjs/provider.js +97 -0
  26. package/dist/cjs/provider.js.map +1 -0
  27. package/dist/cjs/types.d.ts +163 -0
  28. package/dist/cjs/types.d.ts.map +1 -0
  29. package/dist/cjs/types.js +9 -0
  30. package/dist/cjs/types.js.map +1 -0
  31. package/dist/esm/client.d.ts +121 -0
  32. package/dist/esm/client.d.ts.map +1 -0
  33. package/dist/esm/client.js +479 -0
  34. package/dist/esm/client.js.map +1 -0
  35. package/dist/esm/context.d.ts +10 -0
  36. package/dist/esm/context.d.ts.map +1 -0
  37. package/dist/esm/context.js +11 -0
  38. package/dist/esm/context.js.map +1 -0
  39. package/dist/esm/hooks.d.ts +86 -0
  40. package/dist/esm/hooks.d.ts.map +1 -0
  41. package/dist/esm/hooks.js +178 -0
  42. package/dist/esm/hooks.js.map +1 -0
  43. package/dist/esm/index.d.ts +7 -0
  44. package/dist/esm/index.d.ts.map +1 -0
  45. package/dist/esm/index.js +10 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/local-evaluator.d.ts +12 -0
  48. package/dist/esm/local-evaluator.d.ts.map +1 -0
  49. package/dist/esm/local-evaluator.js +41 -0
  50. package/dist/esm/local-evaluator.js.map +1 -0
  51. package/dist/esm/provider.d.ts +24 -0
  52. package/dist/esm/provider.d.ts.map +1 -0
  53. package/dist/esm/provider.js +94 -0
  54. package/dist/esm/provider.js.map +1 -0
  55. package/dist/esm/types.d.ts +163 -0
  56. package/dist/esm/types.d.ts.map +1 -0
  57. package/dist/esm/types.js +8 -0
  58. package/dist/esm/types.js.map +1 -0
  59. package/package.json +58 -0
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeploySentryClient = void 0;
4
+ const local_evaluator_1 = require("./local-evaluator");
5
+ /**
6
+ * Normalise a raw API response into the public {@link Flag} shape.
7
+ */
8
+ function toFlag(raw) {
9
+ const meta = raw.metadata ?? {};
10
+ return {
11
+ key: raw.key,
12
+ name: raw.name ?? raw.key,
13
+ category: meta.category ?? 'feature',
14
+ purpose: meta.purpose ?? '',
15
+ owners: meta.owners ?? [],
16
+ isPermanent: meta.isPermanent ?? false,
17
+ expiresAt: meta.expiresAt,
18
+ enabled: raw.enabled,
19
+ value: raw.value,
20
+ tags: meta.tags ?? [],
21
+ };
22
+ }
23
+ /**
24
+ * Lightweight HTTP + SSE client that manages the local flag store.
25
+ *
26
+ * This client is designed for browser environments. It uses the native
27
+ * `fetch` and `EventSource` APIs, so no polyfills are required in modern
28
+ * browsers.
29
+ */
30
+ class DeploySentryClient {
31
+ constructor(options) {
32
+ this.flagConfig = null;
33
+ /** In-memory flag store keyed by flag key. */
34
+ this.flags = new Map();
35
+ /** Registry of operation handlers for the register/dispatch pattern. */
36
+ this.registry = new Map();
37
+ /** Subscribed listeners notified on any flag change. */
38
+ this.listeners = new Set();
39
+ /** Active SSE connection, if any. */
40
+ this.eventSource = null;
41
+ /** Whether the initial fetch has completed at least once. */
42
+ this.initialised = false;
43
+ /** Whether the client has been destroyed. */
44
+ this.destroyed = false;
45
+ /** Retry state for SSE reconnection. */
46
+ this.sseRetryTimer = null;
47
+ this.sseRetryCount = 0;
48
+ this.apiKey = options.apiKey;
49
+ this.baseURL = options.baseURL.replace(/\/+$/, '');
50
+ this.environment = options.environment;
51
+ this.project = options.project;
52
+ this.application = options.application;
53
+ this.sessionId = options.sessionId;
54
+ this.mode = options.mode ?? 'server';
55
+ this.flagConfig = options.flagConfig ?? null;
56
+ this.user = options.user;
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Public API
60
+ // ---------------------------------------------------------------------------
61
+ /** Fetch all flags from the API and start listening for SSE updates. */
62
+ async init() {
63
+ if (this.flagConfig) {
64
+ // Populate the in-memory store from the pre-loaded config.
65
+ const envName = this.environment;
66
+ for (const fc of this.flagConfig.flags) {
67
+ const envState = fc.environments[envName];
68
+ this.flags.set(fc.key, {
69
+ key: fc.key,
70
+ name: fc.name,
71
+ category: fc.category,
72
+ purpose: '',
73
+ owners: [],
74
+ isPermanent: fc.is_permanent,
75
+ expiresAt: fc.expires_at,
76
+ enabled: envState?.enabled ?? false,
77
+ value: envState?.value ?? fc.default_value,
78
+ tags: [],
79
+ });
80
+ }
81
+ this.initialised = true;
82
+ this.emit();
83
+ return;
84
+ }
85
+ await this.fetchFlags();
86
+ this.connectSSE();
87
+ }
88
+ /** Stop the SSE connection and release resources. */
89
+ destroy() {
90
+ this.destroyed = true;
91
+ this.disconnectSSE();
92
+ this.listeners.clear();
93
+ }
94
+ /** Clear the local flag store and re-fetch all flags from the API. */
95
+ async refreshSession() {
96
+ this.flags.clear();
97
+ await this.fetchFlags();
98
+ }
99
+ /** Update the user context and re-fetch flags. */
100
+ async identify(user) {
101
+ this.user = user;
102
+ await this.fetchFlags();
103
+ }
104
+ /** Subscribe to flag changes. Returns an unsubscribe function. */
105
+ subscribe(listener) {
106
+ this.listeners.add(listener);
107
+ return () => {
108
+ this.listeners.delete(listener);
109
+ };
110
+ }
111
+ /** True once the first successful fetch has completed. */
112
+ get isInitialised() {
113
+ return this.initialised;
114
+ }
115
+ /** Return the stored {@link Flag} for the given key, or `undefined`. */
116
+ getFlag(key) {
117
+ return this.flags.get(key);
118
+ }
119
+ /** Return all stored flags. */
120
+ getAllFlags() {
121
+ return Array.from(this.flags.values());
122
+ }
123
+ /** Build a {@link FlagMetadata} object for a stored flag. */
124
+ getFlagMetadata(key) {
125
+ const flag = this.flags.get(key);
126
+ if (!flag)
127
+ return undefined;
128
+ return {
129
+ category: flag.category,
130
+ purpose: flag.purpose,
131
+ owners: flag.owners,
132
+ isPermanent: flag.isPermanent,
133
+ expiresAt: flag.expiresAt,
134
+ tags: flag.tags,
135
+ };
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Register / dispatch
139
+ // ---------------------------------------------------------------------------
140
+ /**
141
+ * Register a handler for the given operation name.
142
+ *
143
+ * When `flagKey` is provided the handler is used only when that flag is
144
+ * enabled. Omit `flagKey` to register the default (fallback) handler.
145
+ */
146
+ register(operation, handler, flagKey) {
147
+ let list = this.registry.get(operation);
148
+ if (!list) {
149
+ list = [];
150
+ this.registry.set(operation, list);
151
+ }
152
+ if (flagKey === undefined) {
153
+ const idx = list.findIndex((r) => r.flagKey === undefined);
154
+ if (idx !== -1)
155
+ list[idx] = { handler };
156
+ else
157
+ list.push({ handler });
158
+ }
159
+ else {
160
+ list.push({ handler, flagKey });
161
+ }
162
+ }
163
+ /**
164
+ * Dispatch the appropriate handler for the given operation.
165
+ *
166
+ * Returns the first registered handler whose flag is enabled. Falls back
167
+ * to the default (no-flagKey) handler if no flagged handler matches.
168
+ *
169
+ * @throws If no handlers are registered for the operation.
170
+ * @throws If no flagged handler matches and no default is registered.
171
+ */
172
+ dispatch(operation, _context) {
173
+ const list = this.registry.get(operation);
174
+ if (!list || list.length === 0) {
175
+ throw new Error(`No handlers registered for operation '${operation}'. Call register() before dispatch().`);
176
+ }
177
+ for (const reg of list) {
178
+ if (reg.flagKey !== undefined) {
179
+ const flag = this.flags.get(reg.flagKey);
180
+ if (flag && flag.enabled)
181
+ return reg.handler;
182
+ }
183
+ }
184
+ const defaultReg = list.find((r) => r.flagKey === undefined);
185
+ if (!defaultReg) {
186
+ throw new Error(`No matching handler for operation '${operation}' and no default registered. Register a default handler (no flagKey) as the last registration.`);
187
+ }
188
+ return defaultReg.handler;
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // Typed evaluation methods
192
+ // ---------------------------------------------------------------------------
193
+ /**
194
+ * Evaluate a boolean flag from the in-memory store.
195
+ *
196
+ * No API call is made -- the value comes from the flags already fetched
197
+ * via {@link init} and kept up-to-date by SSE.
198
+ */
199
+ boolValue(key, defaultValue) {
200
+ if (this.flagConfig) {
201
+ const ctx = this.user ? { attributes: this.user.attributes } : undefined;
202
+ const result = (0, local_evaluator_1.evaluateLocal)(this.flagConfig, this.environment, key, ctx);
203
+ if (result.reason === 'flag_not_found')
204
+ return defaultValue;
205
+ if (result.value === 'true')
206
+ return true;
207
+ if (result.value === 'false')
208
+ return false;
209
+ return defaultValue;
210
+ }
211
+ const flag = this.flags.get(key);
212
+ if (!flag || !flag.enabled)
213
+ return defaultValue;
214
+ if (typeof flag.value === 'boolean')
215
+ return flag.value;
216
+ if (flag.value === 'true')
217
+ return true;
218
+ if (flag.value === 'false')
219
+ return false;
220
+ return defaultValue;
221
+ }
222
+ /**
223
+ * Evaluate a string flag from the in-memory store.
224
+ */
225
+ stringValue(key, defaultValue) {
226
+ if (this.flagConfig) {
227
+ const ctx = this.user ? { attributes: this.user.attributes } : undefined;
228
+ const result = (0, local_evaluator_1.evaluateLocal)(this.flagConfig, this.environment, key, ctx);
229
+ if (result.reason === 'flag_not_found')
230
+ return defaultValue;
231
+ return result.value;
232
+ }
233
+ const flag = this.flags.get(key);
234
+ if (!flag || !flag.enabled)
235
+ return defaultValue;
236
+ if (typeof flag.value === 'string')
237
+ return flag.value;
238
+ if (flag.value != null)
239
+ return String(flag.value);
240
+ return defaultValue;
241
+ }
242
+ /**
243
+ * Evaluate a number flag from the in-memory store.
244
+ *
245
+ * TypeScript has no separate `int` type -- this returns `number` and is
246
+ * the idiomatic equivalent of `intValue` / `floatValue` in other SDKs.
247
+ */
248
+ numberValue(key, defaultValue) {
249
+ if (this.flagConfig) {
250
+ const ctx = this.user ? { attributes: this.user.attributes } : undefined;
251
+ const result = (0, local_evaluator_1.evaluateLocal)(this.flagConfig, this.environment, key, ctx);
252
+ if (result.reason === 'flag_not_found')
253
+ return defaultValue;
254
+ const parsed = Number(result.value);
255
+ if (!Number.isNaN(parsed))
256
+ return parsed;
257
+ return defaultValue;
258
+ }
259
+ const flag = this.flags.get(key);
260
+ if (!flag || !flag.enabled)
261
+ return defaultValue;
262
+ if (typeof flag.value === 'number')
263
+ return flag.value;
264
+ if (typeof flag.value === 'string') {
265
+ const parsed = Number(flag.value);
266
+ if (!Number.isNaN(parsed))
267
+ return parsed;
268
+ }
269
+ return defaultValue;
270
+ }
271
+ /**
272
+ * Evaluate a JSON (object) flag from the in-memory store.
273
+ */
274
+ jsonValue(key, defaultValue) {
275
+ if (this.flagConfig) {
276
+ const ctx = this.user ? { attributes: this.user.attributes } : undefined;
277
+ const result = (0, local_evaluator_1.evaluateLocal)(this.flagConfig, this.environment, key, ctx);
278
+ if (result.reason === 'flag_not_found')
279
+ return defaultValue;
280
+ try {
281
+ return JSON.parse(result.value);
282
+ }
283
+ catch {
284
+ return defaultValue;
285
+ }
286
+ }
287
+ const flag = this.flags.get(key);
288
+ if (!flag || !flag.enabled)
289
+ return defaultValue;
290
+ if (typeof flag.value === 'object' && flag.value !== null)
291
+ return flag.value;
292
+ if (typeof flag.value === 'string') {
293
+ try {
294
+ return JSON.parse(flag.value);
295
+ }
296
+ catch {
297
+ return defaultValue;
298
+ }
299
+ }
300
+ return defaultValue;
301
+ }
302
+ /**
303
+ * Return the full evaluation detail for a flag from the in-memory store.
304
+ *
305
+ * Returns `{ value, enabled, metadata, loading }` matching the
306
+ * {@link FlagDetail} interface used by the `useFlagDetail` hook.
307
+ */
308
+ detail(key) {
309
+ const flag = this.flags.get(key);
310
+ const loading = !this.initialised;
311
+ if (!flag) {
312
+ return {
313
+ value: undefined,
314
+ enabled: false,
315
+ metadata: {
316
+ category: 'feature',
317
+ purpose: '',
318
+ owners: [],
319
+ isPermanent: false,
320
+ tags: [],
321
+ },
322
+ loading,
323
+ };
324
+ }
325
+ return {
326
+ value: flag.value,
327
+ enabled: flag.enabled,
328
+ metadata: {
329
+ category: flag.category,
330
+ purpose: flag.purpose,
331
+ owners: flag.owners,
332
+ isPermanent: flag.isPermanent,
333
+ expiresAt: flag.expiresAt,
334
+ tags: flag.tags,
335
+ },
336
+ loading,
337
+ };
338
+ }
339
+ // ---------------------------------------------------------------------------
340
+ // HTTP
341
+ // ---------------------------------------------------------------------------
342
+ get headers() {
343
+ const h = {
344
+ Authorization: `ApiKey ${this.apiKey}`,
345
+ 'Content-Type': 'application/json',
346
+ Accept: 'application/json',
347
+ };
348
+ if (this.sessionId) {
349
+ h['X-DeploySentry-Session'] = this.sessionId;
350
+ }
351
+ return h;
352
+ }
353
+ buildQueryParams() {
354
+ const params = new URLSearchParams({
355
+ project_id: this.project,
356
+ environment_id: this.environment,
357
+ application: this.application,
358
+ });
359
+ if (this.user?.id) {
360
+ params.set('userId', this.user.id);
361
+ }
362
+ if (this.user?.attributes) {
363
+ params.set('attributes', JSON.stringify(this.user.attributes));
364
+ }
365
+ return params;
366
+ }
367
+ async fetchFlags() {
368
+ // Match the backend `listFlags` endpoint, which only requires a project_id.
369
+ const url = `${this.baseURL}/api/v1/flags?project_id=${encodeURIComponent(this.project)}&application=${encodeURIComponent(this.application)}`;
370
+ const response = await fetch(url, {
371
+ method: 'GET',
372
+ headers: this.headers,
373
+ });
374
+ if (!response.ok) {
375
+ const body = await response.text().catch(() => '');
376
+ throw new Error(`DeploySentry: failed to fetch flags (${response.status}): ${body}`);
377
+ }
378
+ const data = await response.json();
379
+ this.flags.clear();
380
+ for (const raw of data) {
381
+ this.flags.set(raw.key, toFlag(raw));
382
+ }
383
+ this.initialised = true;
384
+ this.emit();
385
+ }
386
+ // ---------------------------------------------------------------------------
387
+ // SSE
388
+ // ---------------------------------------------------------------------------
389
+ connectSSE() {
390
+ if (this.destroyed)
391
+ return;
392
+ if (typeof EventSource === 'undefined')
393
+ return; // SSR guard
394
+ const params = this.buildQueryParams();
395
+ const url = `${this.baseURL}/api/v1/flags/stream?${params.toString()}`;
396
+ // EventSource does not support custom headers natively. We pass the
397
+ // API key as a query parameter for SSE connections.
398
+ const sseUrl = new URL(url);
399
+ sseUrl.searchParams.set('token', this.apiKey);
400
+ const es = new EventSource(sseUrl.toString());
401
+ // The backend sends all flag change events with SSE event type
402
+ // "flag_change". The JSON payload's inner "event" field distinguishes
403
+ // the specific action (flag.updated, flag.toggled, flag.deleted, etc.).
404
+ es.addEventListener('flag_change', (event) => {
405
+ try {
406
+ const outer = JSON.parse(event.data);
407
+ // event.data is a double-encoded JSON string from SSEvent():
408
+ // the outer layer is the SSE data field, inner is the SSEEvent struct.
409
+ const data = typeof outer === 'string' ? JSON.parse(outer) : outer;
410
+ if (data?.event === 'flag.deleted' && data?.flag_key) {
411
+ this.flags.delete(data.flag_key);
412
+ this.emit();
413
+ }
414
+ else {
415
+ // For all other events (updated, toggled, created, rule changes),
416
+ // re-fetch the full flag set to get the current state.
417
+ this.fetchFlags();
418
+ }
419
+ }
420
+ catch {
421
+ // Malformed event — trigger a full refresh as a fallback.
422
+ this.fetchFlags();
423
+ }
424
+ });
425
+ es.onerror = () => {
426
+ this.disconnectSSE();
427
+ this.scheduleReconnect();
428
+ };
429
+ this.eventSource = es;
430
+ this.sseRetryCount = 0;
431
+ }
432
+ handleSSEMessage(event) {
433
+ try {
434
+ const data = JSON.parse(event.data);
435
+ const raw = data?.flag ?? data;
436
+ if (raw?.key) {
437
+ this.flags.set(raw.key, toFlag(raw));
438
+ this.emit();
439
+ }
440
+ }
441
+ catch {
442
+ // Ignore malformed messages.
443
+ }
444
+ }
445
+ disconnectSSE() {
446
+ if (this.eventSource) {
447
+ this.eventSource.close();
448
+ this.eventSource = null;
449
+ }
450
+ if (this.sseRetryTimer !== null) {
451
+ clearTimeout(this.sseRetryTimer);
452
+ this.sseRetryTimer = null;
453
+ }
454
+ }
455
+ scheduleReconnect() {
456
+ if (this.destroyed)
457
+ return;
458
+ const baseDelay = Math.min(1000 * Math.pow(2, this.sseRetryCount), DeploySentryClient.SSE_MAX_RETRY_DELAY_MS);
459
+ const jitter = baseDelay * 0.2 * (2 * Math.random() - 1);
460
+ const delay = baseDelay + jitter;
461
+ this.sseRetryCount++;
462
+ this.sseRetryTimer = setTimeout(() => {
463
+ this.sseRetryTimer = null;
464
+ this.connectSSE();
465
+ }, delay);
466
+ }
467
+ // ---------------------------------------------------------------------------
468
+ // Internal
469
+ // ---------------------------------------------------------------------------
470
+ emit() {
471
+ for (const listener of this.listeners) {
472
+ try {
473
+ listener();
474
+ }
475
+ catch {
476
+ // Listener errors must not break the notification loop.
477
+ }
478
+ }
479
+ }
480
+ }
481
+ exports.DeploySentryClient = DeploySentryClient;
482
+ DeploySentryClient.SSE_MAX_RETRY_DELAY_MS = 30000;
483
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DeploySentryClient } from './client';
2
+ /**
3
+ * React context that holds the DeploySentry client instance.
4
+ *
5
+ * The context value is `null` until the {@link DeploySentryProvider} mounts
6
+ * and initialises the client. Hooks that consume this context will throw
7
+ * if used outside of the provider tree.
8
+ */
9
+ export declare const DeploySentryContext: import("react").Context<DeploySentryClient | null>;
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,oDAAiD,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeploySentryContext = void 0;
4
+ const react_1 = require("react");
5
+ /**
6
+ * React context that holds the DeploySentry client instance.
7
+ *
8
+ * The context value is `null` until the {@link DeploySentryProvider} mounts
9
+ * and initialises the client. Hooks that consume this context will throw
10
+ * if used outside of the provider tree.
11
+ */
12
+ exports.DeploySentryContext = (0, react_1.createContext)(null);
13
+ exports.DeploySentryContext.displayName = 'DeploySentryContext';
14
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":";;;AAAA,iCAAsC;AAGtC;;;;;;GAMG;AACU,QAAA,mBAAmB,GAAG,IAAA,qBAAa,EAA4B,IAAI,CAAC,CAAC;AAElF,2BAAmB,CAAC,WAAW,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,86 @@
1
+ import type { DeploySentryClient } from './client';
2
+ import type { Flag, FlagCategory, FlagDetail } from './types';
3
+ /**
4
+ * Return the raw {@link DeploySentryClient} instance.
5
+ *
6
+ * Useful for advanced use-cases such as manual re-identification or
7
+ * subscribing to change events outside of React's lifecycle.
8
+ *
9
+ * @throws If called outside of a `<DeploySentryProvider>`.
10
+ */
11
+ export declare function useDeploySentry(): DeploySentryClient;
12
+ /**
13
+ * Evaluate a feature flag and return its resolved value.
14
+ *
15
+ * The component re-renders whenever the flag value changes (via SSE).
16
+ *
17
+ * @param key - The unique flag key.
18
+ * @param defaultValue - Value returned while the flag is loading or if the
19
+ * key does not exist.
20
+ * @returns The resolved flag value, or `defaultValue`.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const showBanner = useFlag('show-banner', false);
25
+ * ```
26
+ */
27
+ export declare function useFlag<T = unknown>(key: string, defaultValue: T): T;
28
+ /**
29
+ * Return detailed evaluation information for a single flag.
30
+ *
31
+ * Includes the resolved value, enabled state, full metadata, and a
32
+ * `loading` indicator that is `true` until the initial fetch completes.
33
+ *
34
+ * @param key - The unique flag key.
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * const { value, enabled, metadata, loading } = useFlagDetail('new-checkout');
39
+ * ```
40
+ */
41
+ export declare function useFlagDetail<T = unknown>(key: string): FlagDetail<T>;
42
+ /**
43
+ * Return all flags that belong to the given category.
44
+ *
45
+ * The result is referentially stable across renders as long as the
46
+ * underlying flag data has not changed.
47
+ *
48
+ * @param category - One of the predefined {@link FlagCategory} values.
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * const experiments = useFlagsByCategory('experiment');
53
+ * ```
54
+ */
55
+ export declare function useFlagsByCategory(category: FlagCategory): Flag[];
56
+ /**
57
+ * Return the dispatch function for the given operation name.
58
+ *
59
+ * Reads the client from context and calls {@link DeploySentryClient.dispatch},
60
+ * which selects the appropriate handler based on currently enabled flags.
61
+ *
62
+ * @param operation - The name of the registered operation.
63
+ * @returns The resolved handler function.
64
+ *
65
+ * @throws If no handlers are registered for the operation.
66
+ *
67
+ * @example
68
+ * ```tsx
69
+ * const checkout = useDispatch<() => void>('checkout');
70
+ * checkout();
71
+ * ```
72
+ */
73
+ export declare function useDispatch<T extends (...args: any[]) => any>(operation: string): T;
74
+ /**
75
+ * Return all non-permanent flags whose `expiresAt` date is in the past.
76
+ *
77
+ * This is useful for building admin dashboards that surface stale flags
78
+ * that should be cleaned up.
79
+ *
80
+ * @example
81
+ * ```tsx
82
+ * const expired = useExpiredFlags();
83
+ * ```
84
+ */
85
+ export declare function useExpiredFlags(): Flag[];
86
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,SAAS,CAAC;AAqD5E;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAQpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CA+BrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,EAAE,CAQjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAGnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,IAAI,EAAE,CAWxC"}