Skip to content

chore(deps): upgrade vite to 8, mlt-core to 0.9, cql2 to 0.5.6 - #916

Merged
vinayakkulkarni merged 9 commits into
mainfrom
chore/vite-8-deps-may-2026
May 13, 2026
Merged

vinayakkulkarni merged 9 commits into
mainfrom
chore/vite-8-deps-may-2026

Conversation

@vinayakkulkarni

Copy link
Copy Markdown
Owner

Summary

Workspace-wide dependency sweep that supersedes #907 (Vite 7 → 8 alone was insufficient — full set of co-required changes below).

What landed

1. pnpm 11.0.0-rc.5 → 11.1.1 stable

Bumps the workflow pnpm/action-setup version field across all 7 workflows and the root package.json#packageManager field. First non-RC release of the v11 line.

2. Dependabot grouping: opentelemetry-* + arrow-*

Solo Dependabot bumps of a single crate inside a diamond dependency chain silently broke the MetricReader trait impl on PRs #885 / #888 / #893 / #895 / #907. Grouping forces atomic family-wide PRs we can land or revert as a unit.

3. Rust deps alignment

4. Vite 7 → 8 across the workspace

  • Top-level overrides: { vite: ^8.0.12 } in pnpm-workspace.yaml (Nuxt's peer dep otherwise still resolved Vite 7 in the lockfile). pnpm v9+ workspace mode silently ignores package.json#pnpm.overrides, so the override must live in pnpm-workspace.yaml.

5. nuxt-workers 0.1.0 build fix

The WorkerTransformPlugin in nuxt-workers/dist/module.mjs unconditionally appends a const __worker_exports__ = { ... } block to every worker source. With Vite 8 (Rolldown-backed bundler) the worker import pipeline calls the transform twice, producing a duplicate identifier:

[PARSE_ERROR] Identifier `__worker_exports__` has already been declared
  at app/workers/parse-csv.ts:79:7
  at app/workers/parse-csv.ts:91:7

pnpm dev is unaffected (single transform pass); only pnpm build triggers. Upstream issue danielroe/nuxt-workers#191 (open since Nov 2025, package effectively unmaintained — last release Feb 2025). Worked around with pnpm patch:

  • 3-line idempotency guard at dist/module.mjs:18 that bails out of the second transform when the shim is already present.
  • Patch lives at patches/nuxt-workers@0.1.0.patch and is wired in via pnpm-workspace.yaml#patchedDependencies.

6. Nuxt 4 + Vite 8 SPA-mode workaround

apps/client/nuxt.config.ts: added experimental: { viteEnvironmentApi: true }. Without it, pnpm dev crashes with ERROR No entry found in rollupOptions.input because Nuxt 4.4.5 drops rollupOptions.input.entry during config merge in SPA (ssr: false) mode. Upstream issue nuxt/nuxt#35033, fix nuxt/nuxt#35037 merged against 4.x but not yet released. Remove the flag once Nuxt > 4.4.5 ships.

7. Catalog churn

@types/node 25.6 → 25.7 and consolidated stray catalog entries left by an earlier bunx taze run.

Verification

  • cargo clippy --all-targets --all-features -- -D warnings — exit 0 (with the gdal patch active on macOS Homebrew libgdal 3.13)
  • cargo fmt --all --check — exit 0
  • pnpm dev in apps/client/ → HTTP 200 from localhost:3000
  • pnpm build in apps/client/ → dist/ written (12MB, index.html + _nuxt/ + fonts/)

Closes / supersedes

Closes #907 (Vite 8 alone was insufficient; full co-required changes shipped here).

🤖 Generated with Claude Code

Co-Authored-By: Claude noreply@anthropic.com

Previously pinned to 11.0.0-rc.5 while the v11 release train was in candidate.
pnpm 11.1.1 (stable, released early May 2026) is the first non-RC release in
the v11 line. Bumps both the workflow setup-pnpm version field and the root
package.json packageManager field for parity with corepack.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
Solo dependabot bumps of crates in a diamond dependency chain silently break
trait-impl matching at the SDK boundary. The opentelemetry-prometheus crate
implements MetricReader against opentelemetry_sdk 0.X while the meter
provider expects 0.Y, causing 'trait bound not satisfied' clippy failures.

Hit on PRs #885 #888 #893 #895 in May 2026 when dependabot bumped the
opentelemetry family members one at a time. Each PR required a manual revert.
arrow-* + parquet have the same diamond shape (parquet pins arrow-*
transitively). Grouping forces a single atomic PR per family.

Refs: dependabot/dependabot-core#14794
Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
OpenTelemetry family: revert opentelemetry, opentelemetry_sdk, opentelemetry-otlp
and opentelemetry-semantic-conventions from 0.32 back to 0.31. The 0.32 train
exists upstream but tracing-opentelemetry 0.32.1 (latest, Jan 12 2026) still
hardcodes opentelemetry ^0.31.0 for all five OTel deps it pulls in, creating a
diamond conflict that breaks the Prometheus reader trait bound.

Unblock: tokio-rs/tracing-opentelemetry PR #258 (chore: Upgrade to OpenTelemetry
0.32). Currently open. When that merges and ships, bump back to 0.32 in a
single atomic group (see .github/dependabot.yml).

cql2 0.5.5 -> 0.5.6 and geo 0.32 -> 0.33: cql2 0.5.6 bumped its geo dep to
0.33, which unblocks the i_overlay diamond previously blocking us. mlt-core
0.9.x and the workspace converge on geo 0.33.

mlt-core 0.7.0 -> 0.9.1: breaking API renames. TileLayer01 -> TileLayer (the
'01' versioning suffix was dropped on the encoder type) and geojson::Geom32
type alias removed in favour of the raw geo_types::Geometry<i32>. Both
renames applied in transcode.rs; the layer field shape and the
TileLayer::encode signature are otherwise identical.

gdal + gdal-sys: pinned via [patch.crates-io] to AlexanderWillner/gdal#714 at
rev 968cf34a so cargo clippy --all-features compiles on a Homebrew macOS box
running libgdal 3.13 (GDT_Byte -> GDT_UInt8 + new bOperateInBufType field).
Drop the patch block when a gdal release >0.19.0 lands containing PR #714.
Tracking: georust/gdal#715.

Verified: cargo clippy --all-targets --all-features -- -D warnings (exit 0)
and cargo fmt --all --check (exit 0) on macOS 14 + libgdal 3.13.0 (Homebrew).

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
Vite 7 -> 8 across the workspace. Adds a top-level `overrides: { vite: ^8.0.12 }`
to pnpm-workspace.yaml because Nuxt's peer dep otherwise still resolves Vite 7
in the lockfile. pnpm v9+ workspace mode silently ignores
`package.json#pnpm.overrides`, so the override must live in pnpm-workspace.yaml.

nuxt-workers 0.1.0 patch: the WorkerTransformPlugin in
node_modules/nuxt-workers/dist/module.mjs unconditionally appends a
`const __worker_exports__ = { ... }` block to every worker source via
MagicString.append(). With Vite 8 (Rolldown-backed bundler), the worker import
pipeline calls the transform twice per source, producing a duplicate identifier
and crashing the build:

  [PARSE_ERROR] Identifier `__worker_exports__` has already been declared
    at app/workers/parse-csv.ts:79:7
    at app/workers/parse-csv.ts:91:7

`pnpm dev` is unaffected (single transform pass). Upstream issue:
danielroe/nuxt-workers#191 (open since Nov 2025, package last released Feb 2025,
effectively unmaintained). pnpm patch adds a three-line idempotency guard at
dist/module.mjs:18 that bails out of the second transform when the shim is
already present. Patch lives at patches/nuxt-workers@0.1.0.patch and is wired
in via pnpm-workspace.yaml#patchedDependencies. After clean install the
.pnpm/ folder picks up a `_patch_hash=...` suffix confirming the override.

apps/client/nuxt.config.ts: add `experimental: { viteEnvironmentApi: true }`
to work around Nuxt 4.4.5 + Vite 8 + ssr:false (SPA mode) dropping the
`rollupOptions.input.entry` key during config merge. Upstream issue
nuxt/nuxt#35033, fix PR nuxt/nuxt#35037 merged against 4.x but not yet
released. Drop the flag when Nuxt > 4.4.5 ships.

Catalog bumps: @types/node 25.6 -> 25.7 (and consolidated stray catalog block
churn left by an earlier `bunx taze` run).

Verified: pnpm dev -> HTTP 200 from localhost:3000, pnpm build -> dist/
written with index.html + _nuxt assets + fonts (12MB total).

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
The previous commit (516a04d) referenced `patches/nuxt-workers@0.1.0.patch` in
pnpm-workspace.yaml#patchedDependencies but the actual patch file was never
staged. The local `patches/` directory was empty when `git add patches/` ran
(probably because an intermediate `rm -rf node_modules` interfered before pnpm
recreated the file). CI failed at the `pnpm install` step with:

  ENOENT: no such file or directory, open '.../patches/nuxt-workers@0.1.0.patch'

Regenerated by diffing the pristine nuxt-workers 0.1.0 module.mjs (from the
npm registry tarball) against the already-patched copy in node_modules. The
3-line idempotency guard at dist/module.mjs:18 is preserved verbatim. Fresh
install from a clean node_modules produces the same _patch_hash=7cde39d... so
the patch contents match what pnpm-workspace.yaml expects.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
@codecov

codecov Bot commented May 13, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.00%. Comparing base (c1878d3) to head (f697552).
⚠️ Report is 26 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main     #916   +/-   ##
=======================================
  Coverage   66.00%   66.00%           
=======================================
  Files          57       57           
  Lines       16822    16822           
  Branches    16822    16822           
=======================================
  Hits        11104    11104           
  Misses       5534     5534           
  Partials      184      184           
Flag Coverage Δ
unittests 66.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
crates/tileserver-rs/src/telemetry.rs 0.00% <ø> (ø)
crates/tileserver-rs/src/transcode.rs 93.97% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Vite 8.0.12 + Rolldown processes apps/client through vite:asset-import-meta-url
which runs strip-literal on every source file. The @mlc-ai/web-llm bundle is a
single 6.2 MB index.js with deeply nested template literals; the tokenizer that
strip-literal uses chews through V8's old-space heap and surfaces as

  RangeError: Maximum call stack size exceeded
    at module.exports (vite/.../node.js:18182)
    at stripLiteral

despite the symptom mentioning 'call stack'. Raising the heap ceiling to 16 GB
via NODE_OPTIONS=--max-old-space-size=16384 lets the tokenizer complete.

NODE_OPTIONS is the canonical Node.js env knob for memory tuning per
https://nodejs.org/learn/diagnostics/memory/understanding-and-tuning-memory
and it propagates cleanly through pnpm exec into the nuxt CLI. --stack-size
would be the equivalent stack flag but Node blocks it from NODE_OPTIONS so we
cannot use that path. Drop this once vite ships a strip-literal fix that does
not allocate proportionally to file size (tracking vitejs/vite#21696 followups).

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
… to @tailwindcss/vite

Two coordinated changes that need to land together:

CATALOG CONSOLIDATION
Every dep in every workspace package.json now references a catalog. Before
this commit, four package.json files carried hardcoded versions that drifted
from the workspace single source of truth:

  - root: @commitlint/cli, @commitlint/config-conventional, husky, is-ci,
    lint-staged
  - apps/docs: @nuxt/content, better-sqlite3
  - benchmarks: autocannon, chalk, cli-table3, commander

Added matching entries to pnpm-workspace.yaml under catalogs.default for the
shared dev-tooling, plus two new named catalogs:
  - catalogs.docs   : @nuxt/content, better-sqlite3 (docs-only deps)
  - catalogs.benchmarks : autocannon, chalk, cli-table3, commander
    (benchmarks-only deps)

@TAILWINDCSS/POSTCSS -> @TAILWINDCSS/VITE
The Tailwind v4 postcss plugin produced ENOENT 'tailwindcss' on every SSR
build through Vite 8 because postcss-import was resolving the bare
@import 'tailwindcss'; before @tailwindcss/postcss could intercept it.
Both apps/docs and apps/marketing failed in their server bundle phase as a
result. The canonical Tailwind v4 + Vite integration is the
@tailwindcss/vite plugin which hooks into Vite directly and never round-
trips through postcss-import.

Swapped @tailwindcss/postcss with @tailwindcss/vite across client, docs and
marketing. Removed the now-orphaned 'postcss: { plugins: ... }' block from
each nuxt.config.ts and registered the plugin via vite.plugins[].

Verified locally: pnpm install + pnpm build all three apps -> exit 0,
dist/ artefacts written (Cloudflare Pages output for docs and marketing,
static .output for client).

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
The nuxt-workers 0.1.0 package was effectively unmaintained (last release
Feb 2025) and shipped a buggy transform plugin that double-injected
'const __worker_exports__' under Vite 8's Rolldown bundler, crashing
pnpm build. We were carrying a 3-line pnpm patch to silence it
(patches/nuxt-workers@0.1.0.patch + patchedDependencies entry in
pnpm-workspace.yaml) — fragile, blocks lockfile churn, locks us to a
dead dep.

Migrated to Vite's native Web Worker support — the recommended pattern
per https://vite.dev/guide/features.html#web-workers:

  const worker = new Worker(
    new URL('~/workers/parse-geojson.ts', import.meta.url),
    { type: 'module' },
  );
  return runWorker(worker, file.name, text);

Added apps/client/app/lib/run-worker.ts — a tiny ~50-line helper with
two exports:
  - runWorker(worker, ...args)        : main-thread promise wrapper
  - registerWorkerHandler(handler)    : worker-thread message listener

Each handler returns either { ok: true, result } or
{ ok: false, error }; the main side resolves or rejects the promise and
terminates the worker on first message. Errors propagate as real
Error objects.

Each parser worker (parse-geojson.ts, parse-csv.ts, parse-shapefile.ts)
calls registerWorkerHandler(parseFn) at the bottom; the typed result
interface is exported (ParseGeoJSONResult, ParseCSVResult,
ParseShapefileResult) so file-parsers.ts gets full type safety on the
main side via the Worker generics.

Removed:
  - 'nuxt-workers' from apps/client/nuxt.config.ts modules array
  - 'nuxt-workers' from apps/client/package.json deps
  - nuxt-workers entry from pnpm-workspace.yaml catalogs.client
  - patches/nuxt-workers@0.1.0.patch
  - patchedDependencies block from pnpm-workspace.yaml

Verified: pnpm dev (HTTP 200 from :3000) + pnpm build (12 MB dist with
discrete worker chunks under _nuxt/) — both exit 0.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
Per CLAUDE.md Rule #1, every type definition must live in app/types/ — never
inline in composables, workers, library files, or components. Previous commit
042156a co-located WorkerSuccess / WorkerFailure / WorkerResponse inside
app/lib/run-worker.ts and ParseGeoJSONResult / ParseCSVResult /
ParseShapefileResult inside each app/workers/parse-*.ts file, which violates
the rule.

Moves:
  - WorkerSuccess, WorkerFailure, WorkerResponse  -> app/types/worker.ts (new)
  - ParseGeoJSONResult, ParseCSVResult, ParseShapefileResult -> appended to
    app/types/file-upload.ts (alongside the related ParsedFile,
    SupportedFormat, GeometryType)

Re-exported all six new types from app/types/index.ts barrel. Updated
run-worker.ts, all three parse-*.ts workers, and file-parsers.ts to import
the types instead of declaring them inline.

Verified: pnpm run build (client) -> exit 0, pnpm run lint -> 0 warnings,
0 errors.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
@vinayakkulkarni
vinayakkulkarni merged commit 74a4b68 into main May 13, 2026
7 checks passed
@vinayakkulkarni
vinayakkulkarni deleted the chore/vite-8-deps-may-2026 branch May 13, 2026 20:03
This was referenced May 13, 2026
vinayakkulkarni added a commit that referenced this pull request May 15, 2026
…l opentelemetry-prometheus (#925)

* fix(deps): complete otel 0.32 family — swap text-exporter for official opentelemetry-prometheus

PR #917 (dependabot OTel group bump 0.31->0.32) merged on top of PR #916's
revert and turned the workspace's CI Rust Clippy gate red on every push since.
The remaining diamond was opentelemetry-prometheus-text-exporter = '=0.2.1', a
community fork last released 2025-09-29 that still pins opentelemetry_sdk
^0.31, plus tracing-opentelemetry 0.32.1 which still pins opentelemetry
^0.31 even on the latest crates.io release.

Two things unblock the 0.32 family TODAY:
- The official opentelemetry-prometheus crate was un-deprecated by
  open-telemetry/opentelemetry-rust and re-released as 0.32.0 on 2026-05-08.
- tokio-rs/tracing-opentelemetry#258 ('chore: Upgrade to OpenTelemetry 0.32')
  merged on 2026-05-15 at commit 44521fa onto the v0.1.x branch. A new
  crates.io release has not shipped yet, so this commit pulls the merged code
  through [patch.crates-io].

Cargo.toml changes:
- Drop opentelemetry-prometheus-text-exporter = '=0.2.1'.
- Add opentelemetry-prometheus = '0.32.0' (official, OTel 0.32 family).
- Add prometheus = '0.14.0' (the Registry + TextEncoder paired with the
  exporter; the exporter writes INTO the registry and we hold the registry).
- Add [patch.crates-io] tracing-opentelemetry = { git = ..., rev = '44521fa' }.
  Drop this patch entry the moment tracing-opentelemetry > 0.32.1 publishes
  on crates.io with opentelemetry ^0.32 deps. Verify via
  https://crates.io/api/v1/crates/tracing-opentelemetry/<v>/dependencies.
- Replace the stale revert-era comment block with one current paragraph that
  cites the merged PR and the patch's removal condition.

Source migration:
- src/telemetry.rs: TelemetryOutput.prometheus_exporter:
  Option<PrometheusExporter> -> prometheus_registry: Option<Registry>.
  Init via Registry::new() + opentelemetry_prometheus::exporter()
  .with_registry(reg.clone()).build()? + provider.with_reader(exporter).
- src/metrics/server.rs: ServerState carries Arc<Registry>, not
  Arc<PrometheusExporter>. Scrape uses
  TextEncoder::new().encode(&registry.gather(), &mut buf) instead of
  exporter.export(&mut buf).
- src/metrics/mod.rs: re-export prometheus::Registry, drop PrometheusExporter.
- src/main.rs: pass telemetry_output.prometheus_registry (not
  .prometheus_exporter) into spawn_metrics_server.
- tests/metrics_endpoint.rs: install_harness() builds a Registry, attaches
  the exporter as a reader on a fresh SdkMeterProvider, and hands the
  Registry to spawn_metrics_server. TestHarness keeps the Registry alive
  instead of the exporter handle.

Verified locally with the full Rule 604 gate:
- cargo fmt --all -- --check                                 -> 0
- cargo clippy --all-targets --all-features -- -D warnings   -> 0
- cargo test --all --all-features                            -> 33 passed,
  0 failed.

The .github/dependabot.yml 'opentelemetry' group already covers the new
opentelemetry-prometheus crate via the 'opentelemetry-*' pattern, so future
group bumps will keep these in sync.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>

* chore: ignore .opencode/ session artefact dir

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>

* ci: free 30GB on ubuntu-latest before building libduckdb + gdal + mbgl-sys

PR #925 hit 'ar: No space left on device' at the 51-minute mark while
archiving libduckdb-sys (~6GB of object files). ubuntu-latest ships with
~14GB free on /; the cumulative build of libduckdb-sys (bundled C++) + GDAL
+ mbgl-sys C++ + cargo target/debug under --all-features routinely exceeds
that.

Adds jlumbroso/free-disk-space@main as the first step in the ci-rust job to
reclaim ~30GB by removing the pre-installed Android SDK (~14GB), .NET
runtime (~2.7GB), Haskell, large packages (~5.3GB), Docker images, and
swap storage. None of those are used by this workspace.

tool-cache: false is left ON because tool-cache holds the pinned Node 24
and rust toolchain that the workflow itself relies on; flipping it would
break the next steps.

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>

---------

Signed-off-by: Vinayak Kulkarni <19776877+vinayakkulkarni@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant