Skip to content

Commit b17c1c5

Browse files
committed
Show warning for non registered Stimulus controller
1 parent c1bab70 commit b17c1c5

6 files changed

Lines changed: 49 additions & 4 deletions

File tree

public/styles/dev_tool_panel.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,12 @@ wa-input[size="extra-small"] {
671671
color: var(--wa-color-purple-50);
672672
}
673673

674+
.error-text-underline {
675+
text-decoration: underline wavy #f14c4c;
676+
text-decoration-thickness: 1px;
677+
text-underline-offset: 2px;
678+
}
679+
674680
/* Highlight.js GitHub Theme */
675681
pre code.hljs {
676682
display: block;

src/browser_panel/State.svelte.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ let turboCables = $state([])
2525
let turboStreams = $state([])
2626
let turboEvents = $state([])
2727
let stimulusData = $state([])
28+
let registeredStimulusIdentifiers = $state([])
2829

2930
export function setTurboFrames(frames, url) {
3031
turboFrames = frames
@@ -50,6 +51,14 @@ export function getStimulusData() {
5051
return stimulusData
5152
}
5253

54+
export function setRegisteredStimulusIdentifiers(identifiers, url) {
55+
registeredStimulusIdentifiers = identifiers
56+
}
57+
58+
export function getRegisteredStimulusIdentifiers() {
59+
return registeredStimulusIdentifiers
60+
}
61+
5362
export function addTurboEvent(event) {
5463
const exists = turboEvents.some((e) => e.uuid === event.uuid)
5564
if (exists) return

src/browser_panel/messaging.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { PANEL_TO_BACKEND_MESSAGES, BACKEND_TO_PANEL_MESSAGES, PORT_IDENTIFIERS, HOTWIRE_DEV_TOOLS_PANEL_SOURCE } from "$lib/constants"
2-
import { setTurboFrames, setTurboCables, setStimulusData, addTurboStream, addTurboEvent } from "./State.svelte.js"
2+
import { setTurboFrames, setTurboCables, setStimulusData, setRegisteredStimulusIdentifiers, addTurboStream, addTurboEvent } from "./State.svelte.js"
33

44
function setPort(port) {
55
if (!window.__HotwireDevTools) {
@@ -26,6 +26,10 @@ export const handleBackendToPanelMessage = (message, port) => {
2626
setStimulusData(message.stimulusData, message.url)
2727
setPort(port)
2828
break
29+
case BACKEND_TO_PANEL_MESSAGES.SET_REGISTERED_STIMULUS_IDENTIFIERS:
30+
setRegisteredStimulusIdentifiers(message.identifiers, message.url)
31+
setPort(port)
32+
break
2933
case BACKEND_TO_PANEL_MESSAGES.TURBO_STREAM_RECEIVED:
3034
addTurboStream(message.turboStream)
3135
setPort(port)

src/browser_panel/page/backend.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ function init() {
2424
start() {
2525
this.elementObserver.start()
2626
this.addEventListeners()
27+
this.sendRegisteredStimulusControllers()
2728
}
2829

2930
stop() {
@@ -172,6 +173,14 @@ function init() {
172173
})
173174
}, 10)
174175

176+
sendRegisteredStimulusControllers = () => {
177+
this._postMessage({
178+
identifiers: Array.from(window.Stimulus?.router.modulesByIdentifier.keys() || []),
179+
url: btoa(window.location.href),
180+
type: BACKEND_TO_PANEL_MESSAGES.SET_REGISTERED_STIMULUS_IDENTIFIERS,
181+
})
182+
}
183+
175184
handleIncomingTurboStream = (event) => {
176185
const turboStream = event.target
177186
const turboStreamContent = turboStream.outerHTML

src/browser_panel/panel/tabs/StimulusTab.svelte

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import ClassTreeItem from "$src/components/Stimulus/ClassTreeItem.svelte"
99
import InspectButton from "$components/InspectButton.svelte"
1010
import HTMLRenderer from "$src/browser_panel/HTMLRenderer.svelte"
11-
import ScrollIntoViewButton from "$components/ScrollIntoViewButton.svelte"
12-
import { getStimulusData } from "../../State.svelte.js"
11+
import { getStimulusData, getRegisteredStimulusIdentifiers } from "../../State.svelte.js"
1312
import { flattenNodes, handleKeyboardNavigation, selectorByUUID } from "$utils/utils.js"
1413
import { addHighlightOverlay, hideHighlightOverlay } from "../../messaging.js"
1514
import { getDevtoolInstance } from "$lib/devtool.js"
@@ -23,6 +22,7 @@
2322
controller: null,
2423
})
2524
let stimulusControllers = $state([])
25+
let registeredStimulusIdentifiers = $state([])
2626
let flattenStimulusControllers = $derived(flattenNodes(stimulusControllers))
2727
let uniqueIdentifiers = $derived([...new Set(flattenStimulusControllers.map((n) => n.identifier).filter(Boolean))].sort())
2828
let counts = $derived(
@@ -47,6 +47,10 @@
4747
}
4848
})
4949
50+
$effect(() => {
51+
registeredStimulusIdentifiers = getRegisteredStimulusIdentifiers()
52+
})
53+
5054
const getStimulusInstances = (identifier) => {
5155
return flattenStimulusControllers.filter((n) => n.identifier === identifier)
5256
}
@@ -104,6 +108,11 @@
104108
}
105109
}, 10)
106110
}
111+
112+
const isIdentifierRegistered = (identifier) => {
113+
if (!registeredStimulusIdentifiers.length) return true
114+
return registeredStimulusIdentifiers.includes(identifier)
115+
}
107116
</script>
108117

109118
<Splitpanes horizontal={$horizontalPanes} dblClickSplitter={false}>
@@ -128,7 +137,14 @@
128137
class:selected={selected.identifier === identifier}
129138
>
130139
<div class="d-flex justify-content-between align-items-center">
131-
<div>{identifier}</div>
140+
<div id={`identifier-${index}`} class:error-text-underline={!isIdentifierRegistered(identifier)}>
141+
{identifier}
142+
</div>
143+
{#if !isIdentifierRegistered(identifier)}
144+
<wa-tooltip for={`identifier-${index}`} style="--max-width: 200px;">
145+
<div>This controller does not appear to be registered in window.Stimulus.</div>
146+
</wa-tooltip>
147+
{/if}
132148
<div>{counts[identifier]}</div>
133149
</div>
134150
</div>

src/lib/constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const BACKEND_TO_PANEL_MESSAGES = {
1111
SET_TURBO_FRAMES: "set-turbo-frames",
1212
SET_TURBO_CABLES: "set-turbo-cables",
1313
SET_STIMULUS_DATA: "set-stimulus-data",
14+
SET_REGISTERED_STIMULUS_IDENTIFIERS: "set-registered-stimulus-identifiers",
1415
TURBO_STREAM_RECEIVED: "turbo-stream-received",
1516
TURBO_EVENT_RECEIVED: "turbo-event-received",
1617
HEALTH_CHECK_RESPONSE: "health-check-response",

0 commit comments

Comments
 (0)