8 hours ago
remix

route-pattern v0.24.0

Minor Changes

  • 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 and createHref() percent-encodes dots in param values for round-tripping. Patterns such as /:year-:month must 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 in params, while paramsMeta retains 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 through MatcherOptions.limits; exceeding a limit throws MatcherResourceError with structured details.

  • BREAKING CHANGE: createHref(pattern, params, searchParams) now accepts an options object as its third argument. Move existing search parameters to createHref(pattern, params, { searchParams }).

    Matchers now accept relative URL strings when an absolute baseURL is provided to match() or matchAll(). createHref() accepts the same baseURL option and returns path-relative references for same-origin targets while leaving cross-origin targets absolute. The searchParams option accepts both typed plain objects and URLSearchParams; repeated URLSearchParams entries retain their order.

8 hours ago
remix

test v0.6.0

Minor Changes

  • BREAKING CHANGE: Removed executable remix-test.config.ts and remix-test.config.js discovery, along with the config path option from runRemixTest(). The programmatic @remix-run/test/cli API now accepts structured invocation options only. For CLI usage, move static test settings under remix.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-test executable. Use remix test for command-line test runs. runRemixTest() from @remix-run/test/cli now accepts typed runner options such as type, glob, and concurrency instead of an argv array, and it no longer reads process.argv or handles CLI help (see #11623). The getRemixTestHelpText() export was removed along with CLI help handling; remix test -h prints the equivalent help text. @remix-run/test/cli now exports remixTestPools (the supported pool values), and coverage.enabled accepts '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 --only CLI flag and only config option to focus tests by matching suite names or full test names without editing source files to add .only modifiers.

  • Added a --quiet/-q CLI flag to omit skipped tests from reporter output.

Patch Changes

  • remix test now defaults NODE_ENV to test when 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 set NODE_ENV is preserved (see #11608).

  • Fixed .only filtering so focused tests and suites apply across the entire test module instead of only within the nearest describe block. When describe.only and it.only are both present, the runner now executes the union of focused suites and focused tests.

8 hours ago
remix

response v0.3.8

Patch Changes

  • compressResponse() now adds Vary: Accept-Encoding to otherwise eligible identity responses, including requests that omit Accept-Encoding, so shared caches do not reuse an uncompressed response for compression-capable clients.
8 hours ago
remix

node-hmr v0.1.0

Minor Changes

  • Added the initial @remix-run/node-hmr package for supervising Node.js applications in development with an import.meta.hot API and optional parent-owned browser HMR coordination through browserHmrChannel.
8 hours ago
remix

node-fetch-server v0.14.1

Patch Changes

  • Request handlers now receive native Request instances instead of lazy request objects that emulated native requests. This fixes compatibility with standard APIs like new Request(request, init) that rely on native Request internals.
8 hours ago
remix

multipart-parser v0.16.4

Patch Changes

  • Limit boundaries to the 70-character maximum defined by RFC 2046, and update the non-Node runtime buffer search to handle longer patterns without stalling.
8 hours ago
remix

session-middleware v0.4.0

Minor Changes

  • BREAKING CHANGE: Session cookies now default to HttpOnly when the cookie's httpOnly option is omitted. Set httpOnly: false explicitly to preserve access from client-side JavaScript; the middleware emits a warning when this protection is disabled.

Patch Changes

8 hours ago
remix

ui-hmr v0.1.0

Minor Changes

  • Added the initial @remix-run/ui-hmr package with Remix UI component HMR runtimes, a remix/assets loader, and Node module hooks.

    Use remix/ui-hmr/node as a Node import hook for server modules and uiHmr() from remix/ui-hmr/assets with remix/assets for browser modules.

8 hours ago
remix

ui v0.5.0

Minor Changes

  • BREAKING CHANGE: Browser resolveFrame callbacks now receive a single options object instead of positional signal and target arguments. Update resolveFrame(src, signal, target) implementations to use resolveFrame(src, options) and read options?.signal and options?.target.

  • Added frames to the app object returned from run(), mirroring the existing handle.frames API

  • Added @remix-run/ui/dev/refresh for 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-target selects a named frame, and rmx-document opts back into document navigation. For non-GET submissions, resolvers receive the browser's native FormData plus the selected method and encoding, and remain responsible for request encoding and _method conventions. Non-GET submissions to the current URL replace its history entry without retaining their FormData; 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 canonical src without loading the frame a second time. Direct reloads and named-frame navigations render the redirected response without replacing their canonical src with 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 using link(href, { history }) emit the corresponding attribute value automatically.

  • Add an rmx-preserve-dom attribute 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.

Patch Changes

  • 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 Frame marker 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 Frame updates from stalling after navigating between pages with different Frame layouts. 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.

8 hours ago
remix

render-middleware v0.1.5

Patch Changes