@fluxiapi/react 0.3.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.
@@ -0,0 +1,266 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { FluxRequestRecord, FluxReport, RuleViolation } from '@fluxiapi/scan';
3
+ import { ReactNode } from 'react';
4
+
5
+ interface FluxState {
6
+ /** Whether the scanner is actively capturing */
7
+ scanning: boolean;
8
+ /** Captured requests so far */
9
+ requests: FluxRequestRecord[];
10
+ /** Latest analysis report (null before first analysis) */
11
+ report: FluxReport | null;
12
+ /** Current API health score 0-100 */
13
+ score: number;
14
+ /** Active violations */
15
+ violations: RuleViolation[];
16
+ /** Scan start time */
17
+ startTime: number;
18
+ /** Elapsed seconds */
19
+ elapsed: number;
20
+ /** Selected network profile */
21
+ network: string;
22
+ /** Framework info if detected */
23
+ framework: string | null;
24
+ }
25
+ type FluxStateListener = (state: FluxState) => void;
26
+ interface ScannerBridgeConfig {
27
+ /** Network profile for scoring */
28
+ network?: string;
29
+ /** How often to re-analyze (ms, default: 3000) */
30
+ analysisInterval?: number;
31
+ /** Auto-start scanning on mount */
32
+ autoStart?: boolean;
33
+ /** Verbose console logging */
34
+ verbose?: boolean;
35
+ }
36
+ declare class ScannerBridge {
37
+ private _state;
38
+ private _listeners;
39
+ private _analyzeTimer;
40
+ private _tickTimer;
41
+ private _config;
42
+ private _scanner;
43
+ private _analyzer;
44
+ constructor(config?: ScannerBridgeConfig);
45
+ get state(): FluxState;
46
+ subscribe(listener: FluxStateListener): () => void;
47
+ private _emit;
48
+ private _update;
49
+ start(): Promise<void>;
50
+ stop(): FluxReport | null;
51
+ reset(): void;
52
+ setNetwork(network: string): void;
53
+ private _runAnalysis;
54
+ /**
55
+ * Capture a TanStack Query event. Called by FluxQueryClient wrapper.
56
+ */
57
+ captureQueryEvent(event: {
58
+ type: 'query-added' | 'query-updated' | 'query-removed';
59
+ queryKey: unknown[];
60
+ state?: {
61
+ status: string;
62
+ fetchStatus: string;
63
+ dataUpdatedAt: number;
64
+ };
65
+ options?: {
66
+ staleTime?: number;
67
+ gcTime?: number;
68
+ refetchInterval?: number | false;
69
+ enabled?: boolean;
70
+ retry?: number | boolean;
71
+ };
72
+ }): void;
73
+ /**
74
+ * Capture a SWR event.
75
+ */
76
+ captureSWREvent(event: {
77
+ type: 'swr-request' | 'swr-success' | 'swr-error';
78
+ key: string;
79
+ config?: {
80
+ refreshInterval?: number;
81
+ dedupingInterval?: number;
82
+ revalidateOnFocus?: boolean;
83
+ errorRetryCount?: number;
84
+ };
85
+ }): void;
86
+ destroy(): void;
87
+ }
88
+ declare function getGlobalBridge(config?: ScannerBridgeConfig): ScannerBridge;
89
+ declare function resetGlobalBridge(): void;
90
+
91
+ interface FluxDevToolsProps {
92
+ /**
93
+ * Position of the floating badge.
94
+ * @default 'bottom-right'
95
+ */
96
+ position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
97
+ /**
98
+ * Network profile for scoring.
99
+ * @default 'wifi'
100
+ */
101
+ network?: string;
102
+ /**
103
+ * Re-analysis interval in ms.
104
+ * @default 3000
105
+ */
106
+ analysisInterval?: number;
107
+ /**
108
+ * Auto-start scanning when component mounts.
109
+ * @default true
110
+ */
111
+ autoStart?: boolean;
112
+ /**
113
+ * Start with panel expanded.
114
+ * @default false
115
+ */
116
+ defaultOpen?: boolean;
117
+ /**
118
+ * Console logging for debug.
119
+ * @default false
120
+ */
121
+ verbose?: boolean;
122
+ /**
123
+ * Custom scanner bridge (for shared state with other components).
124
+ */
125
+ bridge?: ScannerBridge;
126
+ /**
127
+ * Force show even in production. By default, only renders in development.
128
+ * @default false
129
+ */
130
+ forceShow?: boolean;
131
+ /**
132
+ * Keyboard shortcut to toggle panel. Set to null to disable.
133
+ * @default 'ctrl+shift+f'
134
+ */
135
+ shortcut?: string | null;
136
+ }
137
+ declare function FluxDevTools({ position, network, analysisInterval, autoStart, defaultOpen, verbose, bridge, forceShow, shortcut, }: FluxDevToolsProps): react_jsx_runtime.JSX.Element | null;
138
+
139
+ interface FluxContextValue {
140
+ bridge: ScannerBridge;
141
+ state: FluxState;
142
+ }
143
+ interface FluxProviderProps {
144
+ children: ReactNode;
145
+ /** Network profile for scoring */
146
+ network?: string;
147
+ /** Re-analysis interval in ms (default: 3000) */
148
+ analysisInterval?: number;
149
+ /** Auto-start scanning on mount (default: true) */
150
+ autoStart?: boolean;
151
+ /** Console logging */
152
+ verbose?: boolean;
153
+ /** Custom scanner bridge instance */
154
+ bridge?: ScannerBridge;
155
+ }
156
+ declare function FluxProvider({ children, network, analysisInterval, autoStart, verbose, bridge: customBridge, }: FluxProviderProps): react_jsx_runtime.JSX.Element;
157
+ declare function useFlux(): FluxContextValue;
158
+ declare function useFluxBridge(): ScannerBridge;
159
+ declare function useFluxState(): FluxState;
160
+
161
+ interface ScoreInfo {
162
+ overall: number;
163
+ grade: string;
164
+ efficiency: number;
165
+ caching: number;
166
+ patterns: number;
167
+ color: string;
168
+ }
169
+ declare function useFluxScore(): ScoreInfo;
170
+ interface ViolationFilter {
171
+ severity?: 'critical' | 'warning' | 'info';
172
+ category?: 'efficiency' | 'caching' | 'patterns';
173
+ ruleId?: string;
174
+ }
175
+ declare function useFluxViolations(filter?: ViolationFilter): RuleViolation[];
176
+ interface RequestFilter {
177
+ type?: 'api-rest' | 'api-graphql' | 'static' | 'document';
178
+ method?: string;
179
+ minDuration?: number;
180
+ }
181
+ declare function useFluxRequests(filter?: RequestFilter): FluxRequestRecord[];
182
+ declare function useFluxReport(): FluxReport | null;
183
+ declare function useFluxScanning(): {
184
+ scanning: boolean;
185
+ elapsed: number;
186
+ requestCount: number;
187
+ start: () => void;
188
+ stop: () => void;
189
+ reset: () => void;
190
+ };
191
+
192
+ /**
193
+ * Wraps a TanStack QueryClient to instrument all queries for FluxAPI monitoring.
194
+ *
195
+ * Usage:
196
+ * ```tsx
197
+ * import { QueryClient } from '@tanstack/react-query';
198
+ * import { wrapQueryClient } from '@fluxiapi/react';
199
+ *
200
+ * const queryClient = wrapQueryClient(new QueryClient({
201
+ * defaultOptions: { queries: { staleTime: 30_000 } },
202
+ * }));
203
+ * ```
204
+ */
205
+ declare function wrapQueryClient<T extends object>(queryClient: T, bridge?: ScannerBridge): T;
206
+ interface QueryMetrics {
207
+ /** Total unique query keys seen */
208
+ uniqueQueries: number;
209
+ /** Queries without staleTime configured */
210
+ queriesWithoutStaleTime: number;
211
+ /** Queries with refetchInterval (polling) */
212
+ pollingQueries: number;
213
+ /** Queries with retry disabled */
214
+ noRetryQueries: number;
215
+ /** Average staleTime across queries */
216
+ avgStaleTime: number;
217
+ }
218
+ /**
219
+ * Extracts TanStack Query-specific metrics from the current scan report.
220
+ * Call this after getting a report to see query-level insights.
221
+ */
222
+ declare function extractQueryMetrics(queryClient: any): QueryMetrics;
223
+
224
+ type SWRKey = string | unknown[] | null | undefined | (() => string | unknown[] | null);
225
+ interface SWRConfig {
226
+ refreshInterval?: number;
227
+ dedupingInterval?: number;
228
+ revalidateOnFocus?: boolean;
229
+ revalidateOnReconnect?: boolean;
230
+ errorRetryCount?: number;
231
+ [key: string]: unknown;
232
+ }
233
+ type SWRHook = (useSWRNext: any) => (key: SWRKey, fetcher: any, config: SWRConfig) => any;
234
+ /**
235
+ * SWR middleware that instruments all SWR hooks for FluxAPI monitoring.
236
+ *
237
+ * Usage:
238
+ * ```tsx
239
+ * import { SWRConfig } from 'swr';
240
+ * import { fluxSWRMiddleware } from '@fluxiapi/react';
241
+ *
242
+ * function App() {
243
+ * return (
244
+ * <SWRConfig value={{ use: [fluxSWRMiddleware] }}>
245
+ * <MyApp />
246
+ * </SWRConfig>
247
+ * );
248
+ * }
249
+ * ```
250
+ */
251
+ declare function createFluxSWRMiddleware(bridge?: ScannerBridge): SWRHook;
252
+ declare const fluxSWRMiddleware: SWRHook;
253
+ interface SWRMetrics {
254
+ /** Number of unique SWR keys */
255
+ totalKeys: number;
256
+ /** Keys with refreshInterval (polling) */
257
+ pollingKeys: number;
258
+ /** Keys with revalidateOnFocus enabled */
259
+ revalidateOnFocusKeys: number;
260
+ /** Keys with errorRetryCount = 0 */
261
+ noRetryKeys: number;
262
+ /** Average deduping interval */
263
+ avgDedupingInterval: number;
264
+ }
265
+
266
+ export { FluxDevTools, type FluxDevToolsProps, FluxProvider, type FluxProviderProps, type FluxState, type FluxStateListener, type QueryMetrics, type RequestFilter, type SWRMetrics, ScannerBridge, type ScannerBridgeConfig, type ScoreInfo, type ViolationFilter, createFluxSWRMiddleware, extractQueryMetrics, fluxSWRMiddleware, getGlobalBridge, resetGlobalBridge, useFlux, useFluxBridge, useFluxReport, useFluxRequests, useFluxScanning, useFluxScore, useFluxState, useFluxViolations, wrapQueryClient };