From ee1758a54845435ad721b21d96f5977c9c411969 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Wed, 13 Aug 2025 21:24:45 -0400 Subject: [PATCH 1/8] Add DFU mode to command menu (#781) * feat: add dfu mode to command menu * Update packages/web/src/components/CommandPalette/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/web/public/i18n/locales/en/commandPalette.json | 1 + packages/web/src/components/CommandPalette/index.tsx | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/packages/web/public/i18n/locales/en/commandPalette.json b/packages/web/public/i18n/locales/en/commandPalette.json index e3f80a3a..8c267e29 100644 --- a/packages/web/public/i18n/locales/en/commandPalette.json +++ b/packages/web/public/i18n/locales/en/commandPalette.json @@ -35,6 +35,7 @@ "scheduleShutdown": "Schedule Shutdown", "scheduleReboot": "Reboot Device", "resetNodeDb": "Reset Node DB", + "dfuMode": "Enter DFU Mode", "factoryResetDevice": "Factory Reset Device", "factoryResetConfig": "Factory Reset Config", "disconnect": "Disconnect" diff --git a/packages/web/src/components/CommandPalette/index.tsx b/packages/web/src/components/CommandPalette/index.tsx index 5c9753db..fc177862 100644 --- a/packages/web/src/components/CommandPalette/index.tsx +++ b/packages/web/src/components/CommandPalette/index.tsx @@ -19,6 +19,7 @@ import { CloudOff, EraserIcon, FactoryIcon, + HardDriveUpload, LayersIcon, LinkIcon, type LucideIcon, @@ -188,6 +189,13 @@ export const CommandPalette = () => { setDialogOpen("reboot", true); }, }, + { + label: t("contextual.command.dfuMode"), + icon: HardDriveUpload, + action() { + connection?.enterDfuMode() + }, + }, { label: t("contextual.command.resetNodeDb"), icon: TrashIcon, From 0b9ebade386d2475682a392927c273f8dc3a9b72 Mon Sep 17 00:00:00 2001 From: Henri Bergius Date: Thu, 14 Aug 2025 21:56:34 -0400 Subject: [PATCH 2/8] Initial Node.js serial transport (#779) * Initial Node.js serial transport * Minor doc fixes * Add serialport to lockfile * Typo fix * Fix link: --- packages/transport-node-serial/README.md | 28 ++++++ packages/transport-node-serial/mod.ts | 1 + packages/transport-node-serial/package.json | 39 +++++++++ .../transport-node-serial/src/transport.ts | 87 +++++++++++++++++++ packages/transport-node-serial/tsconfig.json | 18 ++++ pnpm-lock.yaml | 9 ++ 6 files changed, 182 insertions(+) create mode 100644 packages/transport-node-serial/README.md create mode 100644 packages/transport-node-serial/mod.ts create mode 100644 packages/transport-node-serial/package.json create mode 100644 packages/transport-node-serial/src/transport.ts create mode 100644 packages/transport-node-serial/tsconfig.json diff --git a/packages/transport-node-serial/README.md b/packages/transport-node-serial/README.md new file mode 100644 index 00000000..39694a8b --- /dev/null +++ b/packages/transport-node-serial/README.md @@ -0,0 +1,28 @@ +# @meshtastic/transport-node-serial + +[![JSR](https://jsr.io/badges/@meshtastic/transport-node-serial)](https://jsr.io/@meshtastic/transport-node-serial) +[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml) +[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js) +[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/) +[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss) + +## Overview + +`@meshtastic/transport-noden-node` Provides Serial transport (Node) for Meshtastic +devices. Installation instructions are available at +[JSR](https://jsr.io/@meshtastic/transport-node-serial) +[NPM](https://www.npmjs.com/package/@meshtastic/transport-node-serial) + +## Usage + +```ts +import { MeshDevice } from "@meshtastic/core"; +import { TransportNodeSerial } from "@meshtastic/transport-node-serial"; + +const transport = await TransportNodeSerial.create("/dev/cu.usbserial-0001"); +const device = new MeshDevice(transport); +``` + +## Stats + +![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image") diff --git a/packages/transport-node-serial/mod.ts b/packages/transport-node-serial/mod.ts new file mode 100644 index 00000000..5aef1978 --- /dev/null +++ b/packages/transport-node-serial/mod.ts @@ -0,0 +1 @@ +export { TransportNodeSerial } from "./src/transport.ts"; diff --git a/packages/transport-node-serial/package.json b/packages/transport-node-serial/package.json new file mode 100644 index 00000000..2da57d18 --- /dev/null +++ b/packages/transport-node-serial/package.json @@ -0,0 +1,39 @@ +{ + "name": "@meshtastic/transport-node-serial", + "version": "0.0.1", + "description": "NodeJS-specific serial transport layer for Meshtastic web applications.", + "exports": { + ".": "./dist/mod.mjs" + }, + "main": "./dist/mod.mjs", + "module": "./dist/mod.mjs", + "types": "./dist/mod.d.mts", + + "license": "GPL-3.0-only", + "tsdown": { + "entry": "mod.ts", + "dts": true, + "format": ["esm"], + "splitting": false, + "clean": true + }, + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], + "scripts": { + "preinstall": "npx only-allow pnpm", + "prepack": "cp ../../LICENSE ./LICENSE", + "clean": "rm -rf dist LICENSE", + "build:npm": "tsdown", + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", + "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" + }, + "dependencies": { + "@meshtastic/core": "workspace:*", + "serialport": "^13.0.0" + } +} diff --git a/packages/transport-node-serial/src/transport.ts b/packages/transport-node-serial/src/transport.ts new file mode 100644 index 00000000..02f439e2 --- /dev/null +++ b/packages/transport-node-serial/src/transport.ts @@ -0,0 +1,87 @@ +import { Readable, Writable } from "node:stream"; +import type { Types } from "@meshtastic/core"; +import { Utils } from "@meshtastic/core"; +import { SerialPort } from "serialport"; + +export class TransportNodeSerial implements Types.Transport { + private readonly _toDevice: WritableStream; + private readonly _fromDevice: ReadableStream; + private port: SerialPort | undefined; + + /** + * Creates and connects a new TransportNode instance. + * @param path - Path to the serial device + * @param baudRate - The port number for the TCP connection (defaults to 4403). + * @returns A promise that resolves with a connected TransportNode instance. + */ + public static create(path: string, baudRate = 115200): Promise { + return new Promise((resolve, reject) => { + const port = new SerialPort({ + path, + baudRate, + autoOpen: true, + }); + + const onError = (err: Error) => { + port.close(); + reject(err); + }; + + port.once("error", onError); + port.on("open", () => { + port.removeListener("error", onError); + resolve(new TransportNodeSerial(port)); + }); + }); + } + + /** + * Constructs a new TransportNode. + * @param port - An active Node.js SerialPort connection. + */ + constructor(port: SerialPort) { + this.port = port; + this.port.on("error", (err) => { + console.error("Serial port connection error:", err); + }); + + const fromDeviceSource = Readable.toWeb( + port, + ) as ReadableStream; + this._fromDevice = fromDeviceSource.pipeThrough(Utils.fromDeviceStream()); + + // Stream for data going FROM the application TO the Meshtastic device. + const toDeviceTransform = Utils.toDeviceStream; + this._toDevice = toDeviceTransform.writable; + + // The readable end of the transform is then piped to the Node.js SerialPort connection. + // A similar assertion is needed here because `Writable.toWeb` also returns + // a generically typed stream (`WritableStream`). + toDeviceTransform.readable + .pipeTo(Writable.toWeb(port) as WritableStream) + .catch((err) => { + console.error("Error piping data to serial port:", err); + this.port.close(err as Error); + }); + } + + /** + * The WritableStream to send data to the Meshtastic device. + */ + public get toDevice(): WritableStream { + return this._toDevice; + } + + /** + * The ReadableStream to receive data from the Meshtastic device. + */ + public get fromDevice(): ReadableStream { + return this._fromDevice; + } + + disconnect() { + this.port.close(); + this.port = undefined; + return Promise.resolve(); + } +} diff --git a/packages/transport-node-serial/tsconfig.json b/packages/transport-node-serial/tsconfig.json new file mode 100644 index 00000000..8ec7c702 --- /dev/null +++ b/packages/transport-node-serial/tsconfig.json @@ -0,0 +1,18 @@ + { + "extends": "../../tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "target": "ES2020", + "declaration": true, + "outDir": "./dist", + "moduleResolution": "bundler", + "emitDeclarationOnly": false, + "esModuleInterop": true, + }, + "include": ["src"] +} + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8859ac33..73e2d278 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,15 @@ importers: specifier: workspace:* version: link:../core + packages/transport-node-serial: + dependencies: + '@meshtastic/core': + specifier: workspace:* + version: link:../core + 'serialport': + specifier: npm:serialport@^13.0.0 + version: 13.0.0 + packages/transport-web-bluetooth: dependencies: '@meshtastic/core': From d5b03c09db8c7f2560cf8f8e77c1513420feda33 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 17 Aug 2025 11:43:18 -0400 Subject: [PATCH 3/8] chore(i18n): New Crowdin Translations by GitHub Action (#784) Co-authored-by: Crowdin Bot --- .../web/public/i18n/locales/bg-BG/common.json | 2 +- .../i18n/locales/bg-BG/deviceConfig.json | 24 +++++++++---------- .../web/public/i18n/locales/bg-BG/dialog.json | 20 ++++++++-------- .../public/i18n/locales/bg-BG/messages.json | 12 +++++----- .../i18n/locales/bg-BG/moduleConfig.json | 4 ++-- .../web/public/i18n/locales/bg-BG/nodes.json | 4 ++-- .../web/public/i18n/locales/bg-BG/ui.json | 10 ++++---- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/packages/web/public/i18n/locales/bg-BG/common.json b/packages/web/public/i18n/locales/bg-BG/common.json index c44e223b..3c2d7209 100644 --- a/packages/web/public/i18n/locales/bg-BG/common.json +++ b/packages/web/public/i18n/locales/bg-BG/common.json @@ -25,7 +25,7 @@ "save": "Запис", "scanQr": "Сканиране на QR кода", "traceRoute": "Trace Route", - "submit": "Submit" + "submit": "Изпращане" }, "app": { "title": "Meshtastic", diff --git a/packages/web/public/i18n/locales/bg-BG/deviceConfig.json b/packages/web/public/i18n/locales/bg-BG/deviceConfig.json index 079cb923..b7e6b3ad 100644 --- a/packages/web/public/i18n/locales/bg-BG/deviceConfig.json +++ b/packages/web/public/i18n/locales/bg-BG/deviceConfig.json @@ -18,22 +18,22 @@ "description": "Настройки за устройството", "buttonPin": { "description": "Button pin override", - "label": "Button Pin" + "label": "Пин за бутон" }, "buzzerPin": { "description": "Buzzer pin override", - "label": "Buzzer Pin" + "label": "Пин за зумер" }, "disableTripleClick": { - "description": "Disable triple click", - "label": "Disable Triple Click" + "description": "Дезактивиране на трикратното щракване", + "label": "Дезактивиране на трикратното щракване" }, "doubleTapAsButtonPress": { "description": "Treat double tap as button press", "label": "Double Tap as Button Press" }, "ledHeartbeatDisabled": { - "description": "Disable default blinking LED", + "description": "Дезактивиране на мигащия светодиод по подразбиране", "label": "LED Heartbeat Disabled" }, "nodeInfoBroadcastInterval": { @@ -138,7 +138,7 @@ "label": "Отместване на честотата" }, "frequencySlot": { - "description": "LoRa frequency channel number", + "description": "Номер на LoRa честотен канал", "label": "Честотен слот" }, "hopLimit": { @@ -277,7 +277,7 @@ }, "enablePin": { "description": "GPS module enable pin override", - "label": "Enable Pin" + "label": "Активиране на пин" }, "fixedPosition": { "description": "Don't report GPS position, but a manually-specified one", @@ -341,7 +341,7 @@ }, "ina219Address": { "description": "Address of the INA219 battery monitor", - "label": "INA219 Address" + "label": "INA219 адрес" }, "lightSleepDuration": { "description": "How long the device will be in light sleep for", @@ -353,7 +353,7 @@ }, "noConnectionBluetoothDisabled": { "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long", - "label": "No Connection Bluetooth Disabled" + "label": "Няма връзка Bluetooth е дезактивиран" }, "powerSavingEnabled": { "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.", @@ -390,10 +390,10 @@ }, "managed": { "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.", - "label": "Managed" + "label": "Управляван" }, "privateKey": { - "description": "Used to create a shared key with a remote device", + "description": "Използва се за създаване на споделен ключ с отдалечено устройство", "label": "Частен ключ" }, "publicKey": { @@ -418,7 +418,7 @@ }, "adminSettings": { "description": "Настройки за Admin", - "label": "Admin Settings" + "label": "Администраторски настройки" }, "loggingSettings": { "description": "Settings for Logging", diff --git a/packages/web/public/i18n/locales/bg-BG/dialog.json b/packages/web/public/i18n/locales/bg-BG/dialog.json index dec5e0b6..1c94594f 100644 --- a/packages/web/public/i18n/locales/bg-BG/dialog.json +++ b/packages/web/public/i18n/locales/bg-BG/dialog.json @@ -9,10 +9,10 @@ "shortName": "Кратко име", "title": "Промяна на името на устройството", "validation": { - "longNameMax": "Long name must not be more than 40 characters", - "shortNameMax": "Short name must not be more than 4 characters", - "longNameMin": "Long name must have at least 1 character", - "shortNameMin": "Short name must have at least 1 character" + "longNameMax": "Дългото име не трябва да е повече от 40 знака", + "shortNameMax": "Краткото име не трябва да е повече от 4 знака", + "longNameMin": "Дългото име трябва да съдържа поне 1 символ", + "shortNameMin": "Краткото име трябва да съдържа поне 1 символ" } }, "import": { @@ -23,7 +23,7 @@ "channelPrefix": "Канал: ", "channelSetUrl": "Channel Set/QR Code URL", "channels": "Канали:", - "usePreset": "Use Preset?", + "usePreset": "Използване на предварително зададени настройки?", "title": "Import Channel Set" }, "locationResponse": { @@ -68,11 +68,11 @@ "bluetoothConnection": { "noDevicesPaired": "Все още няма сдвоени устройства.", "newDeviceButton": "Ново устройство", - "connectionFailed": "Connection failed", - "deviceDisconnected": "Device disconnected", + "connectionFailed": "Връзката е неуспешна", + "deviceDisconnected": "Устройството не е свързано", "unknownDevice": "Неизвестно устройство", - "errorLoadingDevices": "Error loading devices", - "unknownErrorLoadingDevices": "Unknown error loading devices" + "errorLoadingDevices": "Грешка при зареждане на устройствата", + "unknownErrorLoadingDevices": "Неизвестна грешка при зареждане на устройствата" }, "validation": { "requiresFeatures": "Този тип връзка изисква <0>. Моля, използвайте поддържан браузър, като Chrome или Edge.", @@ -116,7 +116,7 @@ "pkiBackupReminder": { "description": "Препоръчваме редовно да правите резервни копия на данните с вашите ключове. Искате ли да направите резервно копие сега?", "title": "Напомняне за резервно копие", - "remindLaterPrefix": "Remind me in", + "remindLaterPrefix": "Напомни ми в", "remindNever": "Никога не ми напомняй", "backupNow": "Създаване на резервно копие сега" }, diff --git a/packages/web/public/i18n/locales/bg-BG/messages.json b/packages/web/public/i18n/locales/bg-BG/messages.json index aa1bf60f..9e9c68fe 100644 --- a/packages/web/public/i18n/locales/bg-BG/messages.json +++ b/packages/web/public/i18n/locales/bg-BG/messages.json @@ -1,14 +1,14 @@ { "page": { "title": "Съобщения: {{chatName}}", - "placeholder": "Enter Message" + "placeholder": "Въведете съобщение" }, "emptyState": { "title": "Изберете чат", "text": "Все още няма съобщения." }, "selectChatPrompt": { - "text": "Select a channel or node to start messaging." + "text": "Изберете канал или възел, за да стартирате съобщения." }, "sendMessage": { "placeholder": "Въведете Вашето съобщение тук...", @@ -24,16 +24,16 @@ "displayText": "Съобщението е доставено" }, "failed": { - "label": "Message delivery failed", - "displayText": "Delivery failed" + "label": "Доставката на съобщението не е успешна", + "displayText": "Неуспешна доставка" }, "unknown": { "label": "Статусът на съобщението е неизвестен", "displayText": "Неизвестно състояние" }, "waiting": { - "label": "Sending message", - "displayText": "Waiting for delivery" + "label": "Изпращане на съобщение", + "displayText": "Чака доставка" } } } diff --git a/packages/web/public/i18n/locales/bg-BG/moduleConfig.json b/packages/web/public/i18n/locales/bg-BG/moduleConfig.json index d8d1b2e6..3d45c674 100644 --- a/packages/web/public/i18n/locales/bg-BG/moduleConfig.json +++ b/packages/web/public/i18n/locales/bg-BG/moduleConfig.json @@ -45,8 +45,8 @@ "description": "Enable Codec 2 audio encoding" }, "pttPin": { - "label": "PTT Pin", - "description": "GPIO pin to use for PTT" + "label": "Пин за РТТ", + "description": "GPIO пин, който да се използва за PTT" }, "bitrate": { "label": "Bitrate", diff --git a/packages/web/public/i18n/locales/bg-BG/nodes.json b/packages/web/public/i18n/locales/bg-BG/nodes.json index 859af2fa..e3a88804 100644 --- a/packages/web/public/i18n/locales/bg-BG/nodes.json +++ b/packages/web/public/i18n/locales/bg-BG/nodes.json @@ -28,10 +28,10 @@ "label": "Височина" }, "channelUtil": { - "label": "Channel Util" + "label": "Използване на канала" }, "airtimeUtil": { - "label": "Airtime Util" + "label": "Използване на ефирно време" } }, "nodesTable": { diff --git a/packages/web/public/i18n/locales/bg-BG/ui.json b/packages/web/public/i18n/locales/bg-BG/ui.json index 20a37315..d8bb5bbc 100644 --- a/packages/web/public/i18n/locales/bg-BG/ui.json +++ b/packages/web/public/i18n/locales/bg-BG/ui.json @@ -136,7 +136,7 @@ "label": "Филтър" }, "advanced": { - "label": "Advanced" + "label": "Разширени" }, "clearInput": { "label": "Clear input" @@ -149,7 +149,7 @@ "placeholder": "Meshtastic 1234" }, "airtimeUtilization": { - "label": "Airtime Utilization (%)" + "label": "Използване на ефира (%)" }, "batteryLevel": { "label": "Ниво на батерията (%)", @@ -179,16 +179,16 @@ "label": "Любими" }, "hide": { - "label": "Hide" + "label": "Скриване" }, "showOnly": { - "label": "Show Only" + "label": "Показване само" }, "viaMqtt": { "label": "Свързан чрез MQTT" }, "hopsUnknown": { - "label": "Unknown number of hops" + "label": "Неизвестен брой хопове" }, "showUnheard": { "label": "Never heard" From a4c817cd304711d3aa58ead27e5e0547b2557493 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 17 Aug 2025 14:32:10 -0400 Subject: [PATCH 4/8] Added contribution guidelines doc (#788) * added contribution guidelines doc * Update packages/web/CONTRIBUTIONS.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/web/CONTRIBUTIONS.md | 150 ++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 packages/web/CONTRIBUTIONS.md diff --git a/packages/web/CONTRIBUTIONS.md b/packages/web/CONTRIBUTIONS.md new file mode 100644 index 00000000..64dd2be5 --- /dev/null +++ b/packages/web/CONTRIBUTIONS.md @@ -0,0 +1,150 @@ +# Contributing to Meshtastic Web + +Thank you for your interest in contributing to **Meshtastic Web**! 🎉 +We welcome all contributions—whether it’s fixing a typo, improving documentation, adding new features, or reporting bugs. This document outlines how to get started and the conventions we follow. + +--- + +## 📋 Code of Conduct +We follow the [Meshtastic Code of Conduct](https://meshtastic.org/docs/legal/conduct/). +Please make sure you are familiar with it before contributing. + +--- + +## 🚀 Getting Started +Before making changes, please take some time to explore the repository and its monorepo structure. +Understanding how the packages are organized will make it much easier to contribute effectively. + +[Meshtastic Web](https://github.com/meshtastic/web/) + +### Prerequisites +- [Node.js](https://nodejs.org/) (v22 or later) +- [pnpm](https://pnpm.io/) (v10.14.x or later) +- Git + +### Installation +Clone the repo and install dependencies: + +```bash +git clone https://github.com/meshtastic/web.git meshtastic-web +cd meshtastic-web +pnpm install +``` + +### Development +Start the development server: + +```bash +pnpm --filter @meshtastic/web dev +``` + +Once running, the site will be available at: +👉 **http://localhost:3000** + +--- + +## 🗂 Repository Structure +Meshtastic Web uses a **monorepo** setup managed with **pnpm workspaces**: + +``` +/packages + ├─ web # React frontend + ├─ core # Shared types & logic + ├─ transport-* # Transport layer packages + └─ ...other packages +``` + +--- + +## ✅ Contribution Workflow + +1. **Fork the repo** and create your branch from `main`. + + ### Branch Naming + - Use [Conventional Commit](https://www.conventionalcommits.org/) style for your branch names: + ``` + feat/add-project-filter + fix/storage-service + chore/update-ci-cache + ``` + +2. **Make your changes locally** and verify that the app runs as expected at `http://localhost:3000`. + +3. **Commit your changes** with a descriptive commit message that follows the [Conventional Commits](https://www.conventionalcommits.org/) style. + +4. **Open a Pull Request (PR)** from your fork's branch to the main repository's `main` branch on GitHub: + - Clearly describe the problem and solution. + - Reference related issues (e.g., `Fixes #123`). + - Keep PRs focused on a single feature or fix. + - Complete all fields in the PR template. + - Tag a **Meshtastic Web developer** in the PR for review. + +5. **CI/CD**: + - Our GitHub Actions workflows handle builds, linting, and packaging automatically. + - All checks must pass before merge. + +--- + +## 🌍 Internationalization (i18n) + +Meshtastic Web supports multiple languages. If your changes introduce **new user-facing strings**: + +- Add them to the **`en.json`** file. +- Do **not** hardcode English strings directly in components. +- This ensures they can be translated into other languages. + +🔗 See these guides for more details: +- [i18n Developer Guide](https://github.com/meshtastic/web/blob/main/packages/web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md) +- [Translation Contribution Guide](https://github.com/meshtastic/web/blob/main/packages/web/CONTRIBUTING_TRANSLATIONS.md) + +--- + +## 🧪 Testing +Tests are written with [Vitest](https://vitest.dev/). + +Run all tests locally with: + +```bash +pnpm --filter @meshtastic/web test +``` + +Please include tests for new features and bug fixes whenever possible. + +--- + +## 📝 Commit Messages +We use **Conventional Commits**: + +- `feat:` – a new feature +- `fix:` – a bug fix +- `docs:` – documentation changes +- `chore:` – maintenance, dependencies, build scripts +- `refactor:` – code restructuring without feature changes +- `test:` – adding or updating tests +- `ci:` – CI/CD changes + +Example: +``` +feat: add toast notification system +fix: correct caching issue in storage service +``` + +--- + +## 💡 Tips for Contributors +- Keep PRs **small, focused, and atomic**. +- Discuss larger changes with the team on [Discord](https://discord.gg/meshtastic) before starting work. +- If unsure, open a draft PR for early feedback. + +--- + +## 🙌 Community +Contributors are the heart of Meshtastic ❤️. +Join the conversation: +- [Discord](https://discord.gg/meshtastic) +- [GitHub Discussions](https://github.com/meshtastic/web/discussions) + +--- + +## 📜 License +By contributing, you agree that your contributions will be licensed under the [GPL-3.0-only License](../../LICENSE). From 2ca3eb568517bf96376645c0904dd35af03dde27 Mon Sep 17 00:00:00 2001 From: Jeremy Gallant <8975765+philon-@users.noreply.github.com> Date: Mon, 18 Aug 2025 15:03:15 +0200 Subject: [PATCH 5/8] Missing validation strings (#791) Partially revert 43143bf Co-authored-by: philon- --- packages/web/public/i18n/locales/en/dialog.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/web/public/i18n/locales/en/dialog.json b/packages/web/public/i18n/locales/en/dialog.json index 73a869d5..c954f0d3 100644 --- a/packages/web/public/i18n/locales/en/dialog.json +++ b/packages/web/public/i18n/locales/en/dialog.json @@ -76,8 +76,9 @@ "unknownErrorLoadingDevices": "Unknown error loading devices" }, "validation": { - "requiresFeatures": "This connection type requires <0>. Please use a supported browser, like Chrome or Edge.", - "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", + "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth. Please use a supported browser, like Chrome or Edge.", + "requiresWebSerial": "This connection type requires <0>Web Serial. Please use a supported browser, like Chrome or Edge.", + "requiresSecureContext": "This application requires a <0>secure context. Please connect using HTTPS or localhost.", "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context. Please connect using HTTPS or localhost." } }, From 65a53388bb77b046fbeb03ce3112b098284d33ed Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Mon, 18 Aug 2025 09:06:48 -0400 Subject: [PATCH 6/8] Fix docker nginx config (#786) * Fix docker-nginx-config sub directory issue * Fix docker-nginx-config sub directory issue * Update packages/web/infra/default.conf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/infra/default.conf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * adding lock file --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/web/infra/default.conf | 89 ++++++++++-------- packages/web/package.json | 1 + pnpm-lock.yaml | 156 ++++++++++++++++---------------- 3 files changed, 128 insertions(+), 118 deletions(-) diff --git a/packages/web/infra/default.conf b/packages/web/infra/default.conf index aff74785..4b3ba516 100644 --- a/packages/web/infra/default.conf +++ b/packages/web/infra/default.conf @@ -1,42 +1,51 @@ server { - listen 8080; - server_name localhost; - - root /usr/share/nginx/html; - index index.html index.htm; - - location / { - try_files $uri $uri/ /index.html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - internal; - } - - location ~ /\.ht { - deny all; - } - - gzip on; - gzip_disable "msie6"; - - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_types - text/plain - text/css - text/xml - text/javascript - application/javascript - application/x-javascript - application/json - application/xml - application/xml+rss - font/ttf - font/otf - image/svg+xml; + listen 8080; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location ~* \.(?:js|jsx|mjs|ts|tsx|css|png|jpg|jpeg|gif|ico|webp|avif|svg|ttf|otf|woff|woff2|map)$ { + access_log off; + etag on; + + expires 3M; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + location = /index.html { + etag on; + add_header Cache-Control "no-cache"; + } + + location / { + try_files $uri $uri/ /index.html; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { internal; } + + location ~ /\.ht { deny all; } + + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types + text/plain + text/css + text/xml + text/javascript + application/javascript + application/x-javascript + application/json + application/xml + application/xml+rss + font/ttf + font/otf + image/svg+xml; } diff --git a/packages/web/package.json b/packages/web/package.json index 88e4b6ed..c29040e1 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -22,6 +22,7 @@ "test": "vitest", "ts:check": "bun run tsc --noEmit", "preview": "vite preview", + "docker:build": "docker build -t meshtastic-web:latest -f ./infra/Containerfile .", "generate:routes": "bun @tanstack/router-cli generate --outDir src/ routes --rootRoutePath /", "package": "gzipper c -i html,js,css,png,ico,svg,json,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ." }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73e2d278..1a86acb3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -821,12 +821,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/runtime@0.80.0': - resolution: {integrity: sha512-3rzy1bJAZ4s7zV9TKT60x119RwJDCDqEtCwK/Zc2qlm7wGhiIUxLLYUhE/mN91yB0u1kxm5sh4NjU12sPqQTpg==} + '@oxc-project/runtime@0.81.0': + resolution: {integrity: sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==} engines: {node: '>=6.9.0'} - '@oxc-project/types@0.80.0': - resolution: {integrity: sha512-xxHQm8wfCv2e8EmtaDwpMeAHOWqgQDAYg+BJouLXSQt5oTKu9TIXrgNMGSrM2fLvKmECsRd9uUFAAD+hPyootA==} + '@oxc-project/types@0.81.0': + resolution: {integrity: sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==} '@quansync/fs@0.1.4': resolution: {integrity: sha512-vy/41FCdnIalPTQCb2Wl0ic1caMdzGus4ktDp+gpZesQNydXcx8nhh8qB3qMPbGkictOTaXgXEUUfQEm8DQYoA==} @@ -1343,81 +1343,81 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/binding-android-arm64@1.0.0-beta.31': - resolution: {integrity: sha512-0mFtKwOG7smn0HkvQ6h8j0m/ohkR7Fp5eMTJ2Pns/HSbePHuDpxMaQ4TjZ6arlVXxpeWZlAHeT5BeNsOA3iWTg==} + '@rolldown/binding-android-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.31': - resolution: {integrity: sha512-BHfHJ8Nb5G7ZKJl6pimJacupONT4F7w6gmQHw41rouAnJF51ORDwGefWeb6OMLzGmJwzxlIVPERfnJf1EsMM7A==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.31': - resolution: {integrity: sha512-4MiuRtExC08jHbSU/diIL+IuQP+3Ck1FbWAplK+ysQJ7fxT3DMxy5FmnIGfmhaqow8oTjb2GEwZJKgTRjZL1Vw==} + '@rolldown/binding-darwin-x64@1.0.0-beta.32': + resolution: {integrity: sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.31': - resolution: {integrity: sha512-nffC1u7ccm12qlAea8ExY3AvqlaHy/o/3L4p5Es8JFJ3zJSs6e3DyuxGZZVdl9EVwsLxPPTvioIl4tEm2afwyw==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': + resolution: {integrity: sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': - resolution: {integrity: sha512-LHmAaB3rB1GOJuHscKcL2Ts/LKLcb3YWTh2uQ/876rg/J9WE9kQ0kZ+3lRSYbth/YL8ln54j4JZmHpqQY3xptQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': + resolution: {integrity: sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': - resolution: {integrity: sha512-oTDZVfqIAjLB2I1yTiLyyhfPPO6dky33sTblxTCpe+ZT55WizN3KDoBKJ4yXG8shI6I4bRShVu29Xg0yAjyQYw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': + resolution: {integrity: sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': - resolution: {integrity: sha512-duJ3IkEBj9Xe9NYW1n8Y3483VXHGi8zQ0ZsLbK8464EJUXLF7CXM8Ry+jkkUw+ZvA+Zu1E/+C6p2Y6T9el0C9g==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': + resolution: {integrity: sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': - resolution: {integrity: sha512-qdbmU5QSZ0uoLZBYMxiHsMQmizqtzFGTVPU5oyU1n0jU0Mo+mkSzqZuL8VBnjHOHzhVxZsoAGH9JjiRzCnoGVA==} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': - resolution: {integrity: sha512-H7+r34TSV8udB2gAsebFM/YuEeNCkPGEAGJ1JE7SgI9XML6FflqcdKfrRSneQFsPaom/gCEc1g0WW5MZ0O3blw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': + resolution: {integrity: sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': - resolution: {integrity: sha512-zRm2YmzFVqbsmUsyyZnHfJrOlQUcWS/FJ5ZWL8Q1kZh5PnLBrTVZNpakIWwAxpN5gNEi9MmFd5YHocVJp8ps1Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': + resolution: {integrity: sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==} cpu: [x64] os: [linux] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': - resolution: {integrity: sha512-fM1eUIuHLsNJXRlWOuIIex1oBJ89I0skFWo5r/D3KSJ5gD9MBd3g4Hp+v1JGohvyFE+7ylnwRxSUyMEeYpA69A==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': + resolution: {integrity: sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-4nftR9V2KHH3zjBwf6leuZZJQZ7v0d70ogjHIqB3SDsbDLvVEZiGSsSn2X6blSZRZeJSFzK0pp4kZ67zdZXwSw==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-0TQcKu9xZVHYALit+WJsSuADGlTFfOXhnZoIHWWQhTk3OgbwwbYcSoZUXjRdFmR6Wswn4csHtJGN1oYKeQ6/2g==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-3zMICWwpZh1jrkkKDYIUCx/2wY3PXLICAS0AnbeLlhzfWPhCcpNK9eKhiTlLAZyTp+3kyipoi/ZSVIh+WDnBpQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-Ej0i4PZk8ltblZtzVK8ouaGUacUtxRmTm5S9794mdyU/tYxXjAJNseOfxrnHpMWKjMDrOKbqkPqJ52T9NR4LQQ==} cpu: [x64] os: [win32] '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.31': - resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} + '@rolldown/pluginutils@1.0.0-beta.32': + resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -3572,8 +3572,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.31: - resolution: {integrity: sha512-M2Q+RfG0FMJeSW3RSFTbvtjGVTcQpTQvN247D0EMSsPkpZFoinopR9oAnQiwgogQyzDuvKNnbyCbQQlmNAzSoQ==} + rolldown@1.0.0-beta.32: + resolution: {integrity: sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==} hasBin: true rollup@4.46.2: @@ -4613,9 +4613,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oxc-project/runtime@0.80.0': {} + '@oxc-project/runtime@0.81.0': {} - '@oxc-project/types@0.80.0': {} + '@oxc-project/types@0.81.0': {} '@quansync/fs@0.1.4': dependencies: @@ -5170,53 +5170,53 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@rolldown/binding-android-arm64@1.0.0-beta.31': + '@rolldown/binding-android-arm64@1.0.0-beta.32': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.31': + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.31': + '@rolldown/binding-darwin-x64@1.0.0-beta.32': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.31': + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': dependencies: '@napi-rs/wasm-runtime': 1.0.3 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.31': {} + '@rolldown/pluginutils@1.0.0-beta.32': {} '@rollup/pluginutils@4.2.1': dependencies: @@ -8065,7 +8065,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.31)(typescript@5.9.2): + rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 @@ -8075,34 +8075,34 @@ snapshots: debug: 4.4.1 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.31 + rolldown: 1.0.0-beta.32 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.31: + rolldown@1.0.0-beta.32: dependencies: - '@oxc-project/runtime': 0.80.0 - '@oxc-project/types': 0.80.0 - '@rolldown/pluginutils': 1.0.0-beta.31 + '@oxc-project/runtime': 0.81.0 + '@oxc-project/types': 0.81.0 + '@rolldown/pluginutils': 1.0.0-beta.32 ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.31 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.31 - '@rolldown/binding-darwin-x64': 1.0.0-beta.31 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.31 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-ohos': 1.0.0-beta.31 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.31 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.31 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.31 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.31 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.31 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.31 + '@rolldown/binding-android-arm64': 1.0.0-beta.32 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.32 + '@rolldown/binding-darwin-x64': 1.0.0-beta.32 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.32 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.32 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.32 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.32 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.32 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.32 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.32 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.32 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.32 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.32 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.32 rollup@4.46.2: dependencies: @@ -8396,8 +8396,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.31 - rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.31)(typescript@5.9.2) + rolldown: 1.0.0-beta.32 + rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 From eb9b7159d4c1644ecb9baeb85c702ca46c2c6311 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Mon, 18 Aug 2025 09:07:13 -0400 Subject: [PATCH 7/8] Refactor github actions with monorepo support (#783) * refactor github actions with monorepo support * Update .github/workflows/release-packages.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/release-packages.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * updates * changed order of ci/pr steps * Update .github/workflows/release-web.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * adding lock file --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/ci.yml | 14 +- .github/workflows/nightly.yml | 85 +++++++----- .github/workflows/pr.yml | 52 +++---- .github/workflows/release-packages.yml | 130 ++++++++++-------- .github/workflows/release-web.yml | 58 +++++--- .../workflows/update-stable-from-master.yml | 63 ++++++--- .gitignore | 1 + package.json | 14 +- packages/core/package.json | 11 +- packages/transport-deno/package.json | 7 +- packages/transport-http/package.json | 18 +-- packages/transport-node/package.json | 5 +- packages/transport-web-bluetooth/package.json | 12 +- packages/transport-web-serial/package.json | 12 +- 14 files changed, 297 insertions(+), 185 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b7e6d19..332ea63f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,16 +15,18 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: latest + cache: pnpm + cache-dependency-path: '**/pnpm-lock.yaml' - name: Setup Deno uses: denoland/setup-deno@v2 @@ -59,7 +61,7 @@ jobs: if [[ -f "$pkg_dir/package.json" ]] && [[ "$pkg_dir" != "packages/web" ]]; then echo "🔧 Building with pnpm: $pkg_dir" - (cd "$pkg_dir" && pnpm install && pnpm run build:npm) + (cd "$pkg_dir" && pnpm install --frozen-lockfile && pnpm run build:npm) else echo "⚠️ Skipping $pkg_dir (web package or no package.json)" fi diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 08dd6bd2..94faaaca 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,91 +1,101 @@ -name: "Nightly Release" +name: Nightly Release on: schedule: - - cron: "0 5 * * *" # Run every day at 5am UTC + - cron: "0 5 * * *" # 05:00 UTC daily + workflow_dispatch: {} # allow manual runs too permissions: - contents: write + contents: read packages: write +env: + REGISTRY_IMAGE: ghcr.io/${{ github.repository }} + jobs: nightly-build-and-push: runs-on: ubuntu-latest + steps: - name: Checkout uses: actions/checkout@v4 + # Node + pnpm (with built-in cache) - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 + cache: pnpm + cache-dependency-path: '**/pnpm-lock.yaml' - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: latest - - name: Cache pnpm dependencies - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - packages/web/node_modules - key: ${{ runner.os }}-pnpm-${{ hashFiles('packages/web/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- + - name: Install deps (root) + run: pnpm install --frozen-lockfile - name: Run tests run: pnpm run test - - name: Install Dependencies - working-directory: packages/web - run: pnpm install - - - name: Build Package + - name: Build web package working-directory: packages/web run: pnpm run build - - name: Package Output + - name: Package output working-directory: packages/web run: pnpm run package - - name: Archive compressed build + - name: Upload compressed build (artifact) uses: actions/upload-artifact@v4 with: - name: build + name: web-build-nightly path: packages/web/dist/build.tar + if-no-files-found: error - - name: Get latest release version - id: get_release + - name: Determine nightly tag + id: meta + shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - LATEST_TAG=$(curl -sL \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ - https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r ".tag_name") - # Fallback to a default if no release is found - if [ -z "$LATEST_TAG" ]; then - LATEST_TAG="2.6.0" + set -euo pipefail + DATE="$(date -u +%Y%m%d)" + SHORTSHA="$(git rev-parse --short=12 HEAD)" + # Try to use latest release tag if it exists; fallback to package version; else date + LATEST_TAG="$(gh release view --json tagName --jq .tagName 2>/dev/null || true)" + if [ -z "$LATEST_TAG" ] && [ -f packages/web/package.json ]; then + LATEST_TAG="v$(jq -r .version packages/web/package.json)" fi - echo "tag=${LATEST_TAG}" >> $GITHUB_OUTPUT + if [ -n "$LATEST_TAG" ] && [ "$LATEST_TAG" != "vnull" ]; then + TAG="nightly-${LATEST_TAG}-${SHORTSHA}" + else + TAG="nightly-${DATE}-${SHORTSHA}" + fi + echo "tag=$TAG" >> "$GITHUB_OUTPUT" + echo "tags=nightly, $TAG" >> "$GITHUB_OUTPUT" + echo "Resolved nightly tags: nightly, $TAG" - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - name: Buildah Build + - name: Build Container Image (multi-arch) id: build-container uses: redhat-actions/buildah-build@v2 with: containerfiles: | ./packages/web/infra/Containerfile - image: ${{ github.event.repository.full_name }} - tags: nightly-${{ steps.get_release.outputs.tag }}-${{ github.sha }} - - + image: ${{ env.REGISTRY_IMAGE }} + tags: ${{ steps.meta.outputs.tags }} oci: true platforms: linux/amd64, linux/arm64 + labels: | + org.opencontainers.image.source=${{ github.repository }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.created=${{ github.run_id }} - - name: Push To Registry + - name: Push To GHCR id: push-to-registry uses: redhat-actions/push-to-registry@v2 with: @@ -95,6 +105,5 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Print image url + - name: Print image URL run: echo "Image pushed to ${{ steps.push-to-registry.outputs.registry-paths }}" - diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 98c1bb76..5e1c27cb 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,52 +1,52 @@ name: Pull Request CI -on: pull_request +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] permissions: - contents: write - packages: write + contents: read + +concurrency: + group: pr-${{ github.event.pull_request.number }}-ci + cancel-in-progress: true + +env: + CI: true jobs: build-and-package: runs-on: ubuntu-latest + # Skip for draft PRs; remove this line if you want to run on drafts too + if: ${{ github.event.pull_request.draft == false }} + steps: - name: Checkout code uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - + - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: latest - - name: Install Dependencies - # Commands will run from 'packages/web' - working-directory: packages/web - run: pnpm install - - - name: Cache pnpm dependencies - uses: actions/cache@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - path: | - ~/.pnpm-store - packages/web/node_modules - key: ${{ runner.os }}-pnpm-${{ hashFiles('packages/web/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- + node-version: 22 + cache: pnpm + cache-dependency-path: '**/pnpm-lock.yaml' + + - name: Install dependencies (root) + run: pnpm install --frozen-lockfile - name: Run linter run: pnpm run lint - - name: Check formatter + - name: Check formatter run: pnpm run check - name: Run tests run: pnpm run test - - name: Build Package - working-directory: packages/web - run: pnpm run build + - name: Build web package + run: pnpm --filter "./packages/web" run build diff --git a/.github/workflows/release-packages.yml b/.github/workflows/release-packages.yml index 17f920ec..63e59f21 100644 --- a/.github/workflows/release-packages.yml +++ b/.github/workflows/release-packages.yml @@ -11,81 +11,103 @@ on: jobs: release: runs-on: ubuntu-latest + permissions: + contents: read + id-token: write # <-- required for JSR OIDC steps: - name: Checkout code uses: actions/checkout@v4 - # --- Setup Node.js and pnpm --- - - name: Setup Node.js + # Node + pnpm (with cache) + - name: Setup Node uses: actions/setup-node@v4 with: node-version: 22 + cache: pnpm + cache-dependency-path: '**/pnpm-lock.yaml' - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: latest - # --- Setup Deno --- - - name: Setup Deno - uses: denoland/setup-deno@v2 - with: - deno-version: v2.x - - # --- Cache pnpm Dependencies --- - - name: Cache pnpm Dependencies - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - packages/web/node_modules - key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- - - # --- Cache Deno Dependencies --- - - name: Cache Deno Dependencies - uses: actions/cache@v4 - with: - path: ~/.cache/deno - key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }} - restore-keys: | - ${{ runner.os }}-deno- - - - name: Configure pnpm registry - run: pnpm config set registry https://registry.npmjs.org/ + - name: Configure npm auth + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pnpm config set //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN} + pnpm config set registry https://registry.npmjs.org/ - - name: Configure pnpm auth - run: pnpm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} + - name: Install deps (root) + run: pnpm install - - name: Publish packages to npm and JSR + - name: Resolve package list + id: pkgs + shell: bash + run: | + if [ "${{ github.event.inputs.packages }}" = "all" ] || [ -z "${{ github.event.inputs.packages }}" ]; then + mapfile -t TARGETS < <(ls -d packages/* | grep -v 'packages/web') + else + IFS=',' read -ra TARGETS <<< "${{ github.event.inputs.packages }}" + TARGETS=("${TARGETS[@]/#/packages/}") + fi + printf '%s\n' "${TARGETS[@]}" | paste -sd, - > targets.txt + echo "list=$(cat targets.txt)" >> "$GITHUB_OUTPUT" + + - name: Build selected packages (tsdown) run: | - for dir in packages/*; do - if [ "$dir" != "packages/web" ]; then - echo "Processing $dir" + IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}" + for dir in "${TARGETS[@]}"; do + echo "Building $dir" + pnpm --filter "./$dir" run build + done - cd $dir + - name: Sync jsr.json version from package.json + run: | + IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}" + for dir in "${TARGETS[@]}"; do + if [ -f "$dir/jsr.json" ] && [ -f "$dir/package.json" ]; then + PKG_VER=$(jq -r .version "$dir/package.json") + jq --arg v "$PKG_VER" '.version = $v' "$dir/jsr.json" > "$dir/jsr.json.tmp" && mv "$dir/jsr.json.tmp" "$dir/jsr.json" + echo "Updated $dir/jsr.json to version $PKG_VER" + fi + done - # Build and publish to npm if package.json exists - if [ -f "package.json" ]; then - echo "Building and publishing $dir to npm..." - pnpm install - pnpm run build:npm - pnpm run publish:npm || echo "npm publish failed for $dir" + - name: Publish to JSR (OIDC) + run: | + set -euo pipefail + IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}" + for dir in "${TARGETS[@]}"; do + if [ -f "$dir/jsr.json" ]; then + echo "Publishing $dir to JSR via OIDC…" + cd "$dir" + [ -d dist ] || pnpm run build + if ! npx --yes jsr publish 2>&1 | tee jsr_publish.log; then + echo "JSR publish failed for $dir. Error output:" + cat jsr_publish.log fi + cd - >/dev/null + fi + done - pnpm run prepare:jsr - - # Publish to JSR if jsr.json exists - if [ -f "jsr.json" ]; then - echo "Publishing $dir to jsr..." - deno publish || echo "JSR publish failed for $dir" - fi + - name: Replace exports entry in package.json + run: | + tmp=$(mktemp) + jq '.exports["."] = "./dist/mod.mjs"' package.json > "$tmp" \ + && mv "$tmp" package.json - cd - > /dev/null - else - echo "Skipping $dir" + - name: Publish to npm + run: | + set -euo pipefail + IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}" + for dir in "${TARGETS[@]}"; do + if [ -f "$dir/package.json" ]; then + echo "Publishing $dir to npm…" + cd "$dir" + [ -d dist ] || pnpm run build + npm publish --access public || echo "npm publish failed for $dir" + cd - >/dev/null fi done - \ No newline at end of file + diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index c8d87ba6..e8f14687 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -10,7 +10,7 @@ on: required: false default: "" tag_name: - description: "Tag to use for artifacts/images (defaults to adhoc-)" + description: "Tag to use for artifacts/images (defaults to )" required: false default: "" attach_to_release: @@ -36,53 +36,56 @@ jobs: # For manual runs, allow building a chosen ref (branch/tag/SHA) ref: ${{ inputs.ref != '' && inputs.ref || github.ref }} - - name: Determine tag for this run + - name: Determine tag & latest flag id: meta + shell: bash run: | - # tag from release event, or user input, or fallback to adhoc- + # Determine TAG if [ "${{ github.event_name }}" = "release" ]; then TAG="${{ github.event.release.tag_name }}" + # Push "latest" only for full releases (not prereleases) + if [ "${{ github.event.release.prerelease }}" = "true" ]; then + PUSH_LATEST="false" + else + PUSH_LATEST="true" + fi elif [ -n "${{ inputs.tag_name }}" ]; then TAG="${{ inputs.tag_name }}" + PUSH_LATEST="false" else SHA="$(git rev-parse --short=12 HEAD)" TAG="adhoc-${SHA}" + PUSH_LATEST="false" fi + echo "tag=$TAG" >> "$GITHUB_OUTPUT" - echo "Resolved tag: $TAG" + echo "push_latest=$PUSH_LATEST" >> "$GITHUB_OUTPUT" + echo "Resolved tag: $TAG (push_latest=$PUSH_LATEST)" - # --- Setup Node.js and pnpm --- + # --- Setup Node.js and pnpm (with cache) --- - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 + cache: pnpm + cache-dependency-path: '**/pnpm-lock.yaml' - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: latest - # --- Cache pnpm Dependencies --- - - name: Cache pnpm Dependencies - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - packages/web/node_modules - key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- - - name: Install dependencies run: pnpm install --frozen-lockfile - name: Create Web App Release Archive - run: pnpm --filter "meshtastic-web" run package + working-directory: packages/web + run: pnpm run package - name: Upload Web App Archive (artifact) uses: actions/upload-artifact@v4 with: - name: web-build + name: web-build-${{ steps.meta.outputs.tag }} if-no-files-found: error path: packages/web/dist/build.tar @@ -90,6 +93,7 @@ jobs: if: ${{ github.event_name == 'release' || inputs.attach_to_release == true }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash run: | if [ "${{ github.event_name }}" = "release" ]; then TAG="${{ steps.meta.outputs.tag }}" @@ -105,6 +109,22 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 + - name: Compute image tags + id: tags + shell: bash + run: | + if [ "${{ steps.meta.outputs.push_latest }}" = "true" ]; then + echo "list=latest, ${{ steps.meta.outputs.tag }}" >> "$GITHUB_OUTPUT" + else + echo "list=${{ steps.meta.outputs.tag }}" >> "$GITHUB_OUTPUT" + fi + TAGS="latest, ${{ steps.meta.outputs.tag }}" + else + TAGS="${{ steps.meta.outputs.tag }}" + fi + echo "list=$TAGS" >> "$GITHUB_OUTPUT" + echo "Using image tags: $TAGS" + - name: Build Container Image id: build-container uses: redhat-actions/buildah-build@v2 @@ -112,7 +132,7 @@ jobs: containerfiles: | ./packages/web/infra/Containerfile image: ${{ env.REGISTRY_IMAGE }} - tags: latest, ${{ steps.meta.outputs.tag }} + tags: ${{ steps.tags.outputs.list }} oci: true platforms: linux/amd64, linux/arm64 diff --git a/.github/workflows/update-stable-from-master.yml b/.github/workflows/update-stable-from-master.yml index 7510939a..39bda8e6 100644 --- a/.github/workflows/update-stable-from-master.yml +++ b/.github/workflows/update-stable-from-master.yml @@ -7,44 +7,67 @@ on: permissions: contents: write +concurrency: + group: update-stable-${{ github.run_id }} + cancel-in-progress: true + jobs: update-stable-branch: - name: Update Stable Branch from Main + name: Update stable from latest release source runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # need full history for reset/push - - name: Configure Git + - name: Configure Git author run: | - git config user.name "GitHub Actions Bot" + git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - - name: Fetch latest main and stable branches + - name: Determine source ref & SHA + id: meta + shell: bash run: | - git fetch origin main:main - git fetch origin stable:stable || echo "Stable branch not found remotely, will create." + set -euo pipefail + SRC="${{ github.event.release.target_commitish }}" + if [ -z "$SRC" ] || ! git ls-remote --exit-code origin "refs/heads/$SRC" >/dev/null 2>&1; then + # Fallback to main if target_commitish is empty or not a branch + SRC="main" + fi - - name: Get latest main commit SHA - id: get_main_sha - run: echo "MAIN_SHA=$(git rev-parse main)" >> $GITHUB_ENV + echo "Using source branch: $SRC" + git fetch origin "$SRC":"refs/remotes/origin/$SRC" --prune + SHA="$(git rev-parse "origin/$SRC")" + echo "sha=$SHA" >> "$GITHUB_OUTPUT" + echo "src=$SRC" >> "$GITHUB_OUTPUT" - - name: Check out stable branch + - name: Prepare local stable branch + shell: bash run: | + set -euo pipefail + # Ensure we have the remote stable ref if it exists + git fetch origin stable:refs/remotes/origin/stable || true + if git show-ref --verify --quiet refs/heads/stable; then - git checkout stable - git pull origin stable # Sync with remote stable if it exists + echo "Local stable exists." + elif git show-ref --verify --quiet refs/remotes/origin/stable; then + echo "Creating local stable tracking branch from remote." + git checkout -b stable --track origin/stable else - echo "Creating local stable branch based on main HEAD." - git checkout -b stable ${{ env.MAIN_SHA }} + echo "Creating new local stable branch at source SHA." + git checkout -b stable "${{ steps.meta.outputs.sha }}" fi - - name: Reset stable branch to latest main - run: git reset --hard ${{ env.MAIN_SHA }} + - name: Reset stable to source SHA + run: | + git checkout stable + git reset --hard "${{ steps.meta.outputs.sha }}" + git status --short --branch - - name: Force push stable branch - run: git push origin stable --force + - name: Push stable (force-with-lease) + run: | + # Safer than --force; refuses if remote moved unexpectedly + git push origin stable --force-with-lease diff --git a/.gitignore b/.gitignore index 40163db1..97442988 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ __screenshots__* *.diff npm/ .idea +**/LICENSE diff --git a/package.json b/package.json index 492a2d07..ea88d006 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "meshtastic-web", + "name": "@meshtastic/web", "version": "2.7.0-0", "type": "module", "description": "Meshtastic web client monorepo", @@ -25,7 +25,7 @@ "check:fix": "biome check --write", "build:all": "pnpm run --filter '*' build", "clean:all": "pnpm run --filter '*' clean", - "publish:packages": "pnpm run --filter 'packages/transport-* packages/core' build", + "publish:packages": "pnpm run build --filter 'packages/transport-*'", "test": "vitest" }, "dependencies": { @@ -39,6 +39,14 @@ "biome": "^0.3.3", "tsdown": "^0.13.4", "typescript": "^5.8.3", - "vitest": "^3.2.4" + "vitest": "^3.2.4" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@tailwindcss/oxide", + "core-js", + "esbuild", + "simple-git-hooks" + ] } } diff --git a/packages/core/package.json b/packages/core/package.json index 77383ea9..dca94356 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,10 +1,11 @@ { "name": "@meshtastic/core", - "version": "2.6.6", + "version": "2.6.6-1", "description": "Core functionalities for Meshtastic web applications.", "exports": { ".": "./mod.ts" }, + "type": "module", "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", @@ -16,12 +17,18 @@ "splitting": false, "clean": true }, + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], "scripts": { "preinstall": "npx only-allow pnpm", "prepack": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist LICENSE", "build:npm": "tsdown", - "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public --no-git-checks", "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, diff --git a/packages/transport-deno/package.json b/packages/transport-deno/package.json index 531deb36..385a1d28 100644 --- a/packages/transport-deno/package.json +++ b/packages/transport-deno/package.json @@ -8,7 +8,6 @@ "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", - "files": ["dist/*", "mod.ts", "README.md", "../../LICENSE"], "license": "GPL-3.0-only", "tsdown": { "entry": "mod.ts", @@ -17,6 +16,12 @@ "splitting": false, "clean": true }, + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], "scripts": { "preinstall": "npx only-allow pnpm", "prepack": "cp ../../LICENSE ./LICENSE", diff --git a/packages/transport-http/package.json b/packages/transport-http/package.json index 64ba5a47..228956b1 100644 --- a/packages/transport-http/package.json +++ b/packages/transport-http/package.json @@ -1,8 +1,15 @@ { "name": "@meshtastic/transport-http", - "version": "0.2.3", + "version": "0.2.3-2", "description": "A transport layer for Meshtastic applications using HTTP.", "exports": {".": "./mod.ts"}, + "type": "module", + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", @@ -14,18 +21,13 @@ "splitting": false, "clean": true }, - "files": [ - "package.json", - "README.md", - "LICENSE", - "dist" - ], "scripts": { "preinstall": "npx only-allow pnpm", "prepack": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist LICENSE", "build:npm": "tsdown", - "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public --no-git-checks", "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, diff --git a/packages/transport-node/package.json b/packages/transport-node/package.json index c92e562b..a40c3a73 100644 --- a/packages/transport-node/package.json +++ b/packages/transport-node/package.json @@ -1,10 +1,11 @@ { "name": "@meshtastic/transport-node", - "version": "0.0.1", + "version": "0.0.1-1", "description": "NodeJS-specific transport layer for Meshtastic web applications.", "exports": { ".": "./mod.ts" }, + "type": "module", "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", @@ -28,7 +29,7 @@ "prepack": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist LICENSE", "build:npm": "tsdown", - "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public --no-git-checks", "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, diff --git a/packages/transport-web-bluetooth/package.json b/packages/transport-web-bluetooth/package.json index f1562983..020c81ff 100644 --- a/packages/transport-web-bluetooth/package.json +++ b/packages/transport-web-bluetooth/package.json @@ -1,14 +1,20 @@ { "name": "@meshtastic/transport-web-bluetooth", - "version": "0.1.4", + "version": "0.1.4-1", "description": "A transport layer for Meshtastic applications using Web Bluetooth.", "exports": { ".": "./mod.ts" }, + "type": "module", "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", - "files": ["dist/*", "mod.ts", "README.md", "../../LICENSE"], + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], "license": "GPL-3.0-only", "tsdown": { "entry": "mod.ts", @@ -22,7 +28,7 @@ "prepack": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist LICENSE", "build:npm": "tsdown", - "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public --no-git-checks", "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, diff --git a/packages/transport-web-serial/package.json b/packages/transport-web-serial/package.json index 90535ba6..f615b8d0 100644 --- a/packages/transport-web-serial/package.json +++ b/packages/transport-web-serial/package.json @@ -1,14 +1,20 @@ { "name": "@meshtastic/transport-web-serial", - "version": "0.2.3", + "version": "0.2.3-1", "description": "A transport layer for Meshtastic applications using Web Serial API.", "exports": { ".": "./mod.ts" }, + "type": "module", "main": "./dist/mod.mjs", "module": "./dist/mod.mjs", "types": "./dist/mod.d.mts", - "files": ["dist/*", "mod.ts", "README.md", "../../LICENSE"], + "files": [ + "package.json", + "README.md", + "LICENSE", + "dist" + ], "license": "GPL-3.0-only", "tsdown": { "entry": "mod.ts", @@ -22,7 +28,7 @@ "prepack": "cp ../../LICENSE ./LICENSE", "clean": "rm -rf dist LICENSE", "build:npm": "tsdown", - "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public", + "publish:npm": "pnpm clean && pnpm build:npm && pnpm publish --access public --no-git-checks", "prepare:jsr": "rm -rf dist && pnpm dlx pkg-to-jsr", "publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check" }, From 97b884f11952e4fe39777e506ea31964ed2adfa0 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Mon, 18 Aug 2025 09:19:34 -0400 Subject: [PATCH 8/8] add lock file (#792) --- pnpm-lock.yaml | 320 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 243 insertions(+), 77 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a86acb3..d464d05d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,8 +66,8 @@ importers: '@meshtastic/core': specifier: workspace:* version: link:../core - 'serialport': - specifier: npm:serialport@^13.0.0 + serialport: + specifier: ^13.0.0 version: 13.0.0 packages/transport-web-bluetooth: @@ -821,12 +821,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/runtime@0.81.0': - resolution: {integrity: sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==} + '@oxc-project/runtime@0.82.2': + resolution: {integrity: sha512-cYxcj5CPn/vo5QSpCZcYzBiLidU5+GlFSqIeNaMgBDtcVRBsBJHZg3pHw999W6nHamFQ1EHuPPByB26tjaJiJw==} engines: {node: '>=6.9.0'} - '@oxc-project/types@0.81.0': - resolution: {integrity: sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==} + '@oxc-project/types@0.82.2': + resolution: {integrity: sha512-WMGSwd9FsNBs/WfqIOH0h3k1LBdjZJQGYjGnC+vla/fh6HUsu5HzGPerRljiq1hgMQ6gs031YJR12VyP57b/hQ==} '@quansync/fs@0.1.4': resolution: {integrity: sha512-vy/41FCdnIalPTQCb2Wl0ic1caMdzGus4ktDp+gpZesQNydXcx8nhh8qB3qMPbGkictOTaXgXEUUfQEm8DQYoA==} @@ -1343,81 +1343,81 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/binding-android-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==} + '@rolldown/binding-android-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-xhDQXKftRkEULIxCddrKMR8y0YO/Y+6BKk/XrQP2B29YjV2wr8DByoEz+AHX9BfLHb2srfpdN46UquBW2QXWpQ==} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-7lhhY08v5ZtRq8JJQaJ49fnJombAPnqllKKCDLU/UvaqNAOEyTGC8J1WVOLC4EA4zbXO5U3CCRgVGyAFNH2VtQ==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.32': - resolution: {integrity: sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==} + '@rolldown/binding-darwin-x64@1.0.0-beta.33': + resolution: {integrity: sha512-U2iGjcDV7NWyYyhap8YuY0nwrLX6TvX/9i7gBtdEMPm9z3wIUVGNMVdGlA43uqg7xDpRGpEqGnxbeDgiEwYdnA==} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.32': - resolution: {integrity: sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.33': + resolution: {integrity: sha512-gd6ASromVHFLlzrjJWMG5CXHkS7/36DEZ8HhvGt2NN8eZALCIuyEx8HMMLqvKA7z4EAztVkdToVrdxpGMsKZxw==} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': - resolution: {integrity: sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.33': + resolution: {integrity: sha512-xmeLfkfGthuynO1EpCdyTVr0r4G+wqvnKCuyR6rXOet+hLrq5HNAC2XtP/jU2TB4Bc6aiLYxl868B8CGtFDhcw==} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': - resolution: {integrity: sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.33': + resolution: {integrity: sha512-cHGp8yfHL4pes6uaLbO5L58ceFkUK4efd8iE86jClD1QPPDLKiqEXJCFYeuK3OfODuF5EBOmf0SlcUZNEYGdmw==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': - resolution: {integrity: sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.33': + resolution: {integrity: sha512-wZ1t7JAvVeFgskH1L9y7c47ITitPytpL0s8FmAT8pVfXcaTmS58ZyoXT+y6cz8uCkQnETjrX3YezTGI18u3ecg==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': - resolution: {integrity: sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.33': + resolution: {integrity: sha512-cDndWo3VEYbm7yeujOV6Ie2XHz0K8YX/R/vbNmMo03m1QwtBKKvbYNSyJb3B9+8igltDjd8zNM9mpiNNrq/ekQ==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': - resolution: {integrity: sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.33': + resolution: {integrity: sha512-bl7uzi6es/l6LT++NZcBpiX43ldLyKXCPwEZGY1rZJ99HQ7m1g3KxWwYCcGxtKjlb2ExVvDZicF6k+96vxOJKg==} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': - resolution: {integrity: sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-TrgzQanpLgcmmzolCbYA9BPZgF1gYxkIGZhU/HROnJPsq67gcyaYw/JBLioqQLjIwMipETkn25YY799D2OZzJA==} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': - resolution: {integrity: sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.33': + resolution: {integrity: sha512-z0LltdUfvoKak9SuaLz/M9AVSg+RTOZjFksbZXzC6Svl1odyW4ai21VHhZy3m2Faeeb/rl/9efVLayj+qYEGxw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-CpvOHyqDNOYx9riD4giyXQDIu72bWRU2Dwt1xFSPlBudk6NumK0OJl6Ch+LPnkp5podQHcQg0mMauAXPVKct7g==} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-/tNTvZTWHz6HiVuwpR3zR0kGIyCNb+/tFhnJmti+Aw2fAXs3l7Aj0DcXd0646eFKMX8L2w5hOW9H08FXTUkN0g==} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': - resolution: {integrity: sha512-Ej0i4PZk8ltblZtzVK8ouaGUacUtxRmTm5S9794mdyU/tYxXjAJNseOfxrnHpMWKjMDrOKbqkPqJ52T9NR4LQQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-Bb2qK3z7g2mf4zaKRvkohHzweaP1lLbaoBmXZFkY6jJWMm0Z8Pfnh8cOoRlH1IVM1Ufbo8ZZ1WXp1LbOpRMtXw==} cpu: [x64] os: [win32] '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.32': - resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + '@rolldown/pluginutils@1.0.0-beta.33': + resolution: {integrity: sha512-she25NCG6NoEPC/SEB4pHs5STcnfI4VBFOzjeI63maSPrWME5J2XC8ogrBgp8NaE/xzj28/kbpSaebiMvFRj+w==} '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -1523,6 +1523,70 @@ packages: cpu: [x64] os: [win32] + '@serialport/binding-mock@10.2.2': + resolution: {integrity: sha512-HAFzGhk9OuFMpuor7aT5G1ChPgn5qSsklTFOTUX72Rl6p0xwcSVsRtG/xaGp6bxpN7fI9D/S8THLBWbBgS6ldw==} + engines: {node: '>=12.0.0'} + + '@serialport/bindings-cpp@13.0.0': + resolution: {integrity: sha512-r25o4Bk/vaO1LyUfY/ulR6hCg/aWiN6Wo2ljVlb4Pj5bqWGcSRC4Vse4a9AcapuAu/FeBzHCbKMvRQeCuKjzIQ==} + engines: {node: '>=18.0.0'} + + '@serialport/bindings-interface@1.2.2': + resolution: {integrity: sha512-CJaUd5bLvtM9c5dmO9rPBHPXTa9R2UwpkJ0wdh9JCYcbrPWsKz+ErvR0hBLeo7NPeiFdjFO4sonRljiw4d2XiA==} + engines: {node: ^12.22 || ^14.13 || >=16} + + '@serialport/parser-byte-length@13.0.0': + resolution: {integrity: sha512-32yvqeTAqJzAEtX5zCrN1Mej56GJ5h/cVFsCDPbF9S1ZSC9FWjOqNAgtByseHfFTSTs/4ZBQZZcZBpolt8sUng==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-cctalk@13.0.0': + resolution: {integrity: sha512-RErAe57g9gvnlieVYGIn1xymb1bzNXb2QtUQd14FpmbQQYlcrmuRnJwKa1BgTCujoCkhtaTtgHlbBWOxm8U2uA==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-delimiter@12.0.0': + resolution: {integrity: sha512-gu26tVt5lQoybhorLTPsH2j2LnX3AOP2x/34+DUSTNaUTzu2fBXw+isVjQJpUBFWu6aeQRZw5bJol5X9Gxjblw==} + engines: {node: '>=12.0.0'} + + '@serialport/parser-delimiter@13.0.0': + resolution: {integrity: sha512-Qqyb0FX1avs3XabQqNaZSivyVbl/yl0jywImp7ePvfZKLwx7jBZjvL+Hawt9wIG6tfq6zbFM24vzCCK7REMUig==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-inter-byte-timeout@13.0.0': + resolution: {integrity: sha512-a0w0WecTW7bD2YHWrpTz1uyiWA2fDNym0kjmPeNSwZ2XCP+JbirZt31l43m2ey6qXItTYVuQBthm75sPVeHnGA==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-packet-length@13.0.0': + resolution: {integrity: sha512-60ZDDIqYRi0Xs2SPZUo4Jr5LLIjtb+rvzPKMJCohrO6tAqSDponcNpcB1O4W21mKTxYjqInSz+eMrtk0LLfZIg==} + engines: {node: '>=8.6.0'} + + '@serialport/parser-readline@12.0.0': + resolution: {integrity: sha512-O7cywCWC8PiOMvo/gglEBfAkLjp/SENEML46BXDykfKP5mTPM46XMaX1L0waWU6DXJpBgjaL7+yX6VriVPbN4w==} + engines: {node: '>=12.0.0'} + + '@serialport/parser-readline@13.0.0': + resolution: {integrity: sha512-dov3zYoyf0dt1Sudd1q42VVYQ4WlliF0MYvAMA3MOyiU1IeG4hl0J6buBA2w4gl3DOCC05tGgLDN/3yIL81gsA==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-ready@13.0.0': + resolution: {integrity: sha512-JNUQA+y2Rfs4bU+cGYNqOPnNMAcayhhW+XJZihSLQXOHcZsFnOa2F9YtMg9VXRWIcnHldHYtisp62Etjlw24bw==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-regex@13.0.0': + resolution: {integrity: sha512-m7HpIf56G5XcuDdA3DB34Z0pJiwxNRakThEHjSa4mG05OnWYv0IG8l2oUyYfuGMowQWaVnQ+8r+brlPxGVH+eA==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-slip-encoder@13.0.0': + resolution: {integrity: sha512-fUHZEExm6izJ7rg0A1yjXwu4sOzeBkPAjDZPfb+XQoqgtKAk+s+HfICiYn7N2QU9gyaeCO8VKgWwi+b/DowYOg==} + engines: {node: '>=20.0.0'} + + '@serialport/parser-spacepacket@13.0.0': + resolution: {integrity: sha512-DoXJ3mFYmyD8X/8931agJvrBPxqTaYDsPoly9/cwQSeh/q4EjQND9ySXBxpWz5WcpyCU4jOuusqCSAPsbB30Eg==} + engines: {node: '>=20.0.0'} + + '@serialport/stream@13.0.0': + resolution: {integrity: sha512-F7xLJKsjGo2WuEWMSEO1SimRcOA+WtWICsY13r0ahx8s2SecPQH06338g28OT7cW7uRXI7oEQAk62qh5gHJW3g==} + engines: {node: '>=20.0.0'} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -2555,6 +2619,15 @@ packages: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -3228,6 +3301,10 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@8.3.0: + resolution: {integrity: sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg==} + engines: {node: ^18 || ^20 || >= 21} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3237,6 +3314,10 @@ packages: encoding: optional: true + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-html-parser@5.4.2: resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} @@ -3572,8 +3653,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.32: - resolution: {integrity: sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==} + rolldown@1.0.0-beta.33: + resolution: {integrity: sha512-mgu118ZuRguC8unhPCbdZbyRbjQfEMiWqlojBA5aRIncBelRaBomnHNpGKYkYWeK7twRz5Cql30xgqqrA3Xelw==} hasBin: true rollup@4.46.2: @@ -3618,6 +3699,10 @@ packages: engines: {node: '>=10'} hasBin: true + serialport@13.0.0: + resolution: {integrity: sha512-PHpnTd8isMGPfFTZNCzOZp9m4mAJSNWle9Jxu6BPTcWq7YXl5qN7tp8Sgn0h+WIGcD6JFz5QDgixC2s4VW7vzg==} + engines: {node: '>=20.0.0'} + seroval-plugins@1.3.2: resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} engines: {node: '>=10'} @@ -4613,9 +4698,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oxc-project/runtime@0.81.0': {} + '@oxc-project/runtime@0.82.2': {} - '@oxc-project/types@0.81.0': {} + '@oxc-project/types@0.82.2': {} '@quansync/fs@0.1.4': dependencies: @@ -5170,53 +5255,53 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@rolldown/binding-android-arm64@1.0.0-beta.32': + '@rolldown/binding-android-arm64@1.0.0-beta.33': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.32': + '@rolldown/binding-darwin-arm64@1.0.0-beta.33': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.32': + '@rolldown/binding-darwin-x64@1.0.0-beta.33': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.32': + '@rolldown/binding-freebsd-x64@1.0.0-beta.33': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.33': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.33': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.33': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.33': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.33': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.33': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.33': dependencies: '@napi-rs/wasm-runtime': 1.0.3 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.33': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.33': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.33': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.32': {} + '@rolldown/pluginutils@1.0.0-beta.33': {} '@rollup/pluginutils@4.2.1': dependencies: @@ -5283,6 +5368,60 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@serialport/binding-mock@10.2.2': + dependencies: + '@serialport/bindings-interface': 1.2.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@serialport/bindings-cpp@13.0.0': + dependencies: + '@serialport/bindings-interface': 1.2.2 + '@serialport/parser-readline': 12.0.0 + debug: 4.4.0 + node-addon-api: 8.3.0 + node-gyp-build: 4.8.4 + transitivePeerDependencies: + - supports-color + + '@serialport/bindings-interface@1.2.2': {} + + '@serialport/parser-byte-length@13.0.0': {} + + '@serialport/parser-cctalk@13.0.0': {} + + '@serialport/parser-delimiter@12.0.0': {} + + '@serialport/parser-delimiter@13.0.0': {} + + '@serialport/parser-inter-byte-timeout@13.0.0': {} + + '@serialport/parser-packet-length@13.0.0': {} + + '@serialport/parser-readline@12.0.0': + dependencies: + '@serialport/parser-delimiter': 12.0.0 + + '@serialport/parser-readline@13.0.0': + dependencies: + '@serialport/parser-delimiter': 13.0.0 + + '@serialport/parser-ready@13.0.0': {} + + '@serialport/parser-regex@13.0.0': {} + + '@serialport/parser-slip-encoder@13.0.0': {} + + '@serialport/parser-spacepacket@13.0.0': {} + + '@serialport/stream@13.0.0': + dependencies: + '@serialport/bindings-interface': 1.2.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + '@standard-schema/utils@0.3.0': {} '@tailwindcss/node@4.1.11': @@ -7117,6 +7256,10 @@ snapshots: dependencies: assert-plus: 1.0.0 + debug@4.4.0: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -7758,10 +7901,14 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-addon-api@8.3.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-gyp-build@4.8.4: {} + node-html-parser@5.4.2: dependencies: css-select: 4.3.0 @@ -8065,7 +8212,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2): + rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.33)(typescript@5.9.2): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 @@ -8075,34 +8222,34 @@ snapshots: debug: 4.4.1 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.32 + rolldown: 1.0.0-beta.33 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.32: + rolldown@1.0.0-beta.33: dependencies: - '@oxc-project/runtime': 0.81.0 - '@oxc-project/types': 0.81.0 - '@rolldown/pluginutils': 1.0.0-beta.32 + '@oxc-project/runtime': 0.82.2 + '@oxc-project/types': 0.82.2 + '@rolldown/pluginutils': 1.0.0-beta.33 ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.32 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.32 - '@rolldown/binding-darwin-x64': 1.0.0-beta.32 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.32 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.32 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.32 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.32 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.32 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.32 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.32 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.32 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.32 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.32 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.32 + '@rolldown/binding-android-arm64': 1.0.0-beta.33 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.33 + '@rolldown/binding-darwin-x64': 1.0.0-beta.33 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.33 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.33 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.33 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.33 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.33 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.33 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.33 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.33 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.33 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.33 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.33 rollup@4.46.2: dependencies: @@ -8158,6 +8305,25 @@ snapshots: semver@7.7.2: {} + serialport@13.0.0: + dependencies: + '@serialport/binding-mock': 10.2.2 + '@serialport/bindings-cpp': 13.0.0 + '@serialport/parser-byte-length': 13.0.0 + '@serialport/parser-cctalk': 13.0.0 + '@serialport/parser-delimiter': 13.0.0 + '@serialport/parser-inter-byte-timeout': 13.0.0 + '@serialport/parser-packet-length': 13.0.0 + '@serialport/parser-readline': 13.0.0 + '@serialport/parser-ready': 13.0.0 + '@serialport/parser-regex': 13.0.0 + '@serialport/parser-slip-encoder': 13.0.0 + '@serialport/parser-spacepacket': 13.0.0 + '@serialport/stream': 13.0.0 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + seroval-plugins@1.3.2(seroval@1.3.2): dependencies: seroval: 1.3.2 @@ -8396,8 +8562,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.32 - rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2) + rolldown: 1.0.0-beta.33 + rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.33)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14