chore(deps-dev): bump oxfmt from 0.58.0 to 0.59.0 (#1306)
* chore(deps-dev): bump oxfmt from 0.58.0 to 0.59.0 Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.58.0 to 0.59.0. - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.59.0/npm/oxfmt) --- updated-dependencies: - dependency-name: oxfmt dependency-version: 0.59.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * chore: fix formatting issues for oxfmt 0.59.0 * fix: add vitest.config.ts for packages/ui to avoid unplugin-dts TypeScript 7 crash --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com> Co-authored-by: Hunter Thornsberry <hunter@hunterthornsberry.com>
This commit is contained in:
co-authored by
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Dan Ditomaso
Hunter Thornsberry
parent
1eeabeaa91
commit
aec3ad9ed3
@@ -6,7 +6,8 @@ import path from "node:path";
|
||||
* that talks to the non-browser node over the TCP phone API. It sends text,
|
||||
* blocks until a specific text is received, or reports the node's number.
|
||||
*/
|
||||
const PYTHON = process.env.E2E_PEER_PYTHON ?? path.resolve("e2e/peer/.venv/bin/python");
|
||||
const PYTHON =
|
||||
process.env.E2E_PEER_PYTHON ?? path.resolve("e2e/peer/.venv/bin/python");
|
||||
const SCRIPT = path.resolve("e2e/peer/peer.py");
|
||||
const HOST = process.env.E2E_PEER_HOST ?? "127.0.0.1";
|
||||
const PORT = process.env.E2E_PEER_PORT ?? "14404";
|
||||
@@ -16,7 +17,10 @@ function spawnPeer(args: string[]): ChildProcess {
|
||||
}
|
||||
|
||||
/** Invoke `onLine` for each complete stdout line. */
|
||||
function onStdoutLines(child: ChildProcess, onLine: (line: string) => void): void {
|
||||
function onStdoutLines(
|
||||
child: ChildProcess,
|
||||
onLine: (line: string) => void,
|
||||
): void {
|
||||
let buf = "";
|
||||
child.stdout?.on("data", (chunk: Buffer) => {
|
||||
buf += chunk.toString();
|
||||
@@ -44,7 +48,9 @@ export function peerSend(
|
||||
});
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
child.on("exit", (code) =>
|
||||
code === 0 ? resolve() : reject(new Error(`peer send exited ${code}: ${stderr.trim()}`)),
|
||||
code === 0
|
||||
? resolve()
|
||||
: reject(new Error(`peer send exited ${code}: ${stderr.trim()}`)),
|
||||
);
|
||||
child.on("error", reject);
|
||||
});
|
||||
|
||||
+11
-3
@@ -44,11 +44,17 @@ async function waitForHttps(url: string, timeoutMs: number): Promise<void> {
|
||||
if (ok) return;
|
||||
await sleep(1000);
|
||||
}
|
||||
throw new Error(`device webserver not ready at ${url} within ${timeoutMs}ms (last: ${lastErr})`);
|
||||
throw new Error(
|
||||
`device webserver not ready at ${url} within ${timeoutMs}ms (last: ${lastErr})`,
|
||||
);
|
||||
}
|
||||
|
||||
/** Poll a TCP port until it accepts a connection. */
|
||||
async function waitForTcp(host: string, port: number, timeoutMs: number): Promise<void> {
|
||||
async function waitForTcp(
|
||||
host: string,
|
||||
port: number,
|
||||
timeoutMs: number,
|
||||
): Promise<void> {
|
||||
const deadline = Date.now() + timeoutMs;
|
||||
let lastErr = "connection refused";
|
||||
while (Date.now() < deadline) {
|
||||
@@ -83,7 +89,9 @@ export default async function globalSetup(): Promise<void> {
|
||||
console.log("[e2e] bringing up meshtasticd two-node mesh ...");
|
||||
execSync(`docker compose -f ${COMPOSE_FILE} up -d`, { stdio: "inherit" });
|
||||
} else {
|
||||
console.log(`[e2e] hardware mode: device=${NODE_A_URL} peer=${PEER_HOST}:${PEER_PORT}`);
|
||||
console.log(
|
||||
`[e2e] hardware mode: device=${NODE_A_URL} peer=${PEER_HOST}:${PEER_PORT}`,
|
||||
);
|
||||
}
|
||||
|
||||
console.log(`[e2e] waiting for device webserver ${NODE_A_URL} ...`);
|
||||
|
||||
@@ -17,6 +17,8 @@ export default async function globalTeardown(): Promise<void> {
|
||||
console.log("[e2e] tearing down meshtasticd mesh ...");
|
||||
execSync(`docker compose -f ${COMPOSE_FILE} down -v`, { stdio: "inherit" });
|
||||
} else {
|
||||
console.log("[e2e] leaving meshtasticd mesh running (set E2E_DOCKER_DOWN=1 to stop).");
|
||||
console.log(
|
||||
"[e2e] leaving meshtasticd mesh running (set E2E_DOCKER_DOWN=1 to stop).",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,11 @@ import { expect, type Page } from "@playwright/test";
|
||||
export class ConnectionPage {
|
||||
constructor(private readonly page: Page) {}
|
||||
|
||||
async connectHttp(opts: { host: string; tls: boolean; name?: string }): Promise<void> {
|
||||
async connectHttp(opts: {
|
||||
host: string;
|
||||
tls: boolean;
|
||||
name?: string;
|
||||
}): Promise<void> {
|
||||
const { host, tls, name = "E2E Device" } = opts;
|
||||
const page = this.page;
|
||||
|
||||
@@ -25,7 +29,8 @@ export class ConnectionPage {
|
||||
await dialog.locator("#url").fill(host);
|
||||
|
||||
const httpsSwitch = dialog.getByRole("switch");
|
||||
const isChecked = (await httpsSwitch.getAttribute("aria-checked")) === "true";
|
||||
const isChecked =
|
||||
(await httpsSwitch.getAttribute("aria-checked")) === "true";
|
||||
if (tls !== isChecked) {
|
||||
await httpsSwitch.click();
|
||||
}
|
||||
@@ -33,11 +38,16 @@ export class ConnectionPage {
|
||||
await dialog.getByRole("button", { name: "Test connection" }).click();
|
||||
|
||||
const save = dialog.getByRole("button", { name: "Save connection" });
|
||||
await expect(save, "Save enables only after the device is reachable").toBeEnabled({
|
||||
await expect(
|
||||
save,
|
||||
"Save enables only after the device is reachable",
|
||||
).toBeEnabled({
|
||||
timeout: 20_000,
|
||||
});
|
||||
await save.click();
|
||||
|
||||
await expect(page).toHaveURL(/\/messages\/broadcast\/0/, { timeout: 60_000 });
|
||||
await expect(page).toHaveURL(/\/messages\/broadcast\/0/, {
|
||||
timeout: 60_000,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,9 @@ export class MessagesPage {
|
||||
await expect(this.input()).toBeEnabled();
|
||||
// The SDK chat client lags the composer (device handshake + sqlocal init), so
|
||||
// an immediate send is silently dropped. Gate on the "Connected" status.
|
||||
await expect(this.page.getByText("Connected", { exact: true }).first()).toBeVisible({
|
||||
await expect(
|
||||
this.page.getByText("Connected", { exact: true }).first(),
|
||||
).toBeVisible({
|
||||
timeout: 30_000,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -13,13 +13,17 @@ test.describe("broadcast messaging over a real two-node mesh", () => {
|
||||
await messagesPage.waitReady();
|
||||
});
|
||||
|
||||
test("renders a broadcast received from a mesh peer (mesh -> web)", async ({ messagesPage }) => {
|
||||
test("renders a broadcast received from a mesh peer (mesh -> web)", async ({
|
||||
messagesPage,
|
||||
}) => {
|
||||
const nonce = `pong-${Date.now()}`;
|
||||
await peerSend(nonce);
|
||||
await messagesPage.expectMessage(nonce);
|
||||
});
|
||||
|
||||
test("delivers a typed broadcast to the mesh (web -> mesh)", async ({ messagesPage }) => {
|
||||
test("delivers a typed broadcast to the mesh (web -> mesh)", async ({
|
||||
messagesPage,
|
||||
}) => {
|
||||
const nonce = `ping-${Date.now()}`;
|
||||
// Listen on the peer node before sending, then type+send from the browser.
|
||||
const recv = await startPeerRecv(nonce, { timeout: 60 });
|
||||
|
||||
@@ -28,16 +28,15 @@ test.describe("direct messaging over a real two-node mesh", () => {
|
||||
await messagesPage.waitReady();
|
||||
});
|
||||
|
||||
test.fixme(
|
||||
"delivers a direct message from the browser to the peer node (web -> mesh)",
|
||||
async ({ messagesPage }) => {
|
||||
const peerNum = await peerNodeNum();
|
||||
const nonce = `dm-${Date.now()}`;
|
||||
const recv = await startPeerRecv(nonce, { timeout: 60 });
|
||||
await messagesPage.openDirectMessageByNodeNum(peerNum);
|
||||
await messagesPage.send(nonce);
|
||||
const from = await recv.received;
|
||||
expect(from).toBeGreaterThan(0);
|
||||
},
|
||||
);
|
||||
test.fixme("delivers a direct message from the browser to the peer node (web -> mesh)", async ({
|
||||
messagesPage,
|
||||
}) => {
|
||||
const peerNum = await peerNodeNum();
|
||||
const nonce = `dm-${Date.now()}`;
|
||||
const recv = await startPeerRecv(nonce, { timeout: 60 });
|
||||
await messagesPage.openDirectMessageByNodeNum(peerNum);
|
||||
await messagesPage.send(nonce);
|
||||
const from = await recv.received;
|
||||
expect(from).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user