@trackunit/react-core-contexts-test 1.12.41 → 1.12.42

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/index.cjs2.js CHANGED
@@ -13490,36 +13490,38 @@ const mockWidgetConfigContext = {
13490
13490
  closeEditMode: async () => { },
13491
13491
  };
13492
13492
 
13493
- const RerenderContext = React.createContext({ rerenderCounter: 0, setRerenderCounter: (value) => { } });
13493
+ const RerenderContext = React.createContext({ counter: 0 });
13494
13494
  /**
13495
- * This provider is used to force re-renders in the test environment, since tanstack router does not support re-render.
13495
+ * Provides a rerender signal via context to force re-renders in tests.
13496
+ * TanStack Router wraps Match/MatchInner in React.memo, which blocks RTL's rerender() from
13497
+ * propagating to the hook under test. React context changes bypass React.memo boundaries,
13498
+ * so changing the context value triggers a re-render in any descendant consuming RerenderContext.
13499
+ *
13500
+ * The value is intentionally wrapped in a new object on every render. This ensures the context
13501
+ * identity always changes -- even when the external counter prop hasn't changed (e.g. during
13502
+ * HookRenderer's automatic rerender) -- so consumers are always notified.
13496
13503
  */
13497
- const RerenderProvider = ({ children, counter }) => {
13498
- const [rerenderCounter, setRerenderCounter] = React.useState(0);
13499
- React.useEffect(() => {
13500
- if (counter && rerenderCounter !== counter && rerenderCounter !== 0) {
13501
- setRerenderCounter(counter);
13502
- }
13503
- }, [rerenderCounter, counter]);
13504
- return (jsxRuntime.jsx(RerenderContext.Provider, { value: { rerenderCounter, setRerenderCounter }, children: children }));
13505
- };
13504
+ const RerenderProvider = ({ children, counter }) => (jsxRuntime.jsx(RerenderContext.Provider, { value: { counter }, children: children }));
13506
13505
  /**
13507
- * This hook is used to get the rerender counter.
13506
+ * Returns the current rerender counter from context.
13508
13507
  */
13509
- const useRerenderCounter = () => {
13510
- return React.useContext(RerenderContext);
13511
- };
13508
+ const useRerenderCounter = () => React.useContext(RerenderContext).counter;
13512
13509
 
13513
13510
  /**
13514
- * This component is used to force re-renders in the test environment, since tanstack router does not support re-render.
13511
+ * Subscribes to RerenderContext so this subtree re-renders when the counter changes,
13512
+ * even when nested inside React.memo boundaries (like TanStack Router's Match/MatchInner).
13513
+ *
13514
+ * Consuming the context alone is not enough: React will bail out of re-rendering children
13515
+ * if the element references haven't changed. createElement produces new element instances
13516
+ * with a changed prop, which forces React to reconcile and re-render the test component.
13515
13517
  */
13516
13518
  const RerenderComponent = ({ children }) => {
13517
- const { rerenderCounter } = useRerenderCounter();
13518
- return (jsxRuntime.jsx("div", { "data-rerender-counter": `rerender-${rerenderCounter}`, children: React.Children.map(children, child => React.isValidElement(child)
13519
+ const counter = useRerenderCounter();
13520
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: React.Children.map(children, child => React.isValidElement(child)
13519
13521
  ? React.createElement(child.type, {
13520
13522
  ...child.props,
13521
13523
  key: child.key,
13522
- "data-rerender-counter": rerenderCounter,
13524
+ "data-rerender-counter": counter,
13523
13525
  })
13524
13526
  : child) }));
13525
13527
  };
package/index.esm2.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { SortOrder, AssetSortByProperty } from '@trackunit/iris-app-runtime-core-api';
2
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
3
3
  import * as React from 'react';
4
- import React__default, { createContext, useState, useEffect, useContext, Children, createElement, isValidElement, useRef, useCallback, useMemo } from 'react';
4
+ import React__default, { createContext, useContext, Children, createElement, isValidElement, useRef, useEffect, useCallback, useMemo, useState } from 'react';
5
5
  import * as DeprecatedReactTestUtils from 'react-dom/test-utils';
6
6
  import ReactDOM from 'react-dom';
7
7
  import * as ReactDOMClient from 'react-dom/client';
@@ -13468,36 +13468,38 @@ const mockWidgetConfigContext = {
13468
13468
  closeEditMode: async () => { },
13469
13469
  };
13470
13470
 
13471
- const RerenderContext = createContext({ rerenderCounter: 0, setRerenderCounter: (value) => { } });
13471
+ const RerenderContext = createContext({ counter: 0 });
13472
13472
  /**
13473
- * This provider is used to force re-renders in the test environment, since tanstack router does not support re-render.
13473
+ * Provides a rerender signal via context to force re-renders in tests.
13474
+ * TanStack Router wraps Match/MatchInner in React.memo, which blocks RTL's rerender() from
13475
+ * propagating to the hook under test. React context changes bypass React.memo boundaries,
13476
+ * so changing the context value triggers a re-render in any descendant consuming RerenderContext.
13477
+ *
13478
+ * The value is intentionally wrapped in a new object on every render. This ensures the context
13479
+ * identity always changes -- even when the external counter prop hasn't changed (e.g. during
13480
+ * HookRenderer's automatic rerender) -- so consumers are always notified.
13474
13481
  */
13475
- const RerenderProvider = ({ children, counter }) => {
13476
- const [rerenderCounter, setRerenderCounter] = useState(0);
13477
- useEffect(() => {
13478
- if (counter && rerenderCounter !== counter && rerenderCounter !== 0) {
13479
- setRerenderCounter(counter);
13480
- }
13481
- }, [rerenderCounter, counter]);
13482
- return (jsx(RerenderContext.Provider, { value: { rerenderCounter, setRerenderCounter }, children: children }));
13483
- };
13482
+ const RerenderProvider = ({ children, counter }) => (jsx(RerenderContext.Provider, { value: { counter }, children: children }));
13484
13483
  /**
13485
- * This hook is used to get the rerender counter.
13484
+ * Returns the current rerender counter from context.
13486
13485
  */
13487
- const useRerenderCounter = () => {
13488
- return useContext(RerenderContext);
13489
- };
13486
+ const useRerenderCounter = () => useContext(RerenderContext).counter;
13490
13487
 
13491
13488
  /**
13492
- * This component is used to force re-renders in the test environment, since tanstack router does not support re-render.
13489
+ * Subscribes to RerenderContext so this subtree re-renders when the counter changes,
13490
+ * even when nested inside React.memo boundaries (like TanStack Router's Match/MatchInner).
13491
+ *
13492
+ * Consuming the context alone is not enough: React will bail out of re-rendering children
13493
+ * if the element references haven't changed. createElement produces new element instances
13494
+ * with a changed prop, which forces React to reconcile and re-render the test component.
13493
13495
  */
13494
13496
  const RerenderComponent = ({ children }) => {
13495
- const { rerenderCounter } = useRerenderCounter();
13496
- return (jsx("div", { "data-rerender-counter": `rerender-${rerenderCounter}`, children: Children.map(children, child => isValidElement(child)
13497
+ const counter = useRerenderCounter();
13498
+ return (jsx(Fragment, { children: Children.map(children, child => isValidElement(child)
13497
13499
  ? createElement(child.type, {
13498
13500
  ...child.props,
13499
13501
  key: child.key,
13500
- "data-rerender-counter": rerenderCounter,
13502
+ "data-rerender-counter": counter,
13501
13503
  })
13502
13504
  : child) }));
13503
13505
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/react-core-contexts-test",
3
- "version": "1.12.41",
3
+ "version": "1.12.42",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -1,7 +1,12 @@
1
- import { ReactNode } from "react";
1
+ import { type ReactNode } from "react";
2
2
  /**
3
- * This component is used to force re-renders in the test environment, since tanstack router does not support re-render.
3
+ * Subscribes to RerenderContext so this subtree re-renders when the counter changes,
4
+ * even when nested inside React.memo boundaries (like TanStack Router's Match/MatchInner).
5
+ *
6
+ * Consuming the context alone is not enough: React will bail out of re-rendering children
7
+ * if the element references haven't changed. createElement produces new element instances
8
+ * with a changed prop, which forces React to reconcile and re-render the test component.
4
9
  */
5
10
  export declare const RerenderComponent: ({ children }: {
6
11
  children: ReactNode;
7
- }) => import("react/jsx-runtime").JSX.Element;
12
+ }) => ReactNode;
@@ -1,15 +1,19 @@
1
1
  import { ReactNode } from "react";
2
2
  /**
3
- * This provider is used to force re-renders in the test environment, since tanstack router does not support re-render.
3
+ * Provides a rerender signal via context to force re-renders in tests.
4
+ * TanStack Router wraps Match/MatchInner in React.memo, which blocks RTL's rerender() from
5
+ * propagating to the hook under test. React context changes bypass React.memo boundaries,
6
+ * so changing the context value triggers a re-render in any descendant consuming RerenderContext.
7
+ *
8
+ * The value is intentionally wrapped in a new object on every render. This ensures the context
9
+ * identity always changes -- even when the external counter prop hasn't changed (e.g. during
10
+ * HookRenderer's automatic rerender) -- so consumers are always notified.
4
11
  */
5
12
  export declare const RerenderProvider: ({ children, counter }: {
6
13
  children: ReactNode;
7
14
  counter: number;
8
- }) => import("react/jsx-runtime").JSX.Element;
15
+ }) => ReactNode;
9
16
  /**
10
- * This hook is used to get the rerender counter.
17
+ * Returns the current rerender counter from context.
11
18
  */
12
- export declare const useRerenderCounter: () => {
13
- rerenderCounter: number;
14
- setRerenderCounter: (value: number) => void;
15
- };
19
+ export declare const useRerenderCounter: () => number;