bippy 0.6.1-dev.051a9b2 → 0.6.1-dev.3a24abf

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 (55) hide show
  1. package/README.md +26 -48
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.d.cts +32 -44
  4. package/dist/core.d.ts +32 -44
  5. package/dist/core.js +1 -1
  6. package/dist/core2.cjs +9 -0
  7. package/dist/core2.d.cts +3 -3
  8. package/dist/core2.d.ts +3 -3
  9. package/dist/core2.js +9 -0
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.d.cts +3 -3
  12. package/dist/index.d.ts +3 -3
  13. package/dist/index.iife.js +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/install-hook-only.cjs +1 -1
  16. package/dist/install-hook-only.d.cts +1 -1
  17. package/dist/install-hook-only.d.ts +1 -1
  18. package/dist/install-hook-only.iife.js +1 -1
  19. package/dist/install-hook-only.js +1 -1
  20. package/dist/rdt-hook.cjs +1 -1
  21. package/dist/rdt-hook.js +1 -1
  22. package/dist/source.cjs +14 -4
  23. package/dist/source.d.cts +1 -1
  24. package/dist/source.d.ts +1 -1
  25. package/dist/source.js +14 -4
  26. package/dist/types.d.cts +291 -0
  27. package/dist/types.d.ts +291 -0
  28. package/package.json +14 -12
  29. package/src/core.ts +206 -155
  30. package/src/generated/react-work-tags.ts +169 -0
  31. package/src/rdt-hook.ts +24 -67
  32. package/src/react-internals.ts +67 -0
  33. package/src/source/constants.ts +1 -1
  34. package/src/source/get-source.ts +2 -1
  35. package/src/source/owner-stack.ts +64 -77
  36. package/src/source/parse-stack.ts +1 -1
  37. package/src/source/symbolication.ts +25 -4
  38. package/src/types.ts +154 -333
  39. package/src/unsubscribe.ts +2 -2
  40. package/dist/get-source.cjs +0 -19
  41. package/dist/get-source.js +0 -19
  42. package/dist/react-refresh.cjs +0 -9
  43. package/dist/react-refresh.d.cts +0 -66
  44. package/dist/react-refresh.d.ts +0 -66
  45. package/dist/react-refresh.js +0 -9
  46. package/dist/unsubscribe.d.cts +0 -298
  47. package/dist/unsubscribe.d.ts +0 -298
  48. package/src/react-refresh/constants.ts +0 -9
  49. package/src/react-refresh/detect-hmr-transport.ts +0 -33
  50. package/src/react-refresh/index.ts +0 -173
  51. package/src/react-refresh/metro-hmr-transport.ts +0 -188
  52. package/src/react-refresh/next-webpack-hmr-transport.ts +0 -72
  53. package/src/react-refresh/normalize-hmr-file-path.ts +0 -24
  54. package/src/react-refresh/types.ts +0 -7
  55. package/src/react-refresh/vite-hmr-transport.ts +0 -116
package/src/types.ts CHANGED
@@ -1,288 +1,96 @@
1
1
  import type { ReactNode } from "react";
2
+ import type ReactReconciler from "react-reconciler";
3
+ import type { HostWorkTag, ReactWorkTag } from "./react-internals.js";
2
4
 
3
- // @types/react-reconciler uses `export = ReactReconciler` (CJS namespace),
4
- // which downstream bundlers can't resolve as ESM exports. These types are
5
- // inlined from @types/react-reconciler@0.28 to avoid the dependency.
5
+ export type BundleType = ReactReconciler.BundleType;
6
+ export type Flags = ReactReconciler.Flags;
7
+ export type HookType = ReactReconciler.HookType;
8
+ export type LanePriority = ReactReconciler.LanePriority;
9
+ export type Lanes = ReactReconciler.Lanes;
10
+ export type MutableSource = ReactReconciler.MutableSource;
11
+ export type OpaqueHandle = ReactReconciler.OpaqueHandle;
12
+ export type OpaqueRoot = ReactReconciler.OpaqueRoot;
13
+ export type React$AbstractComponent<
14
+ Config,
15
+ Instance = unknown,
16
+ > = ReactReconciler.React$AbstractComponent<Config, Instance>;
17
+ export type RootTag = ReactReconciler.RootTag;
18
+ export type TypeOfMode = ReactReconciler.TypeOfMode;
19
+ export type WorkTag = ReactReconciler.WorkTag | ReactWorkTag;
6
20
 
7
- // Simple type aliases — most are opaque in the original
8
- export type BundleType = 0 | 1;
9
- export type Flags = number;
10
- export type Lanes = number;
11
- export type TypeOfMode = number;
12
- export type RootTag = 0 | 1 | 2;
13
- export type LanePriority =
14
- | 0
15
- | 1
16
- | 2
17
- | 3
18
- | 4
19
- | 5
20
- | 6
21
- | 7
22
- | 8
23
- | 9
24
- | 10
25
- | 11
26
- | 12
27
- | 13
28
- | 14
29
- | 15
30
- | 16
31
- | 17;
32
- export type WorkTag =
33
- | 0
34
- | 1
35
- | 2
36
- | 3
37
- | 4
38
- | 5
39
- | 6
40
- | 7
41
- | 8
42
- | 9
43
- | 10
44
- | 11
45
- | 12
46
- | 13
47
- | 14
48
- | 15
49
- | 16
50
- | 17
51
- | 18
52
- | 19
53
- | 20
54
- | 21
55
- | 22
56
- | 23
57
- | 24
58
- | 25
59
- | 26
60
- | 27
61
- | 28
62
- | 29
63
- | 30
64
- | 31;
65
- export type HookType =
66
- | "useState"
67
- | "useReducer"
68
- | "useContext"
69
- | "useRef"
70
- | "useEffect"
71
- | "useLayoutEffect"
72
- | "useCallback"
73
- | "useMemo"
74
- | "useImperativeHandle"
75
- | "useDebugValue"
76
- | "useDeferredValue"
77
- | "useTransition"
78
- | "useMutableSource"
79
- | "useOpaqueIdentifier"
80
- | "useCacheRefresh";
81
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
- export type FiberRoot = any;
83
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
- export type MutableSource = any;
85
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
- export type OpaqueHandle = any;
87
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
- export type OpaqueRoot = any;
89
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
- export type React$AbstractComponent<_Config, _Instance = unknown> = any;
91
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
- export type HostConfig = Record<string, any>;
21
+ export interface HostConfig<
22
+ Type = unknown,
23
+ HostProps = unknown,
24
+ Container = unknown,
25
+ Instance = unknown,
26
+ TextInstance = unknown,
27
+ SuspenseInstance = unknown,
28
+ HydratableInstance = unknown,
29
+ FormInstance = unknown,
30
+ PublicInstance = unknown,
31
+ HostContext = unknown,
32
+ ChildSet = unknown,
33
+ TimeoutHandle = unknown,
34
+ NoTimeout = unknown,
35
+ TransitionStatus = unknown,
36
+ > extends ReactReconciler.HostConfig<
37
+ Type,
38
+ HostProps,
39
+ Container,
40
+ Instance,
41
+ TextInstance,
42
+ SuspenseInstance,
43
+ HydratableInstance,
44
+ FormInstance,
45
+ PublicInstance,
46
+ HostContext,
47
+ ChildSet,
48
+ TimeoutHandle,
49
+ NoTimeout,
50
+ TransitionStatus
51
+ > {}
93
52
 
94
- // Structural interfaces
95
- export interface Source {
96
- fileName: string;
97
- lineNumber: number;
98
- }
99
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
- export interface RefObject {
101
- current: any;
102
- }
103
- export interface Thenable<T> {
104
- then(resolve: () => T, reject?: () => T): T;
105
- }
53
+ export interface Source extends ReactReconciler.Source {}
54
+ export interface RefObject extends ReactReconciler.RefObject {}
55
+ export interface Thenable<T> extends ReactReconciler.Thenable<T> {}
106
56
 
107
- export interface ReactContext<T> {
108
- $$typeof: symbol | number;
109
- Consumer: ReactContext<T>;
110
- Provider: ReactProviderType<T>;
111
- _calculateChangedBits: ((a: T, b: T) => number) | null;
112
- _currentValue: T;
113
- _currentValue2: T;
114
- _threadCount: number;
115
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
- _currentRenderer?: Record<string, any> | null;
117
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
- _currentRenderer2?: Record<string, any> | null;
119
- displayName?: string;
120
- }
57
+ export interface ReactContext<T> extends ReactReconciler.ReactContext<T> {}
121
58
 
122
- export interface ReactProviderType<T> {
123
- $$typeof: symbol | number;
124
- _context: ReactContext<T>;
125
- }
126
- export interface ReactProvider<T> {
127
- $$typeof: symbol | number;
128
- type: ReactProviderType<T>;
129
- key: null | string;
130
- ref: null;
131
- props: { value: T; children?: ReactNode };
132
- }
133
- export interface ReactConsumer<T> {
134
- $$typeof: symbol | number;
135
- type: ReactContext<T>;
136
- key: null | string;
137
- ref: null;
138
- props: { children: (value: T) => ReactNode; unstable_observedBits?: number };
139
- }
140
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
141
- export interface ReactPortal {
142
- $$typeof: symbol | number;
143
- key: null | string;
144
- containerInfo: any;
145
- children: ReactNode;
146
- implementation: any;
147
- }
59
+ export interface ReactProviderType<T> extends ReactReconciler.ReactProviderType<T> {}
60
+ export interface ReactProvider<T> extends ReactReconciler.ReactProvider<T> {}
61
+ export interface ReactConsumer<T> extends ReactReconciler.ReactConsumer<T> {}
62
+ export interface ReactPortal extends ReactReconciler.ReactPortal {}
148
63
 
149
- export interface ComponentSelector {
150
- $$typeof: symbol | number;
151
- value: React$AbstractComponent<never, unknown>;
152
- }
153
- export interface HasPseudoClassSelector {
154
- $$typeof: symbol | number;
155
- value: Selector[];
156
- }
157
- export interface RoleSelector {
158
- $$typeof: symbol | number;
159
- value: string;
160
- }
161
- export interface TextSelector {
162
- $$typeof: symbol | number;
163
- value: string;
164
- }
165
- export interface TestNameSelector {
166
- $$typeof: symbol | number;
167
- value: string;
168
- }
169
- export type Selector =
170
- | ComponentSelector
171
- | HasPseudoClassSelector
172
- | RoleSelector
173
- | TextSelector
174
- | TestNameSelector;
64
+ export interface ComponentSelector extends ReactReconciler.ComponentSelector {}
65
+ export interface HasPseudoClassSelector extends ReactReconciler.HasPseudoClassSelector {}
66
+ export interface RoleSelector extends ReactReconciler.RoleSelector {}
67
+ export interface TextSelector extends ReactReconciler.TextSelector {}
68
+ export interface TestNameSelector extends ReactReconciler.TestNameSelector {}
69
+ export type Selector = ReactReconciler.Selector;
175
70
 
176
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
177
71
  export interface DevToolsConfig<
178
- Instance = any,
179
- TextInstance = any,
180
- RendererInspectionConfig = any,
181
- > {
182
- bundleType: BundleType;
183
- version: string;
184
- rendererPackageName: string;
185
- findFiberByHostInstance?: (instance: Instance | TextInstance) => ReactFiber | null;
186
- rendererConfig?: RendererInspectionConfig;
187
- }
72
+ Instance = unknown,
73
+ TextInstance = unknown,
74
+ RendererInspectionConfig = unknown,
75
+ > extends ReactReconciler.DevToolsConfig<Instance, TextInstance, RendererInspectionConfig> {}
188
76
 
189
- export interface SuspenseHydrationCallbacks<SuspenseInstance = unknown> {
190
- onHydrated?: (suspenseInstance: SuspenseInstance) => void;
191
- onDeleted?: (suspenseInstance: SuspenseInstance) => void;
192
- }
193
-
194
- export interface TransitionTracingCallbacks {
195
- onTransitionStart?: (transitionName: string, startTime: number) => void;
196
- onTransitionProgress?: (
197
- transitionName: string,
198
- startTime: number,
199
- currentTime: number,
200
- pending: Array<{ name: null | string }>,
201
- ) => void;
202
- onTransitionIncomplete?: (
203
- transitionName: string,
204
- startTime: number,
205
- deletions: Array<{ type: string; name?: string; newName?: string; endTime: number }>,
206
- ) => void;
207
- onTransitionComplete?: (transitionName: string, startTime: number, endTime: number) => void;
208
- onMarkerProgress?: (
209
- transitionName: string,
210
- marker: string,
211
- startTime: number,
212
- currentTime: number,
213
- pending: Array<{ name: null | string }>,
214
- ) => void;
215
- onMarkerIncomplete?: (
216
- transitionName: string,
217
- marker: string,
218
- startTime: number,
219
- deletions: Array<{ type: string; name?: string; newName?: string; endTime: number }>,
220
- ) => void;
221
- onMarkerComplete?: (
222
- transitionName: string,
223
- marker: string,
224
- startTime: number,
225
- endTime: number,
226
- ) => void;
227
- }
77
+ export interface SuspenseHydrationCallbacks<
78
+ SuspenseInstance = unknown,
79
+ > extends ReactReconciler.SuspenseHydrationCallbacks<SuspenseInstance> {}
228
80
 
229
- // The base Fiber interface from react-reconciler, used to derive bippy's Fiber below
230
- interface ReactFiber {
231
- tag: WorkTag;
232
- key: null | string;
233
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
- elementType: any;
235
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
- type: any;
237
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
- stateNode: any;
239
- return: ReactFiber | null;
240
- child: ReactFiber | null;
241
- sibling: ReactFiber | null;
242
- index: number;
243
- ref: null | (((handle: unknown) => void) & { _stringRef?: string | null }) | RefObject;
244
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
245
- pendingProps: any;
246
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
247
- memoizedProps: any;
248
- updateQueue: unknown;
249
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
250
- memoizedState: any;
251
- dependencies: Dependencies | null;
252
- mode: TypeOfMode;
253
- flags: Flags;
254
- subtreeFlags: Flags;
255
- deletions: ReactFiber[] | null;
256
- nextEffect: ReactFiber | null;
257
- firstEffect: ReactFiber | null;
258
- lastEffect: ReactFiber | null;
259
- lanes: Lanes;
260
- childLanes: Lanes;
261
- alternate: ReactFiber | null;
262
- actualDuration?: number;
263
- actualStartTime?: number;
264
- selfBaseDuration?: number;
265
- treeBaseDuration?: number;
266
- _debugID?: number;
267
- _debugSource?: Source | null;
268
- _debugOwner?: ReactFiber | null;
269
- _debugIsCurrentlyTiming?: boolean;
270
- _debugNeedsRemount?: boolean;
271
- _debugHookTypes?: HookType[] | null;
272
- }
81
+ export interface TransitionTracingCallbacks extends ReactReconciler.TransitionTracingCallbacks {}
273
82
 
274
- // ── bippy types (not from react-reconciler) ──
275
-
276
- export interface ContextDependency<T> {
277
- context: ReactContext<T>;
278
- memoizedValue: T;
279
- next: ContextDependency<unknown> | null;
280
- observedBits: number;
83
+ // HACK: React 17 exposes observedBits while React 18+ exposes memoizedValue on context dependencies.
84
+ export interface ContextDependency<T> extends Omit<
85
+ ReactReconciler.ContextDependency<T>,
86
+ "observedBits"
87
+ > {
88
+ memoizedValue?: T;
89
+ observedBits?: number;
281
90
  }
282
91
 
283
- export interface Dependencies {
92
+ export interface Dependencies extends Omit<ReactReconciler.Dependencies, "firstContext"> {
284
93
  firstContext: ContextDependency<unknown> | null;
285
- lanes: Lanes;
286
94
  }
287
95
 
288
96
  export interface Effect {
@@ -294,14 +102,6 @@ export interface Effect {
294
102
  tag: number;
295
103
  }
296
104
 
297
- export interface Family {
298
- current: unknown;
299
- }
300
-
301
- /**
302
- * React 19 flight metadata for a server component owner (ReactComponentInfo).
303
- * Unlike client owners it has no `tag`; the owner chain continues via `owner`.
304
- */
305
105
  export interface ServerComponentInfo {
306
106
  name?: string;
307
107
  env?: string;
@@ -309,19 +109,31 @@ export interface ServerComponentInfo {
309
109
  debugStack?: Error | null;
310
110
  }
311
111
 
312
- export interface RendererRefreshUpdate {
313
- staleFamilies: Set<Family>;
314
- updatedFamilies: Set<Family>;
112
+ export interface ReactDebugInfo {
113
+ debugLocation?: unknown;
114
+ env?: string;
115
+ name?: string;
116
+ }
117
+
118
+ export interface FiberDebugSource extends Source {
119
+ columnNumber?: number;
315
120
  }
316
121
 
317
- /**
318
- * Represents a react-internal Fiber node.
319
- */
320
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
321
- export type Fiber<T = any> = Omit<
322
- ReactFiber,
122
+ export interface FiberUpdateQueue {
123
+ [key: string]: unknown;
124
+ dispatch?: unknown;
125
+ lastEffect: Effect | null;
126
+ memoCache?: unknown;
127
+ }
128
+
129
+ // HACK: @types/react-reconciler does not yet include React 19 debug fields or recursive server owners.
130
+ export interface Fiber<T = unknown> extends Omit<
131
+ ReactReconciler.Fiber,
323
132
  | "alternate"
133
+ | "_debugOwner"
134
+ | "_debugSource"
324
135
  | "child"
136
+ | "deletions"
325
137
  | "dependencies"
326
138
  | "memoizedProps"
327
139
  | "memoizedState"
@@ -329,38 +141,35 @@ export type Fiber<T = any> = Omit<
329
141
  | "return"
330
142
  | "sibling"
331
143
  | "stateNode"
144
+ | "tag"
332
145
  | "updateQueue"
333
- > & {
334
- _debugInfo?: Array<{
335
- debugLocation?: unknown;
336
- env?: string;
337
- name?: string;
338
- }>;
339
- _debugOwner?: Fiber;
340
- // react <19
341
- _debugSource?: {
342
- columnNumber?: number;
343
- fileName: string;
344
- lineNumber: number;
345
- };
346
- // react 19+
347
- // https://github.com/facebook/react/issues/29092?utm_source=chatgpt.com
146
+ > {
147
+ _debugInfo?: ReactDebugInfo[];
148
+ _debugOwner?: Fiber | ServerComponentInfo | null;
149
+ _debugSource?: FiberDebugSource | null;
348
150
  _debugStack?: Error & { stack: string };
349
151
  alternate: Fiber | null;
350
152
  child: Fiber | null;
153
+ deletions: Fiber[] | null;
351
154
  dependencies: Dependencies | null;
155
+ effectTag?: number;
352
156
  memoizedProps: Props;
353
- memoizedState: MemoizedState;
157
+ memoizedState: MemoizedState | null;
354
158
  pendingProps: Props;
355
-
356
159
  return: Fiber | null;
357
160
  sibling: Fiber | null;
358
161
  stateNode: T;
359
- updateQueue: {
360
- [key: string]: unknown;
361
- lastEffect: Effect | null;
362
- };
363
- };
162
+ tag: WorkTag;
163
+ updateQueue: FiberUpdateQueue;
164
+ }
165
+
166
+ export interface HostFiber<T = unknown> extends Fiber<T> {
167
+ tag: HostWorkTag;
168
+ }
169
+
170
+ export interface FiberRoot {
171
+ current: Fiber;
172
+ }
364
173
 
365
174
  export interface MemoizedState {
366
175
  [key: string]: unknown;
@@ -372,38 +181,55 @@ export interface Props {
372
181
  [key: string]: unknown;
373
182
  }
374
183
 
184
+ export interface ReactDevToolsEventHandler {
185
+ (data: unknown): void;
186
+ }
187
+
375
188
  export interface ReactDevToolsGlobalHook {
376
189
  _instrumentationIsActive?: boolean;
377
190
  _instrumentationSource?: string;
378
191
  checkDCE: (fn: unknown) => void;
192
+ emit?: (event: string, data?: unknown) => void;
193
+ getFiberRoots?: (rendererID: number) => Set<FiberRoot>;
379
194
  hasUnsupportedRendererAttached: boolean;
380
195
  inject: (renderer: ReactRenderer) => number;
381
- // https://github.com/aidenybai/bippy/issues/43
382
- on: () => void;
383
- onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
196
+ off?: (event: string, handler: ReactDevToolsEventHandler) => void;
197
+ on: (event: string, handler: ReactDevToolsEventHandler) => void;
198
+ onCommitFiberRoot: (
199
+ rendererID: number,
200
+ root: FiberRoot,
201
+ priority: number | void,
202
+ didError?: boolean,
203
+ ) => void;
384
204
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
385
205
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
386
- // called by dev builds of react-reconciler on root schedule; absent from
387
- // the hook react-refresh installs, so it stays optional
388
206
  onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
389
207
  renderers: Map<number, ReactRenderer>;
208
+ sub?: (event: string, handler: ReactDevToolsEventHandler) => () => void;
390
209
  supportsFiber: boolean;
391
-
392
210
  supportsFlight: boolean;
393
211
  }
394
212
 
395
- // https://github.com/facebook/react/blob/6a4b46cd70d2672bc4be59dcb5b8dede22ed0cef/packages/react-devtools-shared/src/backend/types.js
396
- export interface ReactRenderer {
397
- bundleType: 0 /* PROD */ | 1 /* DEV */;
398
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
399
- currentDispatcherRef: any;
400
- // dev only: https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberReconciler.js#L842
213
+ export interface LegacyDispatcherRef {
214
+ current: unknown;
215
+ }
216
+
217
+ export interface CurrentDispatcherRef {
218
+ H: unknown;
219
+ }
220
+
221
+ export type RendererDispatcherRef = CurrentDispatcherRef | LegacyDispatcherRef;
222
+
223
+ export interface ReactRenderer extends Omit<
224
+ ReactReconciler.DevToolsConfig<unknown, unknown, unknown>,
225
+ "findFiberByHostInstance"
226
+ > {
227
+ currentDispatcherRef?: RendererDispatcherRef | null;
401
228
  findFiberByHostInstance?: (hostInstance: unknown) => Fiber | null;
402
- // react devtools
403
- getCurrentFiber?: (fiber: Fiber) => Fiber | null;
229
+ getCurrentFiber?: () => Fiber | null;
404
230
  overrideContext?: (fiber: Fiber, contextType: unknown, path: string[], value: unknown) => void;
405
231
 
406
- overrideHookState?: (fiber: Fiber, id: string, path: string[], value: unknown) => void;
232
+ overrideHookState?: (fiber: Fiber, id: number, path: string[], value: unknown) => void;
407
233
  overrideHookStateDeletePath?: (fiber: Fiber, id: number, path: Array<number | string>) => void;
408
234
  overrideHookStateRenamePath?: (
409
235
  fiber: Fiber,
@@ -418,18 +244,13 @@ export interface ReactRenderer {
418
244
  oldPath: Array<number | string>,
419
245
  newPath: Array<number | string>,
420
246
  ) => void;
421
- reconcilerVersion: string;
422
- rendererPackageName: string;
423
- // react refresh
424
- scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
247
+ reconcilerVersion?: string;
248
+ scheduleRetry?: (fiber: Fiber) => void;
425
249
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
426
250
  scheduleUpdate?: (fiber: Fiber) => void;
427
251
 
428
- setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
429
- setRefreshHandler?: (handler: ((fiber: Fiber) => Family | null) | null) => void;
430
- setSuspenseHandler?: (newShouldSuspendImpl: (suspenseInstance: unknown) => void) => void;
431
-
432
- version: string;
252
+ setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean | null) => void;
253
+ setSuspenseHandler?: (newShouldSuspendImpl: (fiber: Fiber) => boolean) => void;
433
254
  }
434
255
 
435
256
  declare global {
@@ -9,8 +9,8 @@ export interface Unsubscribe extends Disposable {
9
9
  * @example
10
10
  * ```ts
11
11
  * using instrumentation = instrument({ onCommitFiberRoot });
12
- * using refresh = instrumentReactRefresh({ onRefresh: handleRefresh });
13
- * // both torn down automatically at scope exit
12
+ * using rendererSubscription = onRendererInject(handleRenderer);
13
+ * // both are torn down automatically at scope exit
14
14
  * ```
15
15
  */
16
16
  export const toUnsubscribe = (dispose: () => void): Unsubscribe =>
@@ -1,19 +0,0 @@
1
- /**
2
- * @license bippy
3
- *
4
- * Copyright (c) Aiden Bai
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- const e=require(`./rdt-hook.cjs`),t=require(`./core.cjs`),n=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,r=[`rsc://`,`file:///`,`webpack-internal://`,`webpack://`,`node:`,`turbopack://`,`metro://`,`/app-pages-browser/`,`/(app-pages-browser)/`],i=[`rsc://`,`about://React/`],a=[`<anonymous>`,`eval`,``],o=/\.(jsx|tsx|ts|js)$/,s=/(\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\.(js|mjs|cjs)$|[\da-f]{8,}\.(js|mjs|cjs)$|[-_.][\da-f]{20,}\.(js|mjs|cjs)$|\/dist\/|\/build\/|\/.next\/|\/out\/|\/node_modules\/|\.webpack\.|\.vite\.|\.turbopack\./i,c=/^\?[\w~.-]+(?:=[^&#]*)?(?:&[\w~.-]+(?:=[^&#]*)?)*$/,l=/\(at [^)]+\)$/,u=[`react_stack_bottom_frame`,`react-stack-bottom-frame`],d=/(^|@)\S+:\d+/,f=/^\s*at .*(\S+:\d+|\(native\))/m,ee=/^(eval@)?(\[native code\])?$/,p=(e,t)=>{if(t?.includeInElement!==!1){let n=e.split(`
10
- `),r=[];for(let e of n)if(/^\s*at\s+/.test(e)){let t=g(e,void 0)[0];t&&r.push(t)}else if(/^\s*in\s+/.test(e)){let t=e.replace(/^\s*in\s+/,``).replace(/\s*\(at .*\)$/,``);r.push({functionName:t,source:e})}else if(e.match(d)){let t=_(e,void 0)[0];t&&r.push(t)}return h(r,t)}return e.match(f)?g(e,t):_(e,t)},m=e=>{if(!e.includes(`:`))return[e,void 0,void 0];let t=e.startsWith(`(`)&&/:\d+\)$/.test(e)?e.slice(1,-1):e,n=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(t);return n?[n[1],n[2]||void 0,n[3]||void 0]:[t,void 0,void 0]},h=(e,t)=>t&&t.slice!=null?Array.isArray(t.slice)?e.slice(t.slice[0],t.slice[1]):e.slice(0,t.slice):e,g=(e,t)=>h(e.split(`
11
- `).filter(e=>!!e.match(f)),t).map(e=>{let t=e;t.includes(`(eval `)&&(t=t.replace(/eval code/g,`eval`).replace(/(\(eval at [^()]*)|(,.*$)/g,``));let n=t.replace(/^\s+/,``).replace(/\(eval code/g,`(`).replace(/^.*?\s+/,``),r=n.match(/ (\(.+\)$)/);n=r?n.replace(r[0],``):n;let i=m(r?r[1]:n);return{functionName:r&&n||void 0,fileName:[`eval`,`<anonymous>`].includes(i[0])?void 0:i[0],lineNumber:i[1]?+i[1]:void 0,columnNumber:i[2]?+i[2]:void 0,source:t}}),_=(e,t)=>h(e.split(`
12
- `).filter(e=>!e.match(ee)),t).map(e=>{let t=e;if(t.includes(` > eval`)&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,`:$1`)),!t.includes(`@`)&&!t.includes(`:`))return{functionName:t};{let e=/(([^\n\r"\u2028\u2029]*".[^\n\r"\u2028\u2029]*"[^\n\r@\u2028\u2029]*(?:@[^\n\r"\u2028\u2029]*"[^\n\r@\u2028\u2029]*)*(?:[\n\r\u2028\u2029][^@]*)?)?[^@]*)@/,n=t.match(e),r=n&&n[1]?n[1]:void 0,i=m(t.replace(e,``));return{functionName:r,fileName:i[0],lineNumber:i[1]?+i[1]:void 0,columnNumber:i[2]?+i[2]:void 0,source:t}}}),v=new WeakMap,y=e=>u.some(t=>e.includes(t)),te=e=>{let t=e.getFunctionName?.()??``;if(t)return t;let n=e.getTypeName?.()??``,r=e.getMethodName?.()??``;return n&&r?`${n}.${r}`:r},ne=e=>{let t=[];for(let n=1;n<e.length;n++){let r=e[n],i=te(r);if(y(i))return{frames:t,isTrusted:!0};if(r.isNative?.()){t.push({functionName:i||void 0});continue}let a=r.getScriptNameOrSourceURL?.()??``;!a&&r.isEval?.()&&(a=r.getEvalOrigin?.()??``),t.push({functionName:i&&i!==`<anonymous>`?i:void 0,fileName:a&&a!==`<anonymous>`?a:void 0,lineNumber:r.getLineNumber?.()??void 0,columnNumber:r.getColumnNumber?.()??void 0,enclosingLineNumber:r.getEnclosingLineNumber?.()??void 0,enclosingColumnNumber:r.getEnclosingColumnNumber?.()??void 0,source:` at ${r.toString()}`})}return{frames:t,isTrusted:!1}},re=e=>{let t=-1;for(let n of u)if(t=e.indexOf(n),t!==-1)break;return{frames:p(t===-1?e:e.slice(0,e.lastIndexOf(`
13
- `,t))).slice(1),isTrusted:t!==-1}},b=e=>{let t=v.get(e);if(t)return t;let n=null,r=(e,t)=>{n=ne(t);let r=`${e.name||`Error`}: ${e.message||``}`;for(let e of t)r+=`\n at ${e.toString()}`;return r},i=Error.prepareStackTrace;Error.prepareStackTrace=r;let a;try{a=String(e.stack)}finally{Error.prepareStackTrace=i}let o=n??re(a);return v.set(e,o),o};var x=44,S=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,ie=new Uint8Array(64),C=new Uint8Array(128);for(let e=0;e<S.length;e++){let t=S.charCodeAt(e);ie[e]=t,C[t]=e}function w(e,t){let n=0,r=0,i=0;do i=C[e.next()],n|=(i&31)<<r,r+=5;while(i&32);let a=n&1;return n>>>=1,a&&(n=-2147483648|-n),t+n}function T(e,t){return e.pos>=t?!1:e.peek()!==x}var ae=class{constructor(e){this.pos=0,this.buffer=e}next(){return this.buffer.charCodeAt(this.pos++)}peek(){return this.buffer.charCodeAt(this.pos)}indexOf(e){let{buffer:t,pos:n}=this,r=t.indexOf(e,n);return r===-1?t.length:r}};function E(e){let{length:t}=e,n=new ae(e),r=[],i=0,a=0,o=0,s=0,c=0;do{let e=n.indexOf(`;`),t=[],l=!0,u=0;for(i=0;n.pos<e;){let r;i=w(n,i),i<u&&(l=!1),u=i,T(n,e)?(a=w(n,a),o=w(n,o),s=w(n,s),T(n,e)?(c=w(n,c),r=[i,a,o,s,c]):r=[i,a,o,s]):r=[i],t.push(r),n.pos++}l||oe(t),r.push(t),n.pos=e+1}while(n.pos<=t);return r}function oe(e){e.sort(se)}function se(e,t){return e[0]-t[0]}const D=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,O=/^data:application\/json[^,]+base64,/,ce=/(?:\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+?)[ \t]*$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^*]+?)[ \t]*(?:\*\/)[ \t]*$)/,k=new Map,A=new Map,j=(e,t,n,r,i)=>{if(n<0||n>=e.length)return null;let a=e[n];if(!a||a.length===0)return null;let o=null,s=0,c=a.length-1;for(;s<=c;){let e=s+c>>1;a[e][0]<=r?(o=a[e],s=e+1):c=e-1}if(!o||o.length<4)return null;let[,l,u,d]=o;if(l===void 0||u===void 0||d===void 0)return null;let f=t[l];return f?{columnNumber:d,fileName:f,lineNumber:u+1,isIgnoreListed:i?.has(l)??!1}:null},M=(e,t,n)=>{if(e.sections){let r=t-1,i=null;for(let t of e.sections)if(r>t.offset.line||r===t.offset.line&&n>=t.offset.column)i=t;else break;if(!i)return null;let a=r-i.offset.line,o=r===i.offset.line?n-i.offset.column:n;return j(i.map.mappings,i.map.sources,a,o,i.map.ignoredSourceIndices)}return j(e.mappings,e.sources,t-1,n,e.ignoredSourceIndices)},le=(e,t)=>{let n,r=t.length;for(;r>0&&!n;){let e=t.lastIndexOf(`
14
- `,r-1)+1,i=t.slice(e,r).match(ce);i&&(n=i[1]||i[2]),r=e-1}if(!n)return null;let i=D.test(n);if(!(O.test(n)||i||n.startsWith(`/`))){let t=e.split(`/`);t[t.length-1]=n,n=t.join(`/`)}return n},N=e=>{let t=e.ignoreList??e.x_google_ignoreList;return Array.isArray(t)&&t.length>0?new Set(t):void 0},ue=e=>({file:e.file,ignoredSourceIndices:N(e),mappings:E(e.mappings),names:e.names,sourceRoot:e.sourceRoot,sources:e.sources,sourcesContent:e.sourcesContent,version:3}),de=e=>{let t=e.sections.map(({map:e,offset:t})=>({map:{...e,ignoredSourceIndices:N(e),mappings:E(e.mappings)},offset:t})),n=new Set;for(let e of t)for(let t of e.map.sources)n.add(t);return{file:e.file,mappings:[],names:[],sections:t,sourceRoot:void 0,sources:Array.from(n),sourcesContent:void 0,version:3}},P=e=>{if(!e)return!1;let t=e.trim();if(!t)return!1;let n=t.match(D);if(!n)return!0;let r=n[0].toLowerCase();return r===`http:`||r===`https:`},fe=async(e,t=fetch)=>{if(!P(e))return null;let n=await t(e);if(!n.ok)return null;let r=await n.text();if(!r)return null;let i=le(e,r);if(!i||!P(i)&&!O.test(i))return null;let a=await t(i);if(!a.ok)return null;try{let e=await a.json();return`sections`in e?de(e):ue(e)}catch{return null}},F=async(e,t=!0,n)=>{if(t&&k.has(e))return k.get(e)??null;let r=t?A.get(e):void 0;if(r)return(await r).sourceMap;let i=fe(e,n).then(e=>({sourceMap:e,isTransientFailure:!1}),()=>({sourceMap:null,isTransientFailure:!0}));t&&A.set(e,i);let{sourceMap:a,isTransientFailure:o}=await i;return t&&(A.delete(e),o||k.set(e,a)),a},I=async(e,t=!0,n)=>await Promise.all(e.map(async e=>{if(!e.fileName)return e;let r=await F(e.fileName,t,n);if(!r||typeof e.lineNumber!=`number`||typeof e.columnNumber!=`number`)return e;let i=M(r,e.lineNumber,e.columnNumber);return i?{...e,source:i.fileName&&e.source?e.source.replace(e.fileName,i.fileName):e.source,fileName:i.fileName,lineNumber:i.lineNumber,columnNumber:i.columnNumber,isIgnoreListed:i.isIgnoreListed,isSymbolicated:!0}:e})),L=e=>e._debugStack instanceof Error&&typeof e._debugStack?.stack==`string`,R=e=>typeof e.tag==`number`,z=e=>e._debugOwner,B=e=>{let n=null;if(t.traverseFiber(e,t=>{if(t===e)return!1;let r=t._debugOwner;return(r===e||e.alternate!==null&&r===e.alternate)&&t._debugStack instanceof Error?(n=t._debugStack,!0):!1}),!n)return null;let{frames:r,isTrusted:i}=b(n);if(!i)return null;for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.fileName)return{...t,lineNumber:t.enclosingLineNumber||t.lineNumber,columnNumber:t.enclosingColumnNumber||t.columnNumber}}return null},V=()=>{let t=e.i();for(let n of[...Array.from(e.r),...Array.from(t.renderers.values())]){let e=n.currentDispatcherRef;if(e&&typeof e==`object`)return`H`in e?e.H:e.current}return null},H=t=>{for(let n of e.r){let e=n.currentDispatcherRef;e&&typeof e==`object`&&(`H`in e?e.H=t:e.current=t)}},U=e=>`\n in ${e}`,pe=(e,t)=>{let n=U(e);return t&&(n+=` (at ${t})`),n};let W=!1;const G=new WeakMap,K=(e,n)=>{if(!e||W)return``;let r=G.get(e);if(r!==void 0)return r;let i=Error.prepareStackTrace;Error.prepareStackTrace=void 0,W=!0;let a=V();H(null);let o=console.error,s=console.warn;console.error=()=>{},console.warn=()=>{};try{let r={DetermineComponentFrameRoot(){let t;try{if(n){let n=function(){throw Error()};if(Object.defineProperty(n.prototype,`props`,{set:function(){throw Error()}}),typeof Reflect==`object`&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){t=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){t=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){t=e}let n=e();n&&typeof n.catch==`function`&&n.catch(()=>{})}}catch(e){if(e instanceof Error&&t instanceof Error&&typeof e.stack==`string`)return[e.stack,t.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName=`DetermineComponentFrameRoot`,Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,`name`)?.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,`name`,{value:`DetermineComponentFrameRoot`});let[i,a]=r.DetermineComponentFrameRoot();if(i&&a){let n=i.split(`
15
- `),r=a.split(`
16
- `),o=0,s=0;for(;o<n.length&&!n[o].includes(`DetermineComponentFrameRoot`);)o++;for(;s<r.length&&!r[s].includes(`DetermineComponentFrameRoot`);)s++;if(o===n.length||s===r.length)for(o=n.length-1,s=r.length-1;o>=1&&s>=0&&n[o]!==r[s];)s--;for(;o>=1&&s>=0;o--,s--)if(n[o]!==r[s]){if(o!==1||s!==1)do if(o--,s--,s<0||n[o]!==r[s]){let r=`\n${n[o].replace(` at new `,` at `)}`,i=t.getDisplayName(e);return i&&r.includes(`<anonymous>`)&&(r=r.replace(`<anonymous>`,i)),G.set(e,r),r}while(o>=1&&s>=0);break}}}finally{W=!1,Error.prepareStackTrace=i,H(a),console.error=o,console.warn=s}let c=e?t.getDisplayName(e):``,l=c?U(c):``;return G.set(e,l),l},me=(e,t)=>{let n=e.tag,r=``;switch(n){case 28:r=U(`Activity`);break;case 1:r=K(e.type,!0);break;case 11:r=K(e.type.render,!1);break;case 0:case 15:r=K(e.type,!1);break;case 5:case 26:case 27:r=U(e.type);break;case 16:r=U(`Lazy`);break;case 13:r=e.child!==t&&t!==null?U(`Suspense Fallback`):U(`Suspense`);break;case 19:r=U(`SuspenseList`);break;case 30:r=U(`ViewTransition`);break;default:return``}return r},he=e=>{try{let t=``,n=e,r=null;do{t+=me(n,r);let e=n._debugInfo;if(e&&Array.isArray(e))for(let n=e.length-1;n>=0;n--){let r=e[n];typeof r.name==`string`&&(t+=pe(r.name,r.env))}r=n,n=n.return}while(n);return t}catch(e){return e instanceof Error?`\nError generating stack: ${e.message}\n${e.stack}`:``}},q=e=>{let t=Error.prepareStackTrace;Error.prepareStackTrace=void 0;let n=e;if(!n)return``;Error.prepareStackTrace=t,n.startsWith(`Error: react-stack-top-frame
17
- `)&&(n=n.slice(29));let r=n.indexOf(`
18
- `);r!==-1&&(n=n.slice(r+1));let i=Math.max(n.indexOf(`react_stack_bottom_frame`),n.indexOf(`react-stack-bottom-frame`));if(i!==-1&&(i=n.lastIndexOf(`
19
- `,i)),i!==-1)n=n.slice(0,i);else return``;return n},ge=e=>!!(e.functionName&&e.fileName&&J(e.fileName)),_e=(e,t)=>e.fileName===t.fileName&&e.lineNumber===t.lineNumber&&e.columnNumber===t.columnNumber,ve=e=>{let t=new Map;for(let n of e)for(let e of n.stackFrames){if(!ge(e))continue;let n=e.functionName,r=t.get(n)??[];r.some(t=>_e(t,e))||(r.push(e),t.set(n,r))}return t},ye=(e,t,n)=>{if(!e.functionName)return{...e,isServer:!0};let r=t.get(e.functionName);if(!r||r.length===0)return{...e,isServer:!0};let i=n.get(e.functionName)??0,a=r[i%r.length];return n.set(e.functionName,i+1),{...e,isServer:!0,fileName:a.fileName,lineNumber:a.lineNumber,columnNumber:a.columnNumber,source:e.source?.replace(`(at Server)`,`(${a.fileName}:${a.lineNumber}:${a.columnNumber})`)}},J=e=>i.some(t=>e.startsWith(t)),be=e=>!e.isServer&&e.fileName&&J(e.fileName)?{...e,isServer:!0}:e,xe=e=>{let t=[],n=e;for(;n;)if(R(n)){let e=n;if(n=z(e),n&&L(e)){let{frames:n,isTrusted:r}=b(e._debugStack);if(r)for(let e of n)t.push(be(e))}}else{let e=n;if(n=e.owner,n&&e.debugStack instanceof Error)for(let n of b(e.debugStack).frames)t.push({...n,isServer:!0})}return t},Se=e=>{let n=[];return t.traverseFiber(e,e=>{if(!L(e))return;let r=typeof e.type==`string`?e.type:t.getDisplayName(e.type)||`<anonymous>`;n.push({componentName:r,stackFrames:p(q(e._debugStack?.stack))})},!0),n},Y=async(e,t=!0,n)=>{let r=Se(e),i=p(he(e)),a=ve(r),o=new Map;return I(i.map(e=>(e.source?.includes(`(at Server)`)??!1)||e.source!=null&&l.test(e.source)?ye(e,a,o):e).filter((e,t,n)=>{if(t===0)return!0;let r=n[t-1];return e.functionName!==r.functionName}),t,n)},Ce=e=>!!e.fileName&&!e.isIgnoreListed,X=async(e,n=!0,r)=>{let i=xe(e);if(i.length>0){let a=B(e)??{};a.functionName=t.getDisplayName(e.type)??a.functionName;let o=await I([a,...i],n,r);if(o.some((e,t)=>t>0&&Ce(e)))return o}return Y(e,n,r)},we=e=>{let t=e._debugSource;return t?typeof t==`object`&&!!t&&`fileName`in t&&typeof t.fileName==`string`&&`lineNumber`in t&&typeof t.lineNumber==`number`:!1},Z=e=>e.fileName?{fileName:e.fileName,lineNumber:e.lineNumber,columnNumber:e.columnNumber,functionName:e.functionName}:null,Te=e=>{if(!L(e))return null;let{frames:t,isTrusted:n}=b(e._debugStack);if(!n)return null;for(let e of t)if(e.fileName)return e;return null},Ee=async(e,t=!0,n)=>{if(we(e))return e._debugSource||null;let r=Te(e)??B(e);if(r){let[e]=await I([r],t,n),i=Z(e);if(i)return i}let i=await Y(e,t,n);for(let e of i)if(e.fileName)return Z(e);return null},Q=e=>e.split(`/`).filter(Boolean).length,De=e=>e.split(`/`).filter(Boolean)[0]??null,Oe=e=>{let t=e.indexOf(`/`,1);if(t===-1||Q(e.slice(0,t))!==1)return e;let n=e.slice(t);if(!o.test(n)||Q(n)<2)return e;let r=De(n);return!r||r.startsWith(`@`)||r.length>4?e:n},$=e=>{if(!e||a.some(t=>t===e))return``;let t=e,i=t.startsWith(`http://`)||t.startsWith(`https://`);if(i)try{t=new URL(t).pathname}catch{}if(i&&(t=Oe(t)),t.startsWith(`about://React/`)){let e=t.slice(14),n=e.indexOf(`/`),r=e.indexOf(`:`);t=n!==-1&&(r===-1||n<r)?e.slice(n+1):e}let o=!0;for(;o;){o=!1;for(let e of r)if(t.startsWith(e)){t=t.slice(e.length),e===`file:///`&&(t=`/${t.replace(/^\/+/,``)}`),o=!0;break}}if(n.test(t)){let e=t.match(n);e&&(t=t.slice(e[0].length))}if(t.startsWith(`//`)){let e=t.indexOf(`/`,2);t=e===-1?``:t.slice(e)}let s=t.indexOf(`?`);if(s!==-1){let e=t.slice(s);c.test(e)&&(t=t.slice(0,s))}return t},ke=e=>{let t=$(e);return!(!t||!o.test(t)||s.test(t))};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return I}});