Skip to content

Release v2.5.0 - #285

Merged
natelindev merged 9 commits into
mainfrom
release/v2.5.0
Oct 15, 2026
Merged

natelindev merged 9 commits into
mainfrom
release/v2.5.0

Conversation

@natelindev

Copy link
Copy Markdown
Owner

Summary

Bug fixes

  • Object filenames: createCalendarObject and createVCard now keep filename inside the collection. Names such as urn:uuid:1.ics no longer parse as URL schemes, ?/# no longer truncate the name, and existing percent-escapes are kept. Names containing /, or equal to . or .., now throw instead of writing outside the collection.
  • Expired sync tokens: when a server rejects the stored token (DAV:valid-sync-token), the WebDAV sync restarts once from an empty token instead of failing. Local objects missing from an initial sync are now reported as deleted.
  • Percent-encoding: DAV hrefs that differ only in percent-encoding (a@b.ics vs a%40b.ics) now match. Previously, object fetches failed as "incomplete response" and principal URLs containing email addresses could fail to match.
  • OAuth: access tokens are refreshed a minute before they expire, and expires_in sent as a numeric string is accepted. Before, those tokens were refreshed on every request.

Tooling

  • pnpm 12 and Vite 8 with no dependency overrides, current patch releases, dotenv replaced by process.loadEnvFile, and a clean pnpm audit.
  • Library sources are type-checked without ambient Node.js types.
  • CI: actions/checkout and setup-node v7, pnpm/action-setup v6, and a Node.js 26 test job. The Node 18/20 runtime checks now run without pnpm, which needs Node 22+. The unused NPM_TOKEN reference is removed from the release job, which already publishes through trusted publishing.
  • Docs site: pnpm 12, Astro 7, Starlight 0.42. The calendar-icon patch is recreated. CSS that changed priority under Starlight's cascade layers is adjusted so the site looks the same.

Test plan

  • lint, typecheck, unit tests (469), coverage thresholds, consumer types, docs examples, Knip
  • Digest checks on Node 24, plus headless Chromium
  • Packed tarball imports via CJS and ESM on Node 18 and 20, and the Digest runtime test passes on Node 18 and 20
  • Each commit passes typecheck, lint and tests on its own
  • Each new regression test fails without its fix
  • Docs: test, typecheck and build pass. Full-page screenshots of 9 pages (light and dark, desktop and mobile) match the pre-upgrade site, apart from the version banner and anti-aliasing. Search, tabs, the React converter and the mobile menu behave the same as before.
  • Live provider integration tests were not run

🤖 Generated with Claude Code

- pnpm 12 with no overrides; Vite 8 removes esbuild and the placeholder
  build-script setting, and the source-map-js advisory is fixed in the lockfile
- current Biome, Vitest, Rolldown, Knip, Playwright and @types/node; exact pins
- load .env with process.loadEnvFile instead of dotenv
- type-check library sources without ambient Node.js types
- GitHub Actions checkout/setup-node v7 and pnpm/action-setup v6, Node.js 26
  in CI, Node 18/20 runtime checks without pnpm, and no unused npm token in
  the trusted-publishing release job
createCalendarObject and createVCard resolved `filename` as a relative URL,
so `urn:uuid:1.ics` became its own URL scheme, `#` and `?` truncated the
name, and `/x.ics` or `../x.ics` wrote outside the collection. Treat the
filename as one path segment: percent-encode characters with URL meaning
while keeping existing escapes, and reject names that are not a segment.
A server that no longer accepts a sync token fails the
DAV:valid-sync-token precondition (RFC 6578 §3.2), which made
smartCollectionSync and syncCalendars throw. Retry once from an empty
token, and diff an initial sync as a full listing so local objects it
omits are reported as deleted.
Servers may answer `a@b.ics` with `a%40b.ics`, which made object fetches
fail as incomplete and principal URLs with email addresses stop matching.
Normalize path-segment encoding in comparison keys and urlMatches only;
request URLs are unchanged.
Refresh access tokens a minute early so they cannot expire mid-request,
and accept `expires_in` as a numeric string, which previously left no
expiration and refreshed on every request. Also covers fetching objects
whose hrefs differ only in percent-encoding.
- Astro 7, Starlight 0.42, @astrojs/react 7, TypeScript 7; @astrojs/mdx now
  comes with Starlight
- move `social` to the array form and wrap the autogenerated sidebar group
- recreate the calendar icon patch against Starlight's compiled icons
- Starlight now styles in cascade layers, so drop custom card-grid and card
  declarations that never applied before, and keep the previous tab metrics,
  leaving every compared page visually unchanged
@vercel

vercel Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
tsdav Ignored Ignored Preview Oct 15, 2026 12:32pm UTC

Vite 8 resolves the nearest tsconfig per file, so importing docs helpers in
tests loaded docs/tsconfig.json, which extends the Astro preset that only
the separate docs install provides. CI's library job failed on it; pin the
root tsconfig as the esbuild tsconfigRaw setting did before.
@natelindev
natelindev merged commit 078da17 into main Oct 15, 2026
11 checks passed

This branch was successfully deployed

2 active (1 outdated) deployments
Production — 22cebda1 Deployed Oct 15, 2026 by natelindev via automated-test (26) #1409
Preview — d86d491b Deployed Oct 15, 2026 by vercel[bot]
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