You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Added rich Pages data serialization. Date, Map, Set, bigint, and other supported values now keep their types through server rendering, hydration, navigation, and deferred loading.
Added bracket patterns such as /users/[id] and /files/[...path] to typed routing APIs. Existing colon patterns remain supported.
Added route-pattern inference to useParams(), including checks for page names and parameter names.
Extended routing.typedRoutes checks to redirects, island forms, ISR revalidation paths, and SSE and live stream client URLs.
Added routing.trailingSlash for Pages URLs ending in / and directory-style prerender output.
Added automatic types for custom Cloudflare bindings declared in void.config.ts.
Added getAuth(c) from void/auth to access the request’s Better Auth instance, including plugin APIs.
Added void deploy --skip-migrations for deployments where database migrations run separately.
Added support for Nitro 3 prereleases while retaining Nitro 2 compatibility.
Added support for custom ASSETS fetchers in Node.js, Bun, and Deno servers, including apps packaged as single executables.
Fixed React form status, errors, and resets during overlapping submissions, preserving edits made while a submission is in flight.
Fixed body validation for multipart and URL-encoded forms, including nested fields and file uploads.
Fixed prerender URLs containing multiple route parameters and catch-all segments.
Fixed pagination and filter links being marked active when their query parameters don’t match.
Fixed Pages response caching by preserving headers that distinguish HTML from page-data responses.
Fixed local .env values being included in native framework Worker bundles.
Fixed server values from void/env being unavailable in cron and queue jobs, and env.ts validation being removed from apps marked as having no side effects.
Fixed SvelteKit cron and queue job bundles being uploaded as public assets.
Fixed Worker Loader bindings being dropped when deploying with existing secrets.
Fixed vinext middleware being bypassed for public assets and not being detected on case-insensitive filesystems.
Fixed shared asset caches bypassing worker-first routing on Void platforms.
Fixed deployments of Workers without a public readiness URL.
Improved Cloudflare deployment errors and recovery when updating Worker triggers fails.
Fixed AI endpoints ignoring disabled platform capabilities.
Route patterns can now match your filenames directly. For a page at pages/users/[id].tsx, .vue, or .svelte. Bracket patterns also work with typed fetch(), WebSocket connections, page actions, and useParams():
Typed fetch() calls to non-GET endpoints now require an explicit method, such as { method: 'POST' }.
With routing.typedRoutes enabled, redirects, island forms, ISR revalidation paths, and stream URLs receive additional checks. Use routeUrl() for internal URLs with dynamic parameters.
Pages loader values such as dates now arrive as their original types rather than JSON strings. Update code that expects their JSON representation. Already-open tabs automatically reload on their next navigation when the page-data format changes.
Added isVoidActionError() to recognize action errors at any status, including thrown 401, 403, and 5xx errors. Available from all four framework adapters.
Fixed overlapping routes choosing the wrong handler. Pages, API routes, and WebSocket routes now consistently prefer more specific paths.
Fixed c.redirect() unintentionally forwarding incoming query parameters to its destination.
Fixed unnecessary static page-data requests during development and for pages with prerender = false, avoiding 404s and extra round trips.
Fixed Solid's useParams() returning stale parameters after client-side navigation.
Fixed Better Auth OAuth state not being shared correctly in local development.
Fixed framework _headers files being dropped on native Cloudflare deployments that preserve existing secrets.
Fixed configuration errors and diagnostics referring to void.json in projects using void.config.ts.
Use isVoidActionError() in error handling to distinguish failed actions from other errors and read their status and message:
import{isVoidActionError}from'@void/react';functiondescribeError(error: unknown){if(isVoidActionError(error)){if(error.status===401)return'Please sign in again.';returnerror.message;}return'Something went wrong.';}
Form status fields are read-only, and form.data and form.errors cannot be replaced. In React and Solid, update fields through the form methods. Vue and Svelte continue to support editing data and errors in place.
Island form errors are now typed as string | undefined. Check that an error exists before using it.
Svelte useIslandForm() now infers field types from its defaults. Annotate defaults that need a wider type, such as null as File | null.
System calls cannot be simulated consistently and are left out of the measure. The reported value understates the real cost. Switch to the Walltime instrument to measure them.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
1.4.0→1.7.01.4.0→1.7.01.4.0→1.7.0Release Notes
voidzero-dev/void (@void/md)
v1.7.0Compare Source
Date,Map,Set,bigint, and other supported values now keep their types through server rendering, hydration, navigation, and deferred loading./users/[id]and/files/[...path]to typed routing APIs. Existing colon patterns remain supported.useParams(), including checks for page names and parameter names.routing.typedRouteschecks to redirects, island forms, ISR revalidation paths, and SSE and live stream client URLs.routing.trailingSlashfor Pages URLs ending in/and directory-style prerender output.void.config.ts.getAuth(c)fromvoid/authto access the request’s Better Auth instance, including plugin APIs.void deploy --skip-migrationsfor deployments where database migrations run separately.ASSETSfetchers in Node.js, Bun, and Deno servers, including apps packaged as single executables..envvalues being included in native framework Worker bundles.void/envbeing unavailable in cron and queue jobs, andenv.tsvalidation being removed from apps marked as having no side effects.Thanks to @0froq, @Dazzanova, @kotarotaniguchi0523, @L4Ph, @magurotuna, @morinokami, @niteshseram, @Saeris, and @yangshun for their contributions!
Rich Pages Data
Return values directly from loaders without converting dates, sets, or big integers yourself:
Loaders and props
Typed Routing
Route patterns can now match your filenames directly. For a page at
pages/users/[id].tsx,.vue, or.svelte. Bracket patterns also work with typedfetch(), WebSocket connections, page actions, anduseParams():Typed routing · Typed page params
Trailing-Slash Pages
Enable trailing slashes and directory-style output for hosts such as GitHub Pages. A page at
/posts/hello/is written toposts/hello/index.html:Trailing slashes and directory indexes
More Control over Deployments
Skip application and authentication SQL migrations when they run in a separate release step:
Deployment options
Upgrade Guide
fetch()calls to non-GET endpoints now require an explicitmethod, such as{ method: 'POST' }.routing.typedRoutesenabled, redirects, island forms, ISR revalidation paths, and stream URLs receive additional checks. UserouteUrl()for internal URLs with dynamic parameters.v1.6.2Compare Source
isVoidActionError()to recognize action errors at any status, including thrown401,403, and5xxerrors. Available from all four framework adapters.c.redirect()unintentionally forwarding incoming query parameters to its destination.prerender = false, avoiding 404s and extra round trips.useParams()returning stale parameters after client-side navigation._headersfiles being dropped on native Cloudflare deployments that preserve existing secrets.void.jsonin projects usingvoid.config.ts.Thanks to @0froq, @dvkam, @karthickeyan-dev, @morinokami, @niteshseram, @yangshun, and @yujiym for their contributions!
Recognizing Action Errors
Use
isVoidActionError()in error handling to distinguish failed actions from other errors and read their status and message:Action error handling
v1.6.1Compare Source
void preparefailing in fresh projects with authentication whentsconfig.jsonextends.void/tsconfig.json.v1.6.0Compare Source
routing.typedRoutesto check URL strings in links, navigation, and rewrites. Enabled by default in new Pages apps.aria-currentanddata-void-activeindicators toLink, withactiveMatch="prefix"for nested pages.data-void-pendingtoLinkwhile its destination is loading.prefetch.defaultStrategyto configure a default prefetch strategy for everyLink.Linkprefetching to skip external URLs, respect data saver and 2G connections, and wait 300 ms before prefetching visible links.{ resolveOn: 'data' }to Reactrouter.visit()androuter.refresh()to avoid deadlocks when awaiting navigation inside Actions or transitions.threadingoption tosendEmail()so replies sent later can stay in the same conversation.--runtime-logs minimalfor self-hosted platforms to omit request URLs and log and exception messages from runtime telemetry.Linktypes rejecting standard attributes and listeners such astarget,download, and@click.useForm()clearing errors written directly in an input handler..island.file was present.Thanks to @0froq, @Dazzanova, @dvkam, @iPLAYCAFE-dev, @karthickeyan-dev, @morinokami, @serkodev, @sglyon, @ubugeeei, and @yangshun for their contributions!
New Features
Typed Routes
New Pages apps enable typed route URLs automatically. To enable them in an existing app:
TypeScript then checks URL strings passed to
Link, router methods, andc.rewrite()against your app's routes.Checked URL strings
Active and Pending Links
Style the current page and a navigation in progress with CSS:
Use
activeMatch="prefix"to keep a section's link active on nested pages:Active links · Pending links
Prefetch Defaults
Configure prefetching once in your framework adapter:
The same option works with
voidVue,voidSvelte, andvoidSolid. Individual links can override it:Visible links wait 300 ms before prefetching. Automatic prefetching skips when the browser reports data saver or a 2G connection.
Prefetching
Awaiting Navigation in React Actions
Pass
resolveOn: 'data'when awaiting navigation inside a React Action or transition:This lets the Action finish once page data is ready, allowing React to commit the update.
React navigation completion
Email Threading
Save an incoming message's ID and use it when sending a reply later, such as from a queue job:
Reply later
Connected-App Refresh Tokens
Connected apps can renew access by posting
grant_type=refresh_tokenand their refresh token to/oauth/token, using HTTP Basic client authentication.Connected apps
Minimal Runtime Logs
Choose minimal logging when installing or upgrading a self-hosted platform:
Runtime logs
Upgrade Guide
Form types are stricter in this release:
form.dataandform.errorscannot be replaced. In React and Solid, update fields through the form methods. Vue and Svelte continue to support editing data and errors in place.string | undefined. Check that an error exists before using it.useIslandForm()now infers field types from its defaults. Annotate defaults that need a wider type, such asnull as File | null.v1.5.0Compare Source
routeUrl()fromvoid/routesto build URLs with autocomplete and type checking for route patterns and required parameters.router.visit(),router.prefetch(),router.flush(), andc.rewrite().logger.child(fields)to attach shared fields to log entries, with support for nested child loggers and per-call overrides.action()hanging when awaited inside a transition,useActionState, or a form action.withValidator({ query })dropping repeated query parameters. Repeated values are now preserved as arrays.void secret sync --platform cloudflarereporting success without storing secrets.--yestovoid secret syncfor scripts and CI. Cancelled secret commands now exit with a non-zero status.Thanks to @0froq, @Dazzanova, @morinokami, and @yangshun for their contributions!
Upgrade Guide
Please run
void migrateto add the.cloudflarebuild folder to your.gitignore. If you are usingvoid secret syncon CI, please add the--yesflag.Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.