From a4c817cd304711d3aa58ead27e5e0547b2557493 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 17 Aug 2025 14:32:10 -0400 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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