[ci] release - #235
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
12 times, most recently
from
August 10, 2026 23:07
4f4a6e7 to
3f9b832
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 11, 2026 05:04
3f9b832 to
2fe6606
Compare
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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 was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@marko/run-adapter-static@2.0.9
Patch Changes
dist/publicand only aconsole.warnto show for it.crawlnow collects every failed path and throws once crawling settles, listing each status and path. A success status with nothing to prerender — the 204 a handler-only route falls back to, say — still only warns.+404page frommarko-run previewwith a real 404 status. sirv'ssendends with an unconditionalwriteHead(200, …)that overwrote the status assigned from itssetHeadershook, soGET /404answered 200 with the 404 body and no request ever produced a 404 status.404, followed by each path that answered404or a status the crawler has no handling for, with its status. Those paths still do not fail the build, but they were previously invisible (a404) or a lone warning per path (everything else), so they are now listed together under the counts.@marko/run@0.11.9
Patch Changes
64c81e9: Keep one deleted route file from wedging the dev server. Deleting a
+page/+handlerremoved the route's generated template from disk while the dev watcher actively poked the deleted route's own modules with synthetic change events, so an adapter that eagerly re-evaluates invalidated modules reloaded an id the plugin answered withundefined, and every SSR route 500'd with "Failed to load url ... Does the file exist?" until a manual restart. The watcher no longer touches a deleted file's module chain, and a stale reload of a vanished generated template now answers an empty module instead of failing the whole request graph. Re-creating a deleted route file also now refreshes the route table — the watcher used to poke the re-added file's stale module chain, which the router was no longer connected to, so the restored route kept answering 404 until an unrelated rebuild.5b67125: Fix HEAD requests on routes with a
Run.GEThandler.Two bugs combined to break auto-generated HEAD handling:
callcompared a handler's"GET"verb stamp againstcontext.method("HEAD") and skipped the handler entirely, leavingcontext.dataempty and causing the page template to run with missing data; andcontext.renderbuilt and streamed the full template even for HEAD, where the body is discarded anyway.callnow treats aGET-stamped handler as matching a HEAD request — an explicitHEADexport gets its own entry so there is no double-run risk.context.renderreturns a no-body response immediately for HEAD, so the page template never executes and any data the GET handler placed incontext.datais used only for response headers.createMiddlewareno longer setsContent-Length: 0on HEAD responses or 204/304 statuses. RFC 9110 §8.6 forbids the header on 204, and on HEAD it falsely advertises an empty resource to CDNs and uptime monitors.81c4666: Make a wrong verb export fail loudly instead of silently answering 204. Route verbs are discovered from export names alone, so two ordinary mistakes produced routes that looked wired up and answered
204 No Contentwith zero diagnostics: a truthy non-function export (export const GET = 42, or an accidental object after a refactor) degraded to a no-op handler, and the classic copy-paste renameexport const GET = Run.POST(...)registered a GET route whose handler the runtime then refused to run for GET requests.normalizeHandlernow knows which export it is normalizing and throws a clear error for both — at module load in dev (a 500 naming the export and the factory) and at server startup in production, while a promise-wrapped handler rejects with the same error on its first call instead.Run.ALLhandlers remain valid under any verb export, and a nullish export keeps its previous no-op behavior.58baddf: Give each dev server its own working HMR websocket. Vite's middleware mode binds a fixed default port, so a second
marko-run devinstance on the same machine failed to bind it — with the error message swallowed — and its live reload silently connected to the first instance. A dev server whose config names no HMR port (nor a server or client port to honor) now keeps Vite's default port while it is free and allocates a free one otherwise.60efda4: Accept a bare truthy
json/formhandler option —Run.POST({ form: true }, handler)— as "parse the body with the defaults". The option was probed with"~standard" in optionto tell a Standard Schema from an options object, andinthrows on a primitive, so an untyped project writing the naturalform: truegot an opaque 500 out of the runtime's option merging instead of a parsed body. The types already forbid the primitive, so type-checked projects are unaffected. The same policy now applies one level down: aparams,search, or nestedvalidatorvalue that is neither a function nor a Standard Schema is treated as no validator, where it previously got wrapped as a schema and crashed on the first validation instead.cc6098f: Report a clear error in dev when a handler returns something other than a
Response. Returning data directly (thereturn { items }habit) previously reached the node adapter, which failed withheaders is not iterablefrom its own internals and named neither the route nor the contract. The dev-mode guard now names the verb, the route, and what to return instead.Also register the
NotHandled/NotMatchedsentinels withSymbol.for. A build can load more than one copy of the runtime module, and a sentinel returned from user code was not recognized by another copy's comparison — flowing into the adapter as if it were a response.b741de2: Abort
request.signaland cancel the response stream when a client disconnects. The node request path built itsRequestwithout a signal, sorequest.signal.addEventListener("abort", ...)— the standard way to notice a client is gone — could never fire, and the only cancellation was ares.destroyedcheck reached between chunks. A stream that had gone idle never reached it, so its timers and upstream work kept running after the client left. Affects the dev server,marko-run previewand@marko/run-adapter-nodealike, since all three share this middleware. Along the waygetRender— the helper@marko/run/adapter/middlewareexported for picking the stashed Marko render over the body — is folded into the newgetBodyReader, which makes the same choice and hands back theread/cancelpair the middleware itself writes with.edc7a02: URL-decode catch-all (
$$) route params. Dynamic ($) segments were decoded but the catch-all was handed through raw, so the two param kinds disagreed andRun.href's percent-encoding had no matching decode —Run.hreffor["docs", "café"]produced/docs/caf%C3%A9, and the linked page read backparams.rest === "docs/caf%C3%A9". The catch-all now decodes like every other param, completing the href round-trip. A request whose catch-all carries a malformed percent sequence now fails the same way it always has for dynamic segments.7bd7b09: Type
Route["body"]asundefinedfor verbs that cannot carry one. Without a typed validator,bodywidened toundefined | Promise<unknown>for every verb, so a GET page's$global.bodyandGetContext(...).bodyinvitedawaithandling the runtime never satisfies — it only creates a body thenable for POST/PUT/PATCH with ajson/formoption configured — while the very same file'sRun.GEThandler correctly typedctx.bodyasundefined. The hedge now only survives when the def's method can carry a body; the fully genericRoute/Context(actx.parent, say) keeps it, since a generic context may belong to a bodied route.cb62270: Fix the dev server not applying an added or removed
+layout.markountil an unrelated edit or restart. The generated route entry templates are now explicitly invalidated when their content changes, so layout composition updates take effect immediately.