diff --git a/nodecg-io-debug/dashboard/debug-helper.html b/nodecg-io-debug/dashboard/debug-helper.html
index fd196e717..4965ae310 100644
--- a/nodecg-io-debug/dashboard/debug-helper.html
+++ b/nodecg-io-debug/dashboard/debug-helper.html
@@ -156,7 +156,7 @@
require(["vs/editor/editor.main"], onMonacoReady);
function onMonacoReady() {
- var jsonCode = ["{", ' "data": 42,', "}"].join("\n");
+ var jsonCode = ["{", ' "data": 42', "}"].join("\n");
var model = monaco.editor.createModel(jsonCode, "json");
diff --git a/nodecg-io-debug/dashboard/debug-helper.js b/nodecg-io-debug/dashboard/debug-helper.js
deleted file mode 100644
index be09559a5..000000000
--- a/nodecg-io-debug/dashboard/debug-helper.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/* eslint-disable no-undef */
-
-// Buttons
-for (let i = 1; i <= 5; i++) {
- document.querySelector(`#click_button${i}`).onclick = () => {
- nodecg.sendMessage("onClick", i);
- };
-}
-
-// Numbers
-for (let i = 0; i < 5; i++) {
- const num = 10 ** i;
- document.querySelector(`#number_button${num}`).onclick = () => {
- nodecg.sendMessage("onNumber", num);
- };
-}
-document.querySelector(`#number_input1_send`).onclick = () => {
- const num = document.querySelector('#number_input1').value;
- nodecg.sendMessage("onNumber", num);
-};
-document.querySelector(`#number_input2`).onchange = () => {
- const num = document.querySelector('#number_input2').value;
- nodecg.sendMessage("onNumber", num);
-};
-
-// Ranges
-for (const range of ["0to100", "0to1", "M1to1"]) {
- document.querySelector("#range_" + range).addEventListener("change", (e) => {
- const num = e.target.value;
- nodecg.sendMessage(`onRange${range}`, num);
- });
-}
-
-// Color
-document.querySelector("#color_color").addEventListener("input", (e) => {
- const color = e.target.value;
- nodecg.sendMessage(`onColor`, color);
-});
-
-// Dates
-for (const element of ["#date_date", "#date_datetime"]) {
- document.querySelector(element).addEventListener("change", (e) => {
- const date = e.target.value;
- nodecg.sendMessage(`onDate`, date);
- });
-}
-
-// Booleans
-document.querySelector("#bool_false").onclick = () => {
- nodecg.sendMessage("onBool", false);
-};
-document.querySelector("#bool_true").onclick = () => {
- nodecg.sendMessage("onBool", true);
-};
-
-// Text
-for (const element of ["oneline", "multiline"]) {
- document.querySelector(`#text_${element}_send`).onclick = () => {
- const value = document.querySelector(`#text_${element}`).value;
- nodecg.sendMessage("onText", value);
- };
-}
-
-// Lists
-document.querySelector("#list_list_send").onclick = () => {
- const value = document.querySelector("#list_list").value;
- nodecg.sendMessage("onList", value);
-};
-
-// JSON
-document.querySelector("#json_send").onclick = () => {
- const jsonString = window.debugMonacoEditor.getValue();
- try {
- const json = JSON.parse(jsonString);
- nodecg.sendMessage("onJSON", json);
- } catch (e) {
- nodecg.log.error(`Cannot send invalid json: ${e}`)
- }
-};
\ No newline at end of file
diff --git a/nodecg-io-debug/dashboard/debug-helper.ts b/nodecg-io-debug/dashboard/debug-helper.ts
new file mode 100644
index 000000000..3b213cb1e
--- /dev/null
+++ b/nodecg-io-debug/dashboard/debug-helper.ts
@@ -0,0 +1,95 @@
+///
+///
+
+// Buttons
+for (let i = 1; i <= 5; i++) {
+ setHandler(`#click_button${i}`, "onclick", () => {
+ nodecg.sendMessage("onClick", i);
+ });
+}
+
+// Numbers
+for (let i = 0; i < 5; i++) {
+ const num = 10 ** i;
+ setHandler(`#number_button${num}`, "onclick", () => {
+ nodecg.sendMessage("onNumber", num);
+ });
+}
+
+setHandler("#number_input1_send", "onclick", () => {
+ const num = document.querySelector("#number_input1")?.value;
+ nodecg.sendMessage("onNumber", num);
+});
+setHandler("#number_input2", "onchange", () => {
+ const num = document.querySelector("#number_input2")?.value;
+ nodecg.sendMessage("onNumber", num);
+});
+
+// Ranges
+for (const range of ["0to100", "0to1", "M1to1"]) {
+ const selector = "#range_" + range;
+ document.querySelector(selector)?.addEventListener("change", () => {
+ const num = document.querySelector(selector)?.value;
+ nodecg.sendMessage(`onRange${range}`, num);
+ });
+}
+
+// Color
+document.querySelector("#color_color")?.addEventListener("input", () => {
+ const color = document.querySelector("#color_color")?.value;
+ nodecg.sendMessage(`onColor`, color);
+});
+
+// Dates
+for (const element of ["#date_date", "#date_datetime"]) {
+ document.querySelector(element)?.addEventListener("change", () => {
+ const date = document.querySelector(element)?.value;
+ nodecg.sendMessage(`onDate`, date);
+ });
+}
+
+// Booleans
+setHandler("#bool_false", "onclick", () => {
+ nodecg.sendMessage("onBool", false);
+});
+setHandler("#bool_true", "onclick", () => {
+ nodecg.sendMessage("onBool", true);
+});
+
+// Text
+for (const element of ["oneline", "multiline"]) {
+ setHandler(`#text_${element}_send`, "onclick", () => {
+ const value = document.querySelector(`#text_${element}`)?.value;
+ nodecg.sendMessage("onText", value);
+ });
+}
+
+// Lists
+setHandler("#list_list_send", "onclick", () => {
+ const value = document.querySelector("#list_list")?.value;
+ nodecg.sendMessage("onList", value);
+});
+
+// JSON
+// defined in debug-helper.html
+declare const debugMonacoEditor: monaco.editor.IStandaloneCodeEditor;
+setHandler("#json_send", "onclick", () => {
+ const jsonString = debugMonacoEditor.getValue();
+ try {
+ const json = JSON.parse(jsonString);
+ nodecg.sendMessage("onJSON", json);
+ } catch (e) {
+ nodecg.log.error(`Cannot send invalid json: ${e}`);
+ }
+});
+
+// Util functions
+function setHandler(querySelector: string, type: "onclick" | "onchange", fn: () => void): void {
+ const element = document.querySelector(querySelector);
+ if (!element) {
+ nodecg.log.error(`Cannot set handler for element with this query selector: ${querySelector}`);
+ return;
+ }
+
+ element[type] = fn;
+}
diff --git a/samples/debug/extension/index.ts b/samples/debug/extension/index.ts
index 046e95114..6a8770a71 100644
--- a/samples/debug/extension/index.ts
+++ b/samples/debug/extension/index.ts
@@ -22,6 +22,14 @@ module.exports = function (nodecg: NodeCG) {
nodecg.log.info(`Received in 'onRange0to100' with value: ${value}`);
});
+ debug.onRange0to1((value) => {
+ nodecg.log.info(`Received in 'onRange0to1' with value: ${value}`);
+ });
+
+ debug.onRangeM1to1((value) => {
+ nodecg.log.info(`Received in 'onRangeM1to1' with value: ${value}`);
+ });
+
debug.onColor((value) => {
nodecg.log.info(`Received in 'onColor' with [red,green,blue]: [${value.red},${value.green},${value.blue}]`);
});