bippy 0.3.34 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -244,7 +244,7 @@ traverseProps(fiber, (propName, next, prev) => {
244
244
 
245
245
  ### traverseState
246
246
 
247
- traverses the state (useState, useReducer, etc.) and effects that set state of a fiber.
247
+ traverses the state (`useState`, `useReducer`, etc.) and effects that set state of a fiber.
248
248
 
249
249
  ```typescript
250
250
  import { traverseState } from 'bippy';
@@ -258,7 +258,7 @@ traverseState(fiber, (next, prev) => {
258
258
 
259
259
  ### traverseContexts
260
260
 
261
- traverses the contexts (useContext) of a fiber.
261
+ traverses the contexts (`useContext`) of a fiber.
262
262
 
263
263
  ```typescript
264
264
  import { traverseContexts } from 'bippy';
@@ -464,7 +464,7 @@ the function accepts a fiber and a partial object containing the props to overri
464
464
 
465
465
  ### overrideHookState
466
466
 
467
- overrides hook state (usestate, usereducer, etc.) at runtime by hook id.
467
+ overrides hook state (`useState`, `useReducer`, etc.) at runtime by hook id.
468
468
 
469
469
  ```typescript
470
470
  import { overrideHookState } from 'bippy';
@@ -505,6 +505,35 @@ overrideContext(fiber, ThemeContext, 'dark');
505
505
 
506
506
  the function traverses up the fiber tree to find the context provider matching the provided context type and overrides its value.
507
507
 
508
+ ### getSource
509
+
510
+ gets the source code location of a composite fiber.
511
+
512
+ ```typescript
513
+ import { getSource } from 'bippy/source';
514
+
515
+ // random fiber on the DOM
516
+ const hostFiber = getFiberFromHostInstance(document.querySelector('div'));
517
+
518
+ // get nearest composite fiber up the tree
519
+ const compositeFiber = traverseFiber(
520
+ hostFiber,
521
+ (fiber) => {
522
+ if (isCompositeFiber(fiber)) {
523
+ return fiber;
524
+ }
525
+ },
526
+ true,
527
+ );
528
+
529
+ const source = await getSource(compositeFiber);
530
+ // {
531
+ // columnNumber: 12,
532
+ // fileName: 'path/to/file.tsx',
533
+ // lineNumber: 12,
534
+ // }
535
+ ```
536
+
508
537
  ## examples
509
538
 
510
539
  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,345 @@
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 two {@link Fiber}s are the same reference
178
+ */
179
+ declare const areFiberEqual: (fiberA: Fiber$1, fiberB: Fiber$1) => boolean;
180
+ /**
181
+ * Traverses up or down a {@link Fiber}'s contexts, return `true` to stop and select the current and previous context value.
182
+ */
183
+ declare const traverseContexts: (fiber: Fiber$1, selector: (nextValue: ContextDependency<unknown> | null | undefined, prevValue: ContextDependency<unknown> | null | undefined) => boolean | void) => boolean;
184
+ /**
185
+ * 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.
186
+ */
187
+ declare const traverseState: (fiber: Fiber$1, selector: (nextValue: MemoizedState | null | undefined, prevValue: MemoizedState | null | undefined) => boolean | void) => boolean;
188
+ /**
189
+ * Traverses up or down a {@link Fiber}'s props, return `true` to stop and select the current and previous props value.
190
+ */
191
+ declare const traverseProps: (fiber: Fiber$1, selector: (propName: string, nextValue: unknown, prevValue: unknown) => boolean | void) => boolean;
192
+ /**
193
+ * 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.
194
+ */
195
+ declare const didFiberRender: (fiber: Fiber$1) => boolean;
196
+ /**
197
+ * 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.
198
+ */
199
+ declare const didFiberCommit: (fiber: Fiber$1) => boolean;
200
+ /**
201
+ * Returns all host {@link Fiber}s that have committed and rendered.
202
+ */
203
+ declare const getMutatedHostFibers: (fiber: Fiber$1) => Fiber$1[];
204
+ /**
205
+ * Returns the stack of {@link Fiber}s from the current fiber to the root fiber.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * [fiber, fiber.return, fiber.return.return, ...]
210
+ * ```
211
+ */
212
+ declare const getFiberStack: (fiber: Fiber$1) => Fiber$1[];
213
+ /**
214
+ * Returns `true` if the {@link Fiber} should be filtered out during reconciliation.
215
+ */
216
+ declare const shouldFilterFiber: (fiber: Fiber$1) => boolean;
217
+ /**
218
+ * Returns the nearest host {@link Fiber} to the current {@link Fiber}.
219
+ */
220
+ declare const getNearestHostFiber: (fiber: Fiber$1, ascending?: boolean) => Fiber$1 | null;
221
+ /**
222
+ * Returns all host {@link Fiber}s in the tree that are associated with the current {@link Fiber}.
223
+ */
224
+ declare const getNearestHostFibers: (fiber: Fiber$1) => Fiber$1[];
225
+ /**
226
+ * Traverses up or down a {@link Fiber}, return `true` to stop and select a node.
227
+ */
228
+ declare function traverseFiber(fiber: Fiber$1 | null, selector: (node: Fiber$1) => boolean | void, ascending?: boolean): Fiber$1 | null;
229
+ declare function traverseFiber(fiber: Fiber$1 | null, selector: (node: Fiber$1) => Promise<boolean | void>, ascending?: boolean): Promise<Fiber$1 | null>;
230
+ declare const traverseFiberSync: (fiber: Fiber$1 | null, selector: (node: Fiber$1) => boolean | void, ascending?: boolean) => Fiber$1 | null;
231
+ declare const traverseFiberAsync: (fiber: Fiber$1 | null, selector: (node: Fiber$1) => Promise<boolean | void>, ascending?: boolean) => Promise<Fiber$1 | null>;
232
+ /**
233
+ * Returns the timings of the {@link Fiber}.
234
+ *
235
+ * @example
236
+ * ```ts
237
+ * const { selfTime, totalTime } = getTimings(fiber);
238
+ * console.log(selfTime, totalTime);
239
+ * ```
240
+ */
241
+ declare const getTimings: (fiber?: Fiber$1 | null) => {
242
+ selfTime: number;
243
+ totalTime: number;
244
+ };
245
+ /**
246
+ * Returns `true` if the {@link Fiber} uses React Compiler's memo cache.
247
+ */
248
+ declare const hasMemoCache: (fiber: Fiber$1) => boolean;
249
+ /**
250
+ * Returns the type (e.g. component definition) of the {@link Fiber}
251
+ */
252
+ declare const getType: (type: unknown) => null | React$1.ComponentType<unknown>;
253
+ /**
254
+ * Returns the display name of the {@link Fiber} type.
255
+ */
256
+ declare const getDisplayName: (type: unknown) => null | string;
257
+ /**
258
+ * Returns the build type of the React renderer.
259
+ */
260
+ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" | "production";
261
+ /**
262
+ * Returns `true` if bippy's instrumentation is active.
263
+ */
264
+ declare const isInstrumentationActive: () => boolean;
265
+ /**
266
+ * Returns the latest fiber (since it may be double-buffered).
267
+ */
268
+ declare const getLatestFiber: (fiber: Fiber$1) => Fiber$1;
269
+ type RenderHandler = <S>(fiber: Fiber$1, phase: RenderPhase, state?: S) => unknown;
270
+ type RenderPhase = 'mount' | 'unmount' | 'update';
271
+ declare const fiberIdMap: WeakMap<Fiber$1, number>;
272
+ declare const setFiberId: (fiber: Fiber$1, id?: number) => void;
273
+ declare const getFiberId: (fiber: Fiber$1) => number;
274
+ declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber$1, traverseSiblings: boolean) => void;
275
+ declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber$1, prevFiber: Fiber$1, parentFiber: Fiber$1 | null) => void;
276
+ declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber$1) => void;
277
+ declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber$1) => void;
278
+ /**
279
+ * Creates a fiber visitor function. Must pass a fiber root and a render handler.
280
+ * @example
281
+ * traverseRenderedFibers(root, (fiber, phase) => {
282
+ * console.log(phase)
283
+ * })
284
+ */
285
+ declare const traverseRenderedFibers: (root: FiberRoot, onRender: RenderHandler) => void;
286
+ /**
287
+ * @deprecated use `traverseRenderedFibers` instead
288
+ */
289
+ declare const createFiberVisitor: ({
290
+ onRender
291
+ }: {
292
+ onError: (error: unknown) => unknown;
293
+ onRender: RenderHandler;
294
+ }) => (<S>(_rendererID: number, root: Fiber$1 | FiberRoot, _state?: S) => void);
295
+ declare const injectOverrideMethods: () => {
296
+ overrideContext: ((fiber: Fiber$1, contextType: unknown, path: string[], value: unknown) => void) | null | undefined;
297
+ overrideHookState: ((fiber: Fiber$1, id: string, path: string[], value: unknown) => void) | null | undefined;
298
+ overrideProps: ((fiber: Fiber$1, path: string[], value: unknown) => void) | null | undefined;
299
+ } | null | undefined;
300
+ declare const overrideProps: (fiber: Fiber$1, partialValue: Record<string, unknown>) => void;
301
+ declare const overrideHookState: (fiber: Fiber$1, id: number, partialValue: Record<string, unknown> | unknown) => void;
302
+ declare const overrideContext: (fiber: Fiber$1, contextType: unknown, partialValue: Record<string, unknown> | unknown) => void;
303
+ interface InstrumentationOptions {
304
+ name?: string;
305
+ onActive?: () => unknown;
306
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: number | void) => unknown;
307
+ onCommitFiberUnmount?: (rendererID: number, fiber: Fiber$1) => unknown;
308
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
309
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: React$1.ReactNode) => unknown;
310
+ }
311
+ /**
312
+ * Instruments the DevTools hook.
313
+ * @example
314
+ * const hook = instrument({
315
+ * onActive() {
316
+ * console.log('initialized');
317
+ * },
318
+ * onCommitFiberRoot(rendererID, root) {
319
+ * console.log('fiberRoot', root.current)
320
+ * },
321
+ * });
322
+ */
323
+ declare const instrument: (options: InstrumentationOptions) => ReactDevToolsGlobalHook;
324
+ declare const getFiberFromHostInstance: <T>(hostInstance: T) => Fiber$1 | null;
325
+ declare const INSTALL_ERROR: Error;
326
+ declare const _fiberRoots: Set<any>;
327
+ declare const secure: (options: InstrumentationOptions, secureOptions?: {
328
+ dangerouslyRunInProduction?: boolean;
329
+ installCheckTimeout?: number;
330
+ isProduction?: boolean;
331
+ minReactMajorVersion?: number;
332
+ onError?: (error?: unknown) => unknown;
333
+ }) => InstrumentationOptions;
334
+ /**
335
+ * a wrapper around the {@link instrument} function that sets the `onCommitFiberRoot` hook.
336
+ *
337
+ * @example
338
+ * onCommitFiberRoot((root) => {
339
+ * console.log(root.current);
340
+ * });
341
+ */
342
+ declare const onCommitFiberRoot: (handler: (root: FiberRoot) => void) => ReactDevToolsGlobalHook;
343
+
344
+ //#endregion
345
+ 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, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getLatestFiber, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, injectOverrideMethods, installRDTHook, instrument, isClientEnvironment, isCompositeFiber, isHostFiber, isInstrumentationActive, isReactRefresh, isRealReactDevtools, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, overrideContext, overrideHookState, overrideProps, patchRDTHook, safelyInstallRDTHook, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseFiber, traverseFiberAsync, traverseFiberSync, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };