route-pattern v0.24.0
-
BREAKING CHANGE: Route matching now uses delimiter-bounded params and a bounded state compiler (see #11651). Pathname params possessively capture through hyphens but stop at raw
/or., so UUIDs remain intact andcreateHref()percent-encodes dots in param values for round-tripping. Patterns such as/:year-:monthmust migrate to one inseparable param such as/:date, or place captures in separate delimiter-bounded segments.Patterns may contain any number of separated wildcards and optional groups without eagerly expanding variants or using backtracking regular expressions. Adjacent wildcards, empty optionals, params followed by non-delimiter text, and ambiguous adjacent optional capture schemas now throw
ParseError. Repeated capture names remain valid: the last participating capture wins inparams, whileparamsMetaretains every capture in source order.Static pattern text is decoded during matching, while raw and percent-encoded
/and.retain distinct structural meaning. Matchers also accept configurable pattern-size, matcher-size, and match-work limits throughMatcherOptions.limits; exceeding a limit throwsMatcherResourceErrorwith structured details. -
BREAKING CHANGE:
createHref(pattern, params, searchParams)now accepts an options object as its third argument. Move existing search parameters tocreateHref(pattern, params, { searchParams }).Matchers now accept relative URL strings when an absolute
baseURLis provided tomatch()ormatchAll().createHref()accepts the samebaseURLoption and returns path-relative references for same-origin targets while leaving cross-origin targets absolute. ThesearchParamsoption accepts both typed plain objects andURLSearchParams; repeatedURLSearchParamsentries retain their order.
test v0.6.0
-
BREAKING CHANGE: Removed executable
remix-test.config.tsandremix-test.config.jsdiscovery, along with theconfigpath option fromrunRemixTest(). The programmatic@remix-run/test/cliAPI now accepts structured invocation options only. For CLI usage, move static test settings underremix.json#test; the main Remix CLI owns JSONC loading, path resolution, validation, and precedence before invoking the test runner (see #11628). -
BREAKING CHANGE: Removed the standalone
remix-testexecutable. Useremix testfor command-line test runs.runRemixTest()from@remix-run/test/clinow accepts typed runner options such astype,glob, andconcurrencyinstead of anargvarray, and it no longer readsprocess.argvor handles CLI help (see #11623). ThegetRemixTestHelpText()export was removed along with CLI help handling;remix test -hprints the equivalent help text.@remix-run/test/clinow exportsremixTestPools(the supportedpoolvalues), andcoverage.enabledaccepts'inherit'to defer coverage enablement to the config file while still refining other coverage settings.- remix-test --type server --concurrency 1 + remix test --type server --concurrency 1
import { runRemixTest } from '@remix-run/test/cli' let exitCode = await runRemixTest({ - argv: ['--type', 'server', '--concurrency', '1'], cwd: process.cwd(), + type: ['server'], + concurrency: 1, }) -
Added a
--onlyCLI flag andonlyconfig option to focus tests by matching suite names or full test names without editing source files to add.onlymodifiers. -
Added a
--quiet/-qCLI flag to omit skipped tests from reporter output.
-
remix testnow defaultsNODE_ENVtotestwhen it is not already set, so app modules loaded by test files can reliably select test-only resources such as in-memory databases. An explicitly setNODE_ENVis preserved (see #11608). -
Fixed
.onlyfiltering so focused tests and suites apply across the entire test module instead of only within the nearestdescribeblock. Whendescribe.onlyandit.onlyare both present, the runner now executes the union of focused suites and focused tests.
session-middleware v0.4.0
- BREAKING CHANGE: Session cookies now default to
HttpOnlywhen the cookie'shttpOnlyoption is omitted. SethttpOnly: falseexplicitly to preserve access from client-side JavaScript; the middleware emits a warning when this protection is disabled.
- Bumped
@remix-run/*dependencies:
ui v0.5.0
-
BREAKING CHANGE: Browser
resolveFramecallbacks now receive a single options object instead of positional signal and target arguments. UpdateresolveFrame(src, signal, target)implementations to useresolveFrame(src, options)and readoptions?.signalandoptions?.target. -
Added
framesto theappobject returned fromrun(), mirroring the existinghandle.framesAPI -
Added
@remix-run/ui/dev/refreshfor development tooling that needs to reconcile mounted roots after component modules update. -
Same-origin forms now progressively enhance into frame navigations when
run({ resolveFrame })is configured. Native constraint validation runs before interception, submissions target the top frame by default,rmx-targetselects a named frame, andrmx-documentopts back into document navigation. For non-GET submissions, resolvers receive the browser's nativeFormDataplus the selected method and encoding, and remain responsible for request encoding and_methodconventions. Non-GET submissions to the current URL replace its history entry without retaining theirFormData; submissions to a different URL and GET submissions push a new entry. -
Browser frame resolvers may now return a
Response. Its body is streamed into the frame, and when a top-frame navigation follows a redirect, the final response URL replaces the current navigation entry and becomes the frame's canonicalsrcwithout loading the frame a second time. Direct reloads and named-frame navigations render the redirected response without replacing their canonicalsrcwith the final response URL. -
Add an
rmx-history="push|replace"attribute for anchors and forms that overrides the history behavior of enhanced frame navigations. Native anchors usinglink(href, { history })emit the corresponding attribute value automatically. -
Add an
rmx-preserve-domattribute that tells the DOM reconciler to preserve a matching element's current attributes and children during reloads, allowing client-owned subtrees such as custom elements to manage their own DOM.
-
Allow element-wide mixins such as
css()to be used on subtype hosts like<select>without TypeScript assignability errors. -
Built-in styled components now use adaptive
light-dark(...)colors for their internal surfaces, text, borders, focus rings, and control states so they render correctly in dark color schemes. -
Escape less-than characters in server-rendered
css()output so style values cannot terminate the generated<style>element. -
Fix hydrated component updates that could lose content when adding elements before existing content in a fragment
-
Prevent navigation and reloads from hanging when a nested
Framemarker moves outside a frame region while the DOM is being updated. -
Preserve client entry and frame state only for live boundaries with matching semantic identities, while replacing pending client entry SSR during reloads and releasing temporary response metadata after hydration or cancellation.
-
Prevent client-side document navigation and
Frameupdates from stalling after navigating between pages with differentFramelayouts. A frame's end marker could be reused as the start marker of an incoming frame, which left the frame's region bounds and instance pointing at the wrong nodes. -
Preserve resolved client-created frame content when its parent rerenders while the frame is still pending (see #11659).
-
Prevent document and frame reloads from dropping newly rendered sibling elements when client entries from the previous content are disposed.
-
Reload frames rendered within preserved client entries during ancestor frame reloads
-
Show complete destination server-rendered client entry content during document and frame reloads while replacement modules load, instead of retaining only positionally matched source content.
-
Fix top frame reloads using the previous URL after navigation targets a named frame.
render-middleware v0.1.5
- Bumped
@remix-run/*dependencies: