remix v3.0.0-alpha.6
-
BREAKING CHANGE:
MultipartPart.headersfromremix/multipart-parserandremix/multipart-parser/nodeis now a plain decoded object keyed by lower-case header name instead of a nativeHeadersinstance. Access part headers with bracket notation likepart.headers['content-type']instead ofpart.headers.get('content-type'). -
BREAKING CHANGE: Removed the deprecated
remix/component,remix/component/jsx-runtime,remix/component/jsx-dev-runtime, andremix/component/serverpackage exports. Import the consolidated UI runtime fromremix/ui,remix/ui/jsx-runtime,remix/ui/jsx-dev-runtime, andremix/ui/serverinstead.Removed
package.jsonbincommands:remix-test
Added
package.jsonexports:remix/node-fetch-server/testto re-export APIs from@remix-run/node-fetch-server/testremix/terminalto re-export APIs from@remix-run/terminalremix/test/clito re-export APIs from@remix-run/test/cli
Added
package.jsonexportsfor the consolidated UI runtime:remix/uito re-export APIs from@remix-run/uiremix/ui/jsx-runtimeto re-export APIs from@remix-run/ui/jsx-runtimeremix/ui/jsx-dev-runtimeto re-export APIs from@remix-run/ui/jsx-dev-runtimeremix/ui/serverto re-export APIs from@remix-run/ui/serverremix/ui/animationto re-export APIs from@remix-run/ui/animationremix/ui/accordionto re-export APIs from@remix-run/ui/accordionremix/ui/anchorto re-export APIs from@remix-run/ui/anchorremix/ui/breadcrumbsto re-export APIs from@remix-run/ui/breadcrumbsremix/ui/buttonto re-export APIs from@remix-run/ui/buttonremix/ui/comboboxto re-export APIs from@remix-run/ui/comboboxremix/ui/glyphto re-export APIs from@remix-run/ui/glyphremix/ui/listboxto re-export APIs from@remix-run/ui/listboxremix/ui/menuto re-export APIs from@remix-run/ui/menuremix/ui/popoverto re-export APIs from@remix-run/ui/popoverremix/ui/scroll-lockto re-export APIs from@remix-run/ui/scroll-lockremix/ui/selectto re-export APIs from@remix-run/ui/selectremix/ui/separatorto re-export APIs from@remix-run/ui/separatorremix/ui/themeto re-export APIs from@remix-run/ui/themeremix/ui/testto re-export APIs from@remix-run/ui/test
-
Added
package.jsonexports and binaries for the Remix CLI:remix/clito expose the Remix CLI programmatic APIremixas apackage.jsonbincommand that delegates to@remix-run/cli
The Remix CLI now reads the current Remix version from the
remixpackage and declares Node.js 24.3.0 or later in package metadata. -
Bumped
@remix-run/*dependencies:assets@0.2.0auth@0.2.0cli@0.1.0compression-middleware@0.1.6data-schema@0.3.0data-table-sqlite@0.4.0fetch-proxy@0.8.0file-storage@0.13.4file-storage-s3@0.1.1form-data-middleware@0.2.2form-data-parser@0.17.0fs@0.4.3lazy-file@5.0.3logger-middleware@0.2.0mime@0.4.1multipart-parser@0.16.0response@0.3.3static-middleware@0.4.7tar-parser@0.7.1terminal@0.1.0test@0.2.0ui@0.1.0
response v0.3.3
- Bumped
@remix-run/*dependencies:
static-middleware v0.4.7
- Bumped
@remix-run/*dependencies:
test v0.2.0
-
Add
glob.excludeconfig for filtering paths during test discovery (defaults tonode_modules/**) -
Add code coverage reporting to
remix-test- You can enable coverage with default settings vis
remix-test --coverageor settingcoverage:truein yourremix-test.config.ts - Or you can specify individual coverage settings via the following config fields:
coverage.dir: Directory to store coverage information (default.coverage)coverage.include: Array of globs for files to include in coveragecoverage.exclude: Array of globs for files to exclude from coveragecoverage.statements: Percentage threshold for statement coveragecoverage.lines: Percentage threshold for line coveragecoverage.branches: Percentage threshold for branch coveragecoverage.functions: Percentage threshold for function coverage
- You can enable coverage with default settings vis
-
Export
runRemixTestfrom@remix-run/test/cliso other tools can run the Remix test runner programmatically without exiting the host process. The function returns an exit code so callers can decide how to terminate. Theremix-testexecutable now declares Node.js 24.3.0 or later in package metadata.
-
Internal refactor to test discovery to better support test execution in
bun.- Unlike Node, Bun's
fs.promises.globfollows symbolic links and does not prune traversal via theexcludeoption, which can cause the test runner to enternode_modulessymlink cycles in pnpm workspaces - Refactored the internal test discovery logic to detect and use Bun's native
Globclass when running under the Bun runtime. Bun'sGlob#scandoes not follow symlinks by default, avoiding the cycle. - The Node runtime continues to use
fs.promises.glob
- Unlike Node, Bun's
-
Use native dynamic
import()in Bun to load.tsand.tsxfiles in the test runner -
Bumped
@remix-run/*dependencies:
multipart-parser v0.16.0
-
BREAKING CHANGE:
MultipartPart.headersis now a plain decoded object keyed by lower-case header name instead of a nativeHeadersinstance. Access part headers with bracket notation likepart.headers['content-type']instead ofpart.headers.get('content-type').This lets multipart part headers preserve decoded UTF-8 field names and filenames that native
Headerscannot store.
terminal v0.1.0
- Initial release of terminal output utilities for ANSI styles, color capability detection, escape sequences, and testable terminal streams. Automatic color detection disables styles for CI,
NO_COLOR,TERM=dumb, and non-TTY output streams by default, and can be overridden with thecolorsoption. Style helpers include common modifiers, foreground colors, background colors, bright variants, and preserve outer styles when nested formatted strings close inner styles.
ui v0.1.0
-
BREAKING CHANGE: Consolidated the deprecated
@remix-run/componentpackage into@remix-run/ui. Import component runtime APIs from@remix-run/ui, server rendering APIs from@remix-run/ui/server, JSX runtime APIs from@remix-run/ui/jsx-runtimeand@remix-run/ui/jsx-dev-runtime, and animation APIs from@remix-run/ui/animation.Removed the deprecated
@remix-run/ui/on-outside-pointer-downexport. Use the popover, menu, or other component-level outside interaction APIs instead. -
BREAKING CHANGE: Components now receive props through a stable
handle.propsobject usingHandle<Props, Context>instead of receiving a separatesetupargument and render callback props. Move initialization values that previously used<Component setup={...} />onto regular props, and read all props fromhandle.propsin both the component function and render callback.Before:
function Counter(handle: Handle<CounterContext>, setup: { initialCount: number }) { let count = setup.initialCount return (props: { label: string }) => ( <button> {props.label}: {count} </button> ) } ;<Counter setup={{ initialCount: 10 }} label="Count" />
After:
function Counter(handle: Handle<{ initialCount: number; label: string }, CounterContext>) { let count = handle.props.initialCount return () => ( <button> {handle.props.label}: {count} </button> ) } ;<Counter initialCount={10} label="Count" />
The
handle.propsobject keeps the same identity for the component lifetime while its values are updated before each render, so destructuringlet { props, update } = handleremains safe. Thesetupprop is no longer special and is treated like any other prop.This also removes the old pattern where setup-scope helpers had to read from a mutable variable that was reassigned inside the render callback:
function Listbox(handle: Handle<ListboxContext>) { let props: ListboxProps function select(value: string) { props.onSelect(value) } handle.context.set({ select }) return (nextProps: ListboxProps) => { props = nextProps return props.children } }
Helpers can now read the current props directly from the stable handle:
function Listbox(handle: Handle<ListboxProps, ListboxContext>) { function select(value: string) { handle.props.onSelect(value) } handle.context.set({ select }) return () => handle.props.children }
-
BREAKING CHANGE: Removed the deprecated
keysEvents,pressEvents, andPressEventexports from@remix-run/ui. Useon(...)with native DOM keyboard, pointer, and click events directly instead.