From bb39b4e8d54a4d01990e73c2d54bf4662947923a Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Fri, 15 Aug 2025 13:55:04 -0400 Subject: [PATCH 1/6] Pass around SourceMappedLocation which also includes whether it was ignore listed --- .../src/__tests__/utils-test.js | 5 +++- .../views/Components/InspectedElement.js | 6 ++-- .../Components/InspectedElementSourcePanel.js | 9 +++--- .../views/Components/InspectedElementView.js | 4 +-- .../InspectedElementViewSourceButton.js | 7 +++-- .../views/Components/OpenInEditorButton.js | 5 ++-- .../views/Components/StackTraceView.js | 14 ++++------ .../src/symbolicateSource.js | 28 +++++++++++++++---- 8 files changed, 49 insertions(+), 29 deletions(-) diff --git a/packages/react-devtools-shared/src/__tests__/utils-test.js b/packages/react-devtools-shared/src/__tests__/utils-test.js index dacbe0f46b9..dcffd2a228b 100644 --- a/packages/react-devtools-shared/src/__tests__/utils-test.js +++ b/packages/react-devtools-shared/src/__tests__/utils-test.js @@ -401,7 +401,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.f = f; function f() { } //# sourceMappingURL=`; - const result = ['', 'http://test/a.mts', 1, 17]; + const result = { + location: ['', 'http://test/a.mts', 1, 17], + ignored: false, + }; const fs = { 'http://test/a.mts': `export function f() {}`, 'http://test/a.mjs.map': `{"version":3,"file":"a.mjs","sourceRoot":"","sources":["a.mts"],"names":[],"mappings":";;AAAA,cAAsB;AAAtB,SAAgB,CAAC,KAAI,CAAC"}`, diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElement.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElement.js index e7b70520572..200f78586c5 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElement.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElement.js @@ -7,6 +7,8 @@ * @flow */ +import type {SourceMappedLocation} from 'react-devtools-shared/src/symbolicateSource'; + import * as React from 'react'; import {useCallback, useContext, useSyncExternalStore} from 'react'; import {TreeStateContext} from './TreeContext'; @@ -28,8 +30,6 @@ import useEditorURL from '../useEditorURL'; import styles from './InspectedElement.css'; -import type {ReactFunctionLocation} from 'shared/ReactTypes'; - export type Props = {}; // TODO Make edits and deletes also use transition API! @@ -61,7 +61,7 @@ export default function InspectedElementWrapper(_: Props): React.Node { ? inspectedElement.stack[0] : null; - const symbolicatedSourcePromise: Promise = + const symbolicatedSourcePromise: Promise = React.useMemo(() => { if (fetchFileWithCaching == null) return noSourcePromise; diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSourcePanel.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSourcePanel.js index a3dea3f888f..9faf6c1d7ab 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSourcePanel.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSourcePanel.js @@ -17,6 +17,7 @@ import {withPermissionsCheck} from 'react-devtools-shared/src/frontend/utils/wit import useOpenResource from '../useOpenResource'; +import type {SourceMappedLocation} from 'react-devtools-shared/src/symbolicateSource'; import type {ReactFunctionLocation} from 'shared/ReactTypes'; import styles from './InspectedElementSourcePanel.css'; @@ -24,7 +25,7 @@ import formatLocationForDisplay from './formatLocationForDisplay'; type Props = { source: ReactFunctionLocation, - symbolicatedSourcePromise: Promise, + symbolicatedSourcePromise: Promise, }; function InspectedElementSourcePanel({ @@ -80,7 +81,7 @@ function CopySourceButton({source, symbolicatedSourcePromise}: Props) { ); } - const [, sourceURL, line, column] = symbolicatedSource; + const [, sourceURL, line, column] = symbolicatedSource.location; const handleCopy = withPermissionsCheck( {permissions: ['clipboardWrite']}, () => copy(`${sourceURL}:${line}:${column}`), @@ -98,11 +99,11 @@ function FormattedSourceString({source, symbolicatedSourcePromise}: Props) { const [linkIsEnabled, viewSource] = useOpenResource( source, - symbolicatedSource, + symbolicatedSource == null ? null : symbolicatedSource.location, ); const [, sourceURL, line, column] = - symbolicatedSource == null ? source : symbolicatedSource; + symbolicatedSource == null ? source : symbolicatedSource.location; return (
, + symbolicatedSourcePromise: Promise, }; export default function InspectedElementView({ diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementViewSourceButton.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementViewSourceButton.js index ee2fbe6c4d2..7170c2494f9 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementViewSourceButton.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementViewSourceButton.js @@ -13,12 +13,13 @@ import ButtonIcon from '../ButtonIcon'; import Button from '../Button'; import type {ReactFunctionLocation} from 'shared/ReactTypes'; +import type {SourceMappedLocation} from 'react-devtools-shared/src/symbolicateSource'; import useOpenResource from '../useOpenResource'; type Props = { source: null | ReactFunctionLocation, - symbolicatedSourcePromise: Promise | null, + symbolicatedSourcePromise: Promise | null, }; function InspectedElementViewSourceButton({ @@ -42,7 +43,7 @@ function InspectedElementViewSourceButton({ type ActualSourceButtonProps = { source: null | ReactFunctionLocation, - symbolicatedSourcePromise: Promise | null, + symbolicatedSourcePromise: Promise | null, }; function ActualSourceButton({ source, @@ -55,7 +56,7 @@ function ActualSourceButton({ const [buttonIsEnabled, viewSource] = useOpenResource( source, - symbolicatedSource, + symbolicatedSource == null ? null : symbolicatedSource.location, ); return (