Connection successful

pull/311/head
Melissa LeBlanc-Williams 11 months ago
parent 62d91ba584
commit 5fa0a2c935

@ -1 +0,0 @@
var A=1074521560,C="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",g=1074520064,I="GOv8P9jnC0Bx6AtA8+wLQO3oC0CP6AtA7egLQEnpC0AG6gtAeOoLQCHqC0CB5wtAo+kLQPjpC0Bn6QtAmuoLQI7pC0Ca6gtAXegLQLPoC0Dt6AtASekLQHfoC0BM6wtAs+wLQKXmC0DX7AtApeYLQKXmC0Cl5gtApeYLQKXmC0Cl5gtApeYLQKXmC0Dz6gtApeYLQM3rC0Cz7AtA",B=1073605544,Q={entry:A,text:C,text_start:g,data:I,data_start:B};export{I as data,B as data_start,Q as default,A as entry,C as text,g as text_start};

@ -1 +0,0 @@
var A=1077413304,B="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",w=1077411840,E="GGvKP+AIOEAsCThAhAk4QCgKOECUCjhAQgo4QKgHOEDkCThAJAo4QJgJOEBYBzhAzAk4QFgHOEC6CDhA/gg4QCwJOECECThAzAg4QBIIOEBCCDhAyAg4QOYMOEAsCThArAs4QJoMOECkBjhAxAw4QKQGOECkBjhApAY4QKQGOECkBjhApAY4QKQGOECkBjhASAs4QKQGOEDICzhAmgw4QA==",M=1070295976,g={entry:A,text:B,text_start:w,data:E,data_start:M};export{E as data,M as data_start,g as default,A as entry,B as text,w as text_start};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

8204
dist/web/index.js vendored

File diff suppressed because one or more lines are too long

@ -34,15 +34,15 @@
/>
<!-- import the webpage's javascript file -->
<script module>
<!--<script module>
window.esptoolPackage = import(
// In development we import locally.
window.location.hostname === "localhost"
? "/dist/web/index.js"
: "https://cdn.jsdelivr.net/gh/adafruit/Adafruit_WebSerial_ESPTool@latest/dist/web/index.js"
);
</script>
<script src="js/script.js" module defer></script>
</script>-->
<script type="module" src="js/script.js" defer></script>
</head>
<body>
<header class="header">
@ -69,7 +69,7 @@
name="noReset"
class="onoffswitch-checkbox"
id="noReset"
checked="false"
checked="false"
/>
<label class="onoffswitch-label" for="noReset">
<span class="onoffswitch-inner"></span>

@ -1,11 +1,8 @@
let espStub;
import { ESPLoader, Transport } from "https://unpkg.com/esptool-js/bundle.js";
const baudRates = [921600, 115200, 230400, 460800];
const bufferSize = 512;
const colors = ["#00a7e9", "#f89521", "#be1e2d"];
const measurementPeriodId = "0001";
const maxLogLength = 100;
const log = document.getElementById("log");
const butConnect = document.getElementById("butConnect");
@ -23,128 +20,152 @@ const offsets = document.querySelectorAll(".upload .offset");
const appDiv = document.getElementById("app");
const noReset = document.getElementById("noReset");
let device = null;
let transport = null;
let esploader = null;
let chip = null;
const serialLib = !navigator.serial && navigator.usb ? serial : navigator.serial;
document.addEventListener("DOMContentLoaded", () => {
butConnect.addEventListener("click", () => {
clickConnect().catch(async (e) => {
console.error(e);
errorMsg(e.message || e);
if (espStub) {
await espStub.disconnect();
}
toggleUIConnected(false);
butConnect.addEventListener("click", () => {
clickConnect().catch(async (e) => {
console.error(e);
errorMsg(e.message || e);
if (espStub) {
await espStub.disconnect();
}
toggleUIConnected(false);
});
});
butClear.addEventListener("click", clickClear);
butErase.addEventListener("click", clickErase);
butProgram.addEventListener("click", clickProgram);
for (let i = 0; i < firmware.length; i++) {
firmware[i].addEventListener("change", checkFirmware);
}
for (let i = 0; i < offsets.length; i++) {
offsets[i].addEventListener("change", checkProgrammable);
}
autoscroll.addEventListener("click", clickAutoscroll);
baudRate.addEventListener("change", changeBaudRate);
darkMode.addEventListener("click", clickDarkMode);
noReset.addEventListener("change", () => {
console.log("Checkbox changed:", noReset.checked); // Log checkbox state changes
});
window.addEventListener("error", function (event) {
console.log("Got an uncaught error: ", event.error);
});
});
butClear.addEventListener("click", clickClear);
butErase.addEventListener("click", clickErase);
butProgram.addEventListener("click", clickProgram);
for (let i = 0; i < firmware.length; i++) {
firmware[i].addEventListener("change", checkFirmware);
}
for (let i = 0; i < offsets.length; i++) {
offsets[i].addEventListener("change", checkProgrammable);
}
autoscroll.addEventListener("click", clickAutoscroll);
baudRate.addEventListener("change", changeBaudRate);
darkMode.addEventListener("click", clickDarkMode);
noReset.addEventListener("change", () => {
console.log("Checkbox changed:", noReset.checked); // Log checkbox state changes
});
window.addEventListener("error", function (event) {
console.log("Got an uncaught error: ", event.error);
});
if ("serial" in navigator) {
const notSupported = document.getElementById("notSupported");
notSupported.classList.add("hidden");
}
initBaudRate();
loadAllSettings();
updateTheme();
logMsg("ESP Web Flasher loaded.");
if ("serial" in navigator) {
const notSupported = document.getElementById("notSupported");
notSupported.classList.add("hidden");
}
initBaudRate();
loadAllSettings();
updateTheme();
logMsg("ESP Web Flasher loaded.");
});
function initBaudRate() {
for (let rate of baudRates) {
var option = document.createElement("option");
option.text = rate + " Baud";
option.value = rate;
baudRate.add(option);
}
for (let rate of baudRates) {
var option = document.createElement("option");
option.text = rate + " Baud";
option.value = rate;
baudRate.add(option);
}
}
function logMsg(text) {
log.innerHTML += text + "<br>";
function pruneLog() {
// Remove old log content
if (log.textContent.split("\n").length > maxLogLength + 1) {
let logLines = log.innerHTML.replace(/(\n)/gm, "").split("<br>");
log.innerHTML = logLines.splice(-maxLogLength).join("<br>\n");
}
// Remove old log content
if (log.textContent.split("\n").length > maxLogLength + 1) {
let logLines = log.innerHTML.replace(/(\n)/gm, "").split("<br>");
log.innerHTML = logLines.splice(-maxLogLength).join("<br>\n");
}
if (autoscroll.checked) {
log.scrollTop = log.scrollHeight;
}
}
if (autoscroll.checked) {
log.scrollTop = log.scrollHeight;
}
function writeLog(text) {
log.innerHTML += text;
pruneLog();
}
function debugMsg(...args) {
function getStackTrace() {
let stack = new Error().stack;
//console.log(stack);
stack = stack.split("\n").map((v) => v.trim());
stack.shift();
stack.shift();
function logMsg(text) {
writeLog(text + "<br>");
}
const espLoaderTerminal = {
clean() {
log.innerHTML = "";
},
writeLine(data) {
logMsg(data + "<br />");
},
write(data) {
writeLog(data);
},
};
let trace = [];
for (let line of stack) {
line = line.replace("at ", "");
trace.push({
func: line.substr(0, line.indexOf("(") - 1),
pos: line.substring(line.indexOf(".js:") + 4, line.lastIndexOf(":")),
});
function debugMsg(...args) {
function getStackTrace() {
let stack = new Error().stack;
//console.log(stack);
stack = stack.split("\n").map((v) => v.trim());
stack.shift();
stack.shift();
let trace = [];
for (let line of stack) {
line = line.replace("at ", "");
trace.push({
func: line.substr(0, line.indexOf("(") - 1),
pos: line.substring(line.indexOf(".js:") + 4, line.lastIndexOf(":")),
});
}
return trace;
}
return trace;
}
let stack = getStackTrace();
stack.shift();
let top = stack.shift();
let prefix =
'<span class="debug-function">[' + top.func + ":" + top.pos + "]</span> ";
for (let arg of args) {
if (arg === undefined) {
logMsg(prefix + "undefined");
} else if (arg === null) {
logMsg(prefix + "null");
} else if (typeof arg == "string") {
logMsg(prefix + arg);
} else if (typeof arg == "number") {
logMsg(prefix + arg);
} else if (typeof arg == "boolean") {
logMsg(prefix + (arg ? "true" : "false"));
} else if (Array.isArray(arg)) {
logMsg(prefix + "[" + arg.map((value) => toHex(value)).join(", ") + "]");
} else if (typeof arg == "object" && arg instanceof Uint8Array) {
logMsg(
prefix +
"[" +
Array.from(arg)
.map((value) => toHex(value))
.join(", ") +
"]"
);
} else {
logMsg(prefix + "Unhandled type of argument:" + typeof arg);
console.log(arg);
let stack = getStackTrace();
stack.shift();
let top = stack.shift();
let prefix = '<span class="debug-function">[' + top.func + ":" + top.pos + "]</span> ";
for (let arg of args) {
if (arg === undefined) {
logMsg(prefix + "undefined");
} else if (arg === null) {
logMsg(prefix + "null");
} else if (typeof arg == "string") {
logMsg(prefix + arg);
} else if (typeof arg == "number") {
logMsg(prefix + arg);
} else if (typeof arg == "boolean") {
logMsg(prefix + (arg ? "true" : "false"));
} else if (Array.isArray(arg)) {
logMsg(prefix + "[" + arg.map((value) => toHex(value)).join(", ") + "]");
} else if (typeof arg == "object" && arg instanceof Uint8Array) {
logMsg(
prefix +
"[" +
Array.from(arg)
.map((value) => toHex(value))
.join(", ") +
"]"
);
} else {
logMsg(prefix + "Unhandled type of argument:" + typeof arg);
console.log(arg);
}
prefix = ""; // Only show for first argument
}
prefix = ""; // Only show for first argument
}
}
function errorMsg(text) {
logMsg('<span class="error-message">Error:</span> ' + text);
console.error(text);
logMsg('<span class="error-message">Error:</span> ' + text);
console.error(text);
}
/**
@ -152,28 +173,28 @@ function errorMsg(text) {
* Sets the theme to Adafruit (dark) mode. Can be refactored later for more themes
*/
function updateTheme() {
// Disable all themes
document
.querySelectorAll("link[rel=stylesheet].alternate")
.forEach((styleSheet) => {
enableStyleSheet(styleSheet, false);
});
if (darkMode.checked) {
enableStyleSheet(darkSS, true);
} else {
enableStyleSheet(lightSS, true);
}
// Disable all themes
document
.querySelectorAll("link[rel=stylesheet].alternate")
.forEach((styleSheet) => {
enableStyleSheet(styleSheet, false);
});
if (darkMode.checked) {
enableStyleSheet(darkSS, true);
} else {
enableStyleSheet(lightSS, true);
}
}
function enableStyleSheet(node, enabled) {
node.disabled = !enabled;
node.disabled = !enabled;
}
function formatMacAddr(macAddr) {
return macAddr
.map((value) => value.toString(16).toUpperCase().padStart(2, "0"))
.join(":");
return macAddr
.map((value) => value.toString(16).toUpperCase().padStart(2, "0"))
.join(":");
}
/**
@ -181,38 +202,42 @@ function formatMacAddr(macAddr) {
* Click handler for the connect/disconnect button.
*/
async function clickConnect() {
if (espStub) {
await espStub.disconnect();
await espStub.port.close();
toggleUIConnected(false);
espStub = undefined;
return;
}
const esploaderMod = await window.esptoolPackage;
const esploader = await esploaderMod.connect({
log: (...args) => logMsg(...args),
debug: (...args) => debugMsg(...args),
error: (...args) => errorMsg(...args),
});
try {
await esploader.initialize();
logMsg("Connected to " + esploader.chipName);
logMsg("MAC Address: " + formatMacAddr(esploader.macAddr()));
espStub = await esploader.runStub();
toggleUIConnected(true);
toggleUIToolbar(true);
espStub.addEventListener("disconnect", () => {
toggleUIConnected(false);
espStub = false;
});
} catch (err) {
await esploader.disconnect();
throw err;
}
if (transport !== null) {
await transport.disconnect();
await transport.waitForUnlock(1500);
toggleUIConnected(false);
transport = null;
device = null;
chip = null;
return;
}
if (device === null) {
device = await serialLib.requestPort({});
transport = new Transport(device, true);
}
try {
const loaderOptions = {
transport: transport,
baudrate: parseInt(baudRate.value),
terminal: espLoaderTerminal,
debugLogging: false,
};
esploader = new ESPLoader(loaderOptions);
chip = await esploader.main();
// Temporarily broken
// await esploader.flashId();
toggleUIConnected(true);
toggleUIToolbar(true);
} catch (e) {
console.error(e);
errorMsg(e.message);
}
console.log("Settings done for :" + chip);
}
/**
@ -220,13 +245,13 @@ async function clickConnect() {
* Change handler for the Baud Rate selector.
*/
async function changeBaudRate() {
saveSetting("baudrate", baudRate.value);
if (espStub) {
let baud = parseInt(baudRate.value);
if (baudRates.includes(baud)) {
await espStub.setBaudrate(baud);
saveSetting("baudrate", baudRate.value);
if (espStub) {
let baud = parseInt(baudRate.value);
if (baudRates.includes(baud)) {
await espStub.setBaudrate(baud);
}
}
}
}
/**
@ -234,7 +259,7 @@ async function changeBaudRate() {
* Change handler for the Autoscroll checkbox.
*/
async function clickAutoscroll() {
saveSetting("autoscroll", autoscroll.checked);
saveSetting("autoscroll", autoscroll.checked);
}
/**
@ -242,8 +267,8 @@ async function clickAutoscroll() {
* Change handler for the Dark Mode checkbox.
*/
async function clickDarkMode() {
updateTheme();
saveSetting("darkmode", darkMode.checked);
updateTheme();
saveSetting("darkmode", darkMode.checked);
}
/**
@ -251,8 +276,8 @@ async function clickDarkMode() {
* Change handler for ESP32 co-processor boards
*/
async function clickNoReset() {
console.log("Checkbox state:", noReset.checked); // Debugging output
saveSetting("noReset", noReset.checked);
console.log("Checkbox state:", noReset.checked); // Debugging output
saveSetting("noReset", noReset.checked);
}
/**
@ -260,25 +285,25 @@ async function clickNoReset() {
* Click handler for the erase button.
*/
async function clickErase() {
if (
window.confirm("This will erase the entire flash. Click OK to continue.")
) {
baudRate.disabled = true;
butErase.disabled = true;
butProgram.disabled = true;
try {
logMsg("Erasing flash memory. Please wait...");
let stamp = Date.now();
await espStub.eraseFlash();
logMsg("Finished. Took " + (Date.now() - stamp) + "ms to erase.");
} catch (e) {
errorMsg(e);
} finally {
butErase.disabled = false;
baudRate.disabled = false;
butProgram.disabled = getValidFiles().length == 0;
if (
window.confirm("This will erase the entire flash. Click OK to continue.")
) {
baudRate.disabled = true;
butErase.disabled = true;
butProgram.disabled = true;
try {
logMsg("Erasing flash memory. Please wait...");
let stamp = Date.now();
await espStub.eraseFlash();
logMsg("Finished. Took " + (Date.now() - stamp) + "ms to erase.");
} catch (e) {
errorMsg(e);
} finally {
butErase.disabled = false;
baudRate.disabled = false;
butProgram.disabled = getValidFiles().length == 0;
}
}
}
}
/**
@ -286,75 +311,74 @@ async function clickErase() {
* Click handler for the program button.
*/
async function clickProgram() {
const readUploadedFileAsArrayBuffer = (inputFile) => {
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.onerror = () => {
reader.abort();
reject(new DOMException("Problem parsing input file."));
};
reader.onload = () => {
resolve(reader.result);
};
reader.readAsArrayBuffer(inputFile);
});
};
baudRate.disabled = true;
butErase.disabled = true;
butProgram.disabled = true;
for (let i = 0; i < 4; i++) {
firmware[i].disabled = true;
offsets[i].disabled = true;
}
for (let file of getValidFiles()) {
progress[file].classList.remove("hidden");
let binfile = firmware[file].files[0];
let contents = await readUploadedFileAsArrayBuffer(binfile);
try {
let offset = parseInt(offsets[file].value, 16);
const progressBar = progress[file].querySelector("div");
await espStub.flashData(
contents,
(bytesWritten, totalBytes) => {
progressBar.style.width =
Math.floor((bytesWritten / totalBytes) * 100) + "%";
},
offset
);
await sleep(100);
} catch (e) {
errorMsg(e);
const readUploadedFileAsArrayBuffer = (inputFile) => {
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.onerror = () => {
reader.abort();
reject(new DOMException("Problem parsing input file."));
};
reader.onload = () => {
resolve(reader.result);
};
reader.readAsArrayBuffer(inputFile);
});
};
baudRate.disabled = true;
butErase.disabled = true;
butProgram.disabled = true;
for (let i = 0; i < 4; i++) {
firmware[i].disabled = true;
offsets[i].disabled = true;
}
}
for (let i = 0; i < 4; i++) {
firmware[i].disabled = false;
offsets[i].disabled = false;
progress[i].classList.add("hidden");
progress[i].querySelector("div").style.width = "0";
}
butErase.disabled = false;
baudRate.disabled = false;
butProgram.disabled = getValidFiles().length == 0;
logMsg("To run the new firmware, please reset your device.");
for (let file of getValidFiles()) {
progress[file].classList.remove("hidden");
let binfile = firmware[file].files[0];
let contents = await readUploadedFileAsArrayBuffer(binfile);
try {
let offset = parseInt(offsets[file].value, 16);
const progressBar = progress[file].querySelector("div");
await espStub.flashData(
contents,
(bytesWritten, totalBytes) => {
progressBar.style.width = Math.floor((bytesWritten / totalBytes) * 100) + "%";
},
offset
);
await sleep(100);
} catch (e) {
errorMsg(e);
}
}
for (let i = 0; i < 4; i++) {
firmware[i].disabled = false;
offsets[i].disabled = false;
progress[i].classList.add("hidden");
progress[i].querySelector("div").style.width = "0";
}
butErase.disabled = false;
baudRate.disabled = false;
butProgram.disabled = getValidFiles().length == 0;
logMsg("To run the new firmware, please reset your device.");
}
function getValidFiles() {
// Get a list of file and offsets
// This will be used to check if we have valid stuff
// and will also return a list of files to program
let validFiles = [];
let offsetVals = [];
for (let i = 0; i < 4; i++) {
let offs = parseInt(offsets[i].value, 16);
if (firmware[i].files.length > 0 && !offsetVals.includes(offs)) {
validFiles.push(i);
offsetVals.push(offs);
// Get a list of file and offsets
// This will be used to check if we have valid stuff
// and will also return a list of files to program
let validFiles = [];
let offsetVals = [];
for (let i = 0; i < 4; i++) {
let offs = parseInt(offsets[i].value, 16);
if (firmware[i].files.length > 0 && !offsetVals.includes(offs)) {
validFiles.push(i);
offsetVals.push(offs);
}
}
}
return validFiles;
return validFiles;
}
/**
@ -362,7 +386,7 @@ function getValidFiles() {
* Check if the conditions to program the device are sufficient
*/
async function checkProgrammable() {
butProgram.disabled = getValidFiles().length == 0;
butProgram.disabled = getValidFiles().length == 0;
}
/**
@ -370,22 +394,22 @@ async function checkProgrammable() {
* Handler for firmware upload changes
*/
async function checkFirmware(event) {
let filename = event.target.value.split("\\").pop();
let label = event.target.parentNode.querySelector("span");
let icon = event.target.parentNode.querySelector("svg");
if (filename != "") {
if (filename.length > 17) {
label.innerHTML = filename.substring(0, 14) + "&hellip;";
let filename = event.target.value.split("\\").pop();
let label = event.target.parentNode.querySelector("span");
let icon = event.target.parentNode.querySelector("svg");
if (filename != "") {
if (filename.length > 17) {
label.innerHTML = filename.substring(0, 14) + "&hellip;";
} else {
label.innerHTML = filename;
}
icon.classList.add("hidden");
} else {
label.innerHTML = filename;
label.innerHTML = "Choose a file&hellip;";
icon.classList.remove("hidden");
}
icon.classList.add("hidden");
} else {
label.innerHTML = "Choose a file&hellip;";
icon.classList.remove("hidden");
}
await checkProgrammable();
await checkProgrammable();
}
/**
@ -393,71 +417,70 @@ async function checkFirmware(event) {
* Click handler for the clear button.
*/
async function clickClear() {
// reset(); Reset function wasnt declared.
log.innerHTML = "";
// reset(); Reset function wasnt declared.
log.innerHTML = "";
}
function convertJSON(chunk) {
try {
let jsonObj = JSON.parse(chunk);
return jsonObj;
} catch (e) {
return chunk;
}
try {
let jsonObj = JSON.parse(chunk);
return jsonObj;
} catch (e) {
return chunk;
}
}
function toggleUIToolbar(show) {
isConnected = show;
for (let i = 0; i < 4; i++) {
progress[i].classList.add("hidden");
progress[i].querySelector("div").style.width = "0";
}
if (show) {
appDiv.classList.add("connected");
} else {
appDiv.classList.remove("connected");
}
butErase.disabled = !show;
for (let i = 0; i < 4; i++) {
progress[i].classList.add("hidden");
progress[i].querySelector("div").style.width = "0";
}
if (show) {
appDiv.classList.add("connected");
} else {
appDiv.classList.remove("connected");
}
butErase.disabled = !show;
}
function toggleUIConnected(connected) {
let lbl = "Connect";
if (connected) {
lbl = "Disconnect";
} else {
toggleUIToolbar(false);
}
butConnect.textContent = lbl;
let lbl = "Connect";
if (connected) {
lbl = "Disconnect";
} else {
toggleUIToolbar(false);
}
butConnect.textContent = lbl;
}
function loadAllSettings() {
// Load all saved settings or defaults
autoscroll.checked = loadSetting("autoscroll", true);
baudRate.value = loadSetting("baudrate", 115200);
darkMode.checked = loadSetting("darkmode", false);
noReset.checked = loadSetting("noReset", false);
// Load all saved settings or defaults
autoscroll.checked = loadSetting("autoscroll", true);
baudRate.value = loadSetting("baudrate", 115200);
darkMode.checked = loadSetting("darkmode", false);
noReset.checked = loadSetting("noReset", false);
}
function loadSetting(setting, defaultValue) {
let value = JSON.parse(window.localStorage.getItem(setting));
if (value == null) {
return defaultValue;
}
let value = JSON.parse(window.localStorage.getItem(setting));
if (value == null) {
return defaultValue;
}
return value;
return value;
}
function saveSetting(setting, value) {
window.localStorage.setItem(setting, JSON.stringify(value));
window.localStorage.setItem(setting, JSON.stringify(value));
}
function ucWords(text) {
return text
.replace("_", " ")
.toLowerCase()
.replace(/(?<= )[^\s]|^./g, (a) => a.toUpperCase());
return text
.replace("_", " ")
.toLowerCase()
.replace(/(?<= )[^\s]|^./g, (a) => a.toUpperCase());
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => setTimeout(resolve, ms));
}

25
package-lock.json generated

@ -10,6 +10,7 @@
"license": "MIT",
"dependencies": {
"@types/node": "^22.9.0",
"esptool-js": "^0.4.7",
"pako": "^2.1.0",
"tslib": "^2.8.1"
},
@ -617,6 +618,12 @@
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true
},
"node_modules/atob-lite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
"integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==",
"license": "MIT"
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -845,10 +852,11 @@
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@ -897,6 +905,17 @@
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true
},
"node_modules/esptool-js": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/esptool-js/-/esptool-js-0.4.7.tgz",
"integrity": "sha512-xVwtSVDRsvjXSEvNFrorgJfB71RFFkZkL+hs7O7gW5hgPrKGywZxo2U5LJddzkJ6eE31QinNVyywc0OaSntZCw==",
"license": "Apache-2.0",
"dependencies": {
"atob-lite": "^2.0.0",
"pako": "^2.1.0",
"tslib": "^2.4.1"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",

@ -30,6 +30,7 @@
},
"dependencies": {
"@types/node": "^22.9.0",
"esptool-js": "^0.4.7",
"pako": "^2.1.0",
"tslib": "^2.8.1"
}

Loading…
Cancel
Save