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 2698b272..4ab1b71c 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": { @@ -41,5 +41,13 @@ "typescript": "^5.8.3", "vitest": "^3.2.4", "@meshtastic/core": "workspace:*" + }, + "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" }, 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). 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/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." } }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a334008..b29f91f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -824,12 +824,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==} @@ -1346,81 +1346,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==} @@ -3656,8 +3656,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: @@ -4701,9 +4701,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: @@ -5258,53 +5258,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: @@ -8215,7 +8215,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 @@ -8225,34 +8225,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: @@ -8565,8 +8565,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