bippy 0.3.34 → 0.5.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 CHANGED
@@ -20,11 +20,13 @@ by default, you cannot access react internals. bippy bypasses this by "pretendin
20
20
  ```jsx
21
21
  import { onCommitFiberRoot, traverseFiber } from 'bippy'; // must be imported BEFORE react
22
22
 
23
- onCommitFiberRoot((root) => {
24
- traverseFiber(root.current, (fiber) => {
25
- // prints every fiber in the current React tree
26
- console.log('fiber:', fiber);
27
- });
23
+ instrument({
24
+ onCommitFiberRoot: (root) => {
25
+ traverseFiber(root.current, (fiber) => {
26
+ // prints every fiber in the current React tree
27
+ console.log('fiber:', fiber);
28
+ });
29
+ },
28
30
  });
29
31
  ```
30
32
 
@@ -244,7 +246,7 @@ traverseProps(fiber, (propName, next, prev) => {
244
246
 
245
247
  ### traverseState
246
248
 
247
- traverses the state (useState, useReducer, etc.) and effects that set state of a fiber.
249
+ traverses the state (`useState`, `useReducer`, etc.) and effects that set state of a fiber.
248
250
 
249
251
  ```typescript
250
252
  import { traverseState } from 'bippy';
@@ -258,7 +260,7 @@ traverseState(fiber, (next, prev) => {
258
260
 
259
261
  ### traverseContexts
260
262
 
261
- traverses the contexts (useContext) of a fiber.
263
+ traverses the contexts (`useContext`) of a fiber.
262
264
 
263
265
  ```typescript
264
266
  import { traverseContexts } from 'bippy';
@@ -464,7 +466,7 @@ the function accepts a fiber and a partial object containing the props to overri
464
466
 
465
467
  ### overrideHookState
466
468
 
467
- overrides hook state (usestate, usereducer, etc.) at runtime by hook id.
469
+ overrides hook state (`useState`, `useReducer`, etc.) at runtime by hook id.
468
470
 
469
471
  ```typescript
470
472
  import { overrideHookState } from 'bippy';
@@ -505,6 +507,35 @@ overrideContext(fiber, ThemeContext, 'dark');
505
507
 
506
508
  the function traverses up the fiber tree to find the context provider matching the provided context type and overrides its value.
507
509
 
510
+ ### getSource
511
+
512
+ gets the source code location of a composite fiber.
513
+
514
+ ```typescript
515
+ import { getSource } from 'bippy/source';
516
+
517
+ // random fiber on the DOM
518
+ const hostFiber = getFiberFromHostInstance(document.querySelector('div'));
519
+
520
+ // get nearest composite fiber up the tree
521
+ const compositeFiber = traverseFiber(
522
+ hostFiber,
523
+ (fiber) => {
524
+ if (isCompositeFiber(fiber)) {
525
+ return fiber;
526
+ }
527
+ },
528
+ true,
529
+ );
530
+
531
+ const source = await getSource(compositeFiber);
532
+ // {
533
+ // columnNumber: 12,
534
+ // fileName: 'path/to/file.tsx',
535
+ // lineNumber: 12,
536
+ // }
537
+ ```
538
+
508
539
  ## examples
509
540
 
510
541
  the best way to understand bippy is to [read the source code](https://github.com/aidenybai/bippy/blob/main/src/core.ts). here are some examples of how you can use it:
@@ -0,0 +1,331 @@
1
+ import * as React$1 from "react";
2
+ import { BundleType, ComponentSelector, DevToolsConfig, Fiber, FiberRoot, Flags, HasPseudoClassSelector, HookType, HostConfig, LanePriority, Lanes, MutableSource, OpaqueHandle, OpaqueRoot, React$AbstractComponent, ReactConsumer, ReactContext, ReactPortal, ReactProvider, ReactProviderType, RefObject, RoleSelector, RootTag, Selector, Source, SuspenseHydrationCallbacks, TestNameSelector, TextSelector, Thenable, TransitionTracingCallbacks, TypeOfMode, WorkTag } from "react-reconciler";
3
+
4
+ //#region src/types.d.ts
5
+ interface ContextDependency<T> {
6
+ context: ReactContext<T>;
7
+ memoizedValue: T;
8
+ next: ContextDependency<unknown> | null;
9
+ observedBits: number;
10
+ }
11
+ interface Dependencies {
12
+ firstContext: ContextDependency<unknown> | null;
13
+ lanes: Lanes;
14
+ }
15
+ interface Effect {
16
+ [key: string]: unknown;
17
+ create: (...args: unknown[]) => unknown;
18
+ deps: null | unknown[];
19
+ destroy: ((...args: unknown[]) => unknown) | null;
20
+ next: Effect | null;
21
+ tag: number;
22
+ }
23
+ interface Family {
24
+ current: unknown;
25
+ }
26
+ /**
27
+ * Represents a react-internal Fiber node.
28
+ */
29
+ type Fiber$1<T = any> = Omit<Fiber, 'alternate' | 'child' | 'dependencies' | 'memoizedProps' | 'memoizedState' | 'pendingProps' | 'return' | 'sibling' | 'stateNode' | 'updateQueue'> & {
30
+ _debugInfo?: Array<{
31
+ debugLocation?: unknown;
32
+ env?: string;
33
+ name?: string;
34
+ }>;
35
+ _debugOwner?: Fiber$1;
36
+ _debugSource?: {
37
+ columnNumber?: number;
38
+ fileName: string;
39
+ lineNumber: number;
40
+ };
41
+ _debugStack?: Error & {
42
+ stack: string;
43
+ };
44
+ alternate: Fiber$1 | null;
45
+ child: Fiber$1 | null;
46
+ dependencies: Dependencies | null;
47
+ memoizedProps: Props;
48
+ memoizedState: MemoizedState;
49
+ pendingProps: Props;
50
+ return: Fiber$1 | null;
51
+ sibling: Fiber$1 | null;
52
+ stateNode: T;
53
+ updateQueue: {
54
+ [key: string]: unknown;
55
+ lastEffect: Effect | null;
56
+ };
57
+ };
58
+ interface MemoizedState {
59
+ [key: string]: unknown;
60
+ memoizedState: unknown;
61
+ next: MemoizedState | null;
62
+ }
63
+ interface Props {
64
+ [key: string]: unknown;
65
+ }
66
+ interface ReactDevToolsGlobalHook {
67
+ _instrumentationIsActive?: boolean;
68
+ _instrumentationSource?: string;
69
+ checkDCE: (fn: unknown) => void;
70
+ hasUnsupportedRendererAttached: boolean;
71
+ inject: (renderer: ReactRenderer) => number;
72
+ on: () => void;
73
+ onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
74
+ onCommitFiberUnmount: (rendererID: number, fiber: Fiber$1) => void;
75
+ onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
76
+ renderers: Map<number, ReactRenderer>;
77
+ supportsFiber: boolean;
78
+ supportsFlight: boolean;
79
+ }
80
+ interface ReactRenderer {
81
+ bundleType: 0 | 1;
82
+ currentDispatcherRef: any;
83
+ findFiberByHostInstance?: (hostInstance: unknown) => Fiber$1 | null;
84
+ getCurrentFiber?: (fiber: Fiber$1) => Fiber$1 | null;
85
+ overrideContext?: (fiber: Fiber$1, contextType: unknown, path: string[], value: unknown) => void;
86
+ overrideHookState?: (fiber: Fiber$1, id: string, path: string[], value: unknown) => void;
87
+ overrideHookStateDeletePath?: (fiber: Fiber$1, id: number, path: Array<number | string>) => void;
88
+ overrideHookStateRenamePath?: (fiber: Fiber$1, id: number, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
89
+ overrideProps?: (fiber: Fiber$1, path: string[], value: unknown) => void;
90
+ overridePropsDeletePath?: (fiber: Fiber$1, path: Array<number | string>) => void;
91
+ overridePropsRenamePath?: (fiber: Fiber$1, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
92
+ reconcilerVersion: string;
93
+ rendererPackageName: string;
94
+ scheduleRefresh?: (root: FiberRoot, update: {
95
+ staleFamilies: Set<Family>;
96
+ updatedFamilies: Set<Family>;
97
+ }) => void;
98
+ scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
99
+ scheduleUpdate?: (fiber: Fiber$1) => void;
100
+ setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber$1) => boolean) => void;
101
+ setRefreshHandler?: (handler: ((fiber: Fiber$1) => Family | null) | null) => void;
102
+ setSuspenseHandler?: (newShouldSuspendImpl: (suspenseInstance: unknown) => void) => void;
103
+ version: string;
104
+ }
105
+ declare global {
106
+ var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
107
+ } //#endregion
108
+ //#region src/rdt-hook.d.ts
109
+ declare const version: string | undefined;
110
+ declare const BIPPY_INSTRUMENTATION_STRING: string;
111
+ declare const isRealReactDevtools: (rdtHook?: ReactDevToolsGlobalHook) => boolean;
112
+ declare const isReactRefresh: (rdtHook?: ReactDevToolsGlobalHook) => boolean;
113
+ declare const _renderers: Set<ReactRenderer>;
114
+ declare const installRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
115
+ declare const patchRDTHook: (onActive?: () => unknown) => void;
116
+ declare const hasRDTHook: () => boolean;
117
+ /**
118
+ * Returns the current React DevTools global hook.
119
+ */
120
+ declare const getRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
121
+ declare const isClientEnvironment: () => boolean;
122
+ /**
123
+ * Usually used purely for side effect
124
+ */
125
+ declare const safelyInstallRDTHook: () => void;
126
+
127
+ //#endregion
128
+ //#region src/core.d.ts
129
+ declare const FunctionComponentTag = 0;
130
+ declare const ClassComponentTag = 1;
131
+ declare const HostRootTag = 3;
132
+ declare const HostComponentTag = 5;
133
+ declare const HostTextTag = 6;
134
+ declare const FragmentTag = 7;
135
+ declare const ContextConsumerTag = 9;
136
+ declare const ForwardRefTag = 11;
137
+ declare const SuspenseComponentTag = 13;
138
+ declare const MemoComponentTag = 14;
139
+ declare const SimpleMemoComponentTag = 15;
140
+ declare const LazyComponentTag = 16;
141
+ declare const DehydratedSuspenseComponentTag = 18;
142
+ declare const SuspenseListComponentTag = 19;
143
+ declare const OffscreenComponentTag = 22;
144
+ declare const LegacyHiddenComponentTag = 23;
145
+ declare const HostHoistableTag = 26;
146
+ declare const HostSingletonTag = 27;
147
+ declare const ActivityComponentTag = 28;
148
+ declare const ViewTransitionComponentTag = 30;
149
+ declare const CONCURRENT_MODE_NUMBER = 60111;
150
+ declare const ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.element)";
151
+ declare const TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.transitional.element)";
152
+ declare const CONCURRENT_MODE_SYMBOL_STRING = "Symbol(react.concurrent_mode)";
153
+ declare const DEPRECATED_ASYNC_MODE_SYMBOL_STRING = "Symbol(react.async_mode)";
154
+ /**
155
+ * Returns `true` if object is a React Element.
156
+ *
157
+ * @see https://react.dev/reference/react/isValidElement
158
+ */
159
+ declare const isValidElement: (element: unknown) => element is React$1.ReactElement;
160
+ /**
161
+ * Returns `true` if object is a React Fiber.
162
+ */
163
+ declare const isValidFiber: (fiber: unknown) => fiber is Fiber$1;
164
+ /**
165
+ * Returns `true` if fiber is a host fiber. Host fibers are DOM nodes in react-dom, `View` in react-native, etc.
166
+ *
167
+ * @see https://reactnative.dev/architecture/glossary#host-view-tree-and-host-view
168
+ */
169
+ declare const isHostFiber: (fiber: Fiber$1) => boolean;
170
+ /**
171
+ * Returns `true` if fiber is a composite fiber. Composite fibers are fibers that can render (like functional components, class components, etc.)
172
+ *
173
+ * @see https://reactnative.dev/architecture/glossary#react-composite-components
174
+ */
175
+ declare const isCompositeFiber: (fiber: Fiber$1) => boolean;
176
+ /**
177
+ * Returns `true` if the object is a {@link Fiber}
178
+ */
179
+ declare const isFiber: (maybeFiber: unknown) => maybeFiber is Fiber$1;
180
+ /**
181
+ * Returns `true` if the two {@link Fiber}s are the same reference
182
+ */
183
+ declare const areFiberEqual: (fiberA: Fiber$1, fiberB: Fiber$1) => boolean;
184
+ /**
185
+ * Traverses up or down a {@link Fiber}'s contexts, return `true` to stop and select the current and previous context value.
186
+ */
187
+ declare const traverseContexts: (fiber: Fiber$1, selector: (nextValue: ContextDependency<unknown> | null | undefined, prevValue: ContextDependency<unknown> | null | undefined) => boolean | void) => boolean;
188
+ /**
189
+ * Traverses up or down a {@link Fiber}'s states, return `true` to stop and select the current and previous state value. This stores both state values and effects.
190
+ */
191
+ declare const traverseState: (fiber: Fiber$1, selector: (nextValue: MemoizedState | null | undefined, prevValue: MemoizedState | null | undefined) => boolean | void) => boolean;
192
+ /**
193
+ * Traverses up or down a {@link Fiber}'s props, return `true` to stop and select the current and previous props value.
194
+ */
195
+ declare const traverseProps: (fiber: Fiber$1, selector: (propName: string, nextValue: unknown, prevValue: unknown) => boolean | void) => boolean;
196
+ /**
197
+ * Returns `true` if the {@link Fiber} has rendered. Note that this does not mean the fiber has rendered in the current commit, just that it has rendered in the past.
198
+ */
199
+ declare const didFiberRender: (fiber: Fiber$1) => boolean;
200
+ /**
201
+ * Returns `true` if the {@link Fiber} has committed. Note that this does not mean the fiber has committed in the current commit, just that it has committed in the past.
202
+ */
203
+ declare const didFiberCommit: (fiber: Fiber$1) => boolean;
204
+ /**
205
+ * Returns all host {@link Fiber}s that have committed and rendered.
206
+ */
207
+ declare const getMutatedHostFibers: (fiber: Fiber$1) => Fiber$1[];
208
+ /**
209
+ * Returns the stack of {@link Fiber}s from the current fiber to the root fiber.
210
+ *
211
+ * @example
212
+ * ```ts
213
+ * [fiber, fiber.return, fiber.return.return, ...]
214
+ * ```
215
+ */
216
+ declare const getFiberStack: (fiber: Fiber$1) => Fiber$1[];
217
+ /**
218
+ * Returns `true` if the {@link Fiber} should be filtered out during reconciliation.
219
+ */
220
+ declare const shouldFilterFiber: (fiber: Fiber$1) => boolean;
221
+ /**
222
+ * Returns the nearest host {@link Fiber} to the current {@link Fiber}.
223
+ */
224
+ declare const getNearestHostFiber: (fiber: Fiber$1, ascending?: boolean) => Fiber$1 | null;
225
+ /**
226
+ * Returns all host {@link Fiber}s in the tree that are associated with the current {@link Fiber}.
227
+ */
228
+ declare const getNearestHostFibers: (fiber: Fiber$1) => Fiber$1[];
229
+ /**
230
+ * Traverses up or down a {@link Fiber}, return `true` to stop and select a node.
231
+ */
232
+ declare function traverseFiber(fiber: Fiber$1 | null, selector: (node: Fiber$1) => boolean | void, ascending?: boolean): Fiber$1 | null;
233
+ declare function traverseFiber(fiber: Fiber$1 | null, selector: (node: Fiber$1) => Promise<boolean | void>, ascending?: boolean): Promise<Fiber$1 | null>;
234
+ declare const traverseFiberSync: (fiber: Fiber$1 | null, selector: (node: Fiber$1) => boolean | void, ascending?: boolean) => Fiber$1 | null;
235
+ declare const traverseFiberAsync: (fiber: Fiber$1 | null, selector: (node: Fiber$1) => Promise<boolean | void>, ascending?: boolean) => Promise<Fiber$1 | null>;
236
+ /**
237
+ * Returns the timings of the {@link Fiber}.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * const { selfTime, totalTime } = getTimings(fiber);
242
+ * console.log(selfTime, totalTime);
243
+ * ```
244
+ */
245
+ declare const getTimings: (fiber?: Fiber$1 | null) => {
246
+ selfTime: number;
247
+ totalTime: number;
248
+ };
249
+ /**
250
+ * Returns `true` if the {@link Fiber} uses React Compiler's memo cache.
251
+ */
252
+ declare const hasMemoCache: (fiber: Fiber$1) => boolean;
253
+ /**
254
+ * Returns the type (e.g. component definition) of the {@link Fiber}
255
+ */
256
+ declare const getType: (type: unknown) => null | React$1.ComponentType<unknown>;
257
+ /**
258
+ * Returns the display name of the {@link Fiber} type.
259
+ */
260
+ declare const getDisplayName: (type: unknown) => null | string;
261
+ /**
262
+ * Returns the build type of the React renderer.
263
+ */
264
+ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" | "production";
265
+ /**
266
+ * Returns `true` if bippy's instrumentation is active.
267
+ */
268
+ declare const isInstrumentationActive: () => boolean;
269
+ /**
270
+ * Returns the latest fiber (since it may be double-buffered).
271
+ */
272
+ declare const getLatestFiber: (fiber: Fiber$1) => Fiber$1;
273
+ type RenderHandler = <S>(fiber: Fiber$1, phase: RenderPhase, state?: S) => unknown;
274
+ type RenderPhase = 'mount' | 'unmount' | 'update';
275
+ declare const fiberIdMap: WeakMap<Fiber$1, number>;
276
+ declare const setFiberId: (fiber: Fiber$1, id?: number) => void;
277
+ declare const getFiberId: (fiber: Fiber$1) => number;
278
+ declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber$1, traverseSiblings: boolean) => void;
279
+ declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber$1, prevFiber: Fiber$1, parentFiber: Fiber$1 | null) => void;
280
+ declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber$1) => void;
281
+ declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber$1) => void;
282
+ /**
283
+ * Creates a fiber visitor function. Must pass a fiber root and a render handler.
284
+ * @example
285
+ * traverseRenderedFibers(root, (fiber, phase) => {
286
+ * console.log(phase)
287
+ * })
288
+ */
289
+ declare const traverseRenderedFibers: (root: FiberRoot, onRender: RenderHandler) => void;
290
+ declare const injectOverrideMethods: () => {
291
+ overrideContext: ((fiber: Fiber$1, contextType: unknown, path: string[], value: unknown) => void) | null | undefined;
292
+ overrideHookState: ((fiber: Fiber$1, id: string, path: string[], value: unknown) => void) | null | undefined;
293
+ overrideProps: ((fiber: Fiber$1, path: string[], value: unknown) => void) | null | undefined;
294
+ } | null | undefined;
295
+ declare const overrideProps: (fiber: Fiber$1, partialValue: Record<string, unknown>) => void;
296
+ declare const overrideHookState: (fiber: Fiber$1, id: number, partialValue: Record<string, unknown>) => void;
297
+ declare const overrideContext: (fiber: Fiber$1, contextType: unknown, partialValue: Record<string, unknown>) => void;
298
+ interface InstrumentationOptions {
299
+ name?: string;
300
+ onActive?: () => unknown;
301
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: number | void) => unknown;
302
+ onCommitFiberUnmount?: (rendererID: number, fiber: Fiber$1) => unknown;
303
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
304
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: React$1.ReactNode) => unknown;
305
+ }
306
+ /**
307
+ * Instruments the DevTools hook.
308
+ * @example
309
+ * const hook = instrument({
310
+ * onActive() {
311
+ * console.log('initialized');
312
+ * },
313
+ * onCommitFiberRoot(rendererID, root) {
314
+ * console.log('fiberRoot', root.current)
315
+ * },
316
+ * });
317
+ */
318
+ declare const instrument: (options: InstrumentationOptions) => ReactDevToolsGlobalHook;
319
+ declare const getFiberFromHostInstance: <T>(hostInstance: T) => Fiber$1 | null;
320
+ declare const INSTALL_ERROR: Error;
321
+ declare const _fiberRoots: Set<any>;
322
+ declare const secure: (options: InstrumentationOptions, secureOptions?: {
323
+ dangerouslyRunInProduction?: boolean;
324
+ installCheckTimeout?: number;
325
+ isProduction?: boolean;
326
+ minReactMajorVersion?: number;
327
+ onError?: (error?: unknown) => unknown;
328
+ }) => InstrumentationOptions;
329
+
330
+ //#endregion
331
+ export { ActivityComponentTag, BIPPY_INSTRUMENTATION_STRING, BundleType, CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ClassComponentTag, ComponentSelector, ContextConsumerTag, ContextDependency, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponentTag, Dependencies, DevToolsConfig, ELEMENT_TYPE_SYMBOL_STRING, Effect, Family, Fiber$1 as Fiber, FiberRoot, Flags, ForwardRefTag, FragmentTag, FunctionComponentTag, HasPseudoClassSelector, HookType, HostComponentTag, HostConfig, HostHoistableTag, HostRootTag, HostSingletonTag, HostTextTag, INSTALL_ERROR, InstrumentationOptions, LanePriority, Lanes, LazyComponentTag, LegacyHiddenComponentTag, MemoComponentTag, MemoizedState, MutableSource, OffscreenComponentTag, OpaqueHandle, OpaqueRoot, Props, React$AbstractComponent, ReactConsumer, ReactContext, ReactDevToolsGlobalHook, ReactPortal, ReactProvider, ReactProviderType, ReactRenderer, RefObject, RenderHandler, RenderPhase, RoleSelector, RootTag, Selector, SimpleMemoComponentTag, Source, SuspenseComponentTag, SuspenseHydrationCallbacks, SuspenseListComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, TestNameSelector, TextSelector, Thenable, TransitionTracingCallbacks, TypeOfMode, ViewTransitionComponentTag, WorkTag, _fiberRoots, _renderers, areFiberEqual, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getLatestFiber, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, injectOverrideMethods, installRDTHook, instrument, isClientEnvironment, isCompositeFiber, isFiber, isHostFiber, isInstrumentationActive, isReactRefresh, isRealReactDevtools, isValidElement, isValidFiber, mountFiberRecursively, overrideContext, overrideHookState, overrideProps, patchRDTHook, safelyInstallRDTHook, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseFiber, traverseFiberAsync, traverseFiberSync, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };