remix-run/remix
### [`v1.9.0`](https://togithub.com/remix-run/remix/releases/tag/remix%401.9.0): v1.9.0
[Compare Source](https://togithub.com/remix-run/remix/compare/1a5b6f03a7e81a51f37e8d7f979be06ffadeded3...8b09abb25b16a754ad71c2232d5dcfc616fcf61c)
#### The New Stuff
##### Support for React Router's Optional Route Segments
We shipped the latest minor version of 6.5.0 with support for [optional route segments](https://togithub.com/remix-run/react-router/issues/9546), and now Remix supports them as well. To do this, we've introduced a new convention for file-system routes.
Route filenames surrounded by parenthesis will be converted into optional segments for React Router. For example `/($lang)/about` will be converted to `/:lang?/about`.
This means `/($lang)/about` would match:
/en/about
/fr/about
/about <-- $lang is optional!
Another example: `/(one)/($two)/(three).($four)` route would match all of the following:
/
/one
/one/param1
/one/param1/three
/one/param1/three/param2
As with any of our conventions, you can escape the conversion by wrapping the route filename in square brackets. For example, `/[(one)]/two` would match the URL path `/(one)/two`.
##### Added Support for New TypeScript Syntax
The Remix compiler now supports new TypeScript 4.9 syntax ([#4754](https://togithub.com/remix-run/remix/pull/4754)). There were several cool features that landed in the latest TypeScript release, and we're stoked that you can grab them today! 🤓
One of our favorites is the `satisfies` keyword, which lets you validate that an expression matches a given type—without changing the resulting type of that expression.
```ts
// this example comes from the TypeScript 4.9 release notes
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];
const palette = {
red: [255, 0, 0],
green: "#00ff00",
bleu: [0, 0, 255]
// ~~~~ The typo is now caught!
} satisfies Record;
// Both of these methods are still accessible!
const redComponent = palette.red.at(0);
const greenNormalized = palette.green.toUpperCase();
```
For a closer look at all the new features available, check out the [TypeScript release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html).
##### Perf Gains for Your Routes 💪
Sometimes you can get big wins out of tiny changes. We did that by making a tweak to a lookup algorithm in `defineConventionalRoutes` that resulted in some numbers we love to see.
In local runs of the production builds for a larger, realistic project (~700 routes):
- **Previously:** 10-15s
- **Now:** <1 second — >*10x faster!*
In addition to new features, we also squashed some nasty critters over the last week.
##### A Pesky Bug Squashed: Firefox and ``
We fixed up a problem with `` in Firefox that caused pages to infinitely reload after changes. This was no bueno!
The problem was:
1. Firefox is calling `ws.onclose` immediately upon connecting (?!)
2. Then we’re trying to reconnect, and upon reconnection, we reload the page
3. Firefox then calls `ws.onclose` again after reconnecting and the loop starts over
This fix is to check for the proper event code (`1006`) before actually trying to reconnect and the reload the page. [1006 means the connection was closed abnormally](https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1), but in our case it means the server was shut down in local dev, and the socket can reconnect again when the server is back up.
##### Changes by Package
- [`@remix-run/deno`](https://togithub.com/remix-run/remix/blob/remix%401.9.0/packages/remix-deno/CHANGELOG.md#190)
- [`@remix-run/dev`](https://togithub.com/remix-run/remix/blob/remix%401.9.0/packages/remix-dev/CHANGELOG.md#190)
- [`@remix-run/react`](https://togithub.com/remix-run/remix/blob/remix%401.9.0/packages/remix-react/CHANGELOG.md#190)
- [`@remix-run/serve`](https://togithub.com/remix-run/remix/blob/remix%401.9.0/packages/remix-serve/CHANGELOG.md#190)
- [`@remix-run/server-runtime`](https://togithub.com/remix-run/remix/blob/remix%401.9.0/packages/remix-server-runtime/CHANGELOG.md#190)
#### New Contributors
- [@lucasferreira](https://togithub.com/lucasferreira) made their first contribution in [https://github.com/remix-run/remix/pull/3970](https://togithub.com/remix-run/remix/pull/3970)
- [@dabdine](https://togithub.com/dabdine) made their first contribution in [https://github.com/remix-run/remix/pull/4734](https://togithub.com/remix-run/remix/pull/4734)
- [@dmarkow](https://togithub.com/dmarkow) made their first contribution in [https://github.com/remix-run/remix/pull/4538](https://togithub.com/remix-run/remix/pull/4538)
- [@lordofthecactus](https://togithub.com/lordofthecactus) made their first contribution in [https://github.com/remix-run/remix/pull/4706](https://togithub.com/remix-run/remix/pull/4706)
- [@akamfoad](https://togithub.com/akamfoad) made their first contribution in [https://github.com/remix-run/remix/pull/4825](https://togithub.com/remix-run/remix/pull/4825)
- [@jsbmg](https://togithub.com/jsbmg) made their first contribution in [https://github.com/remix-run/remix/pull/4833](https://togithub.com/remix-run/remix/pull/4833)
***
**Full Changelog**: [`1.8.2...1.9.0`](https://togithub.com/remix-run/remix/compare/remix@1.8.2...remix@1.9.0)
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
[ ] If you want to rebase/retry this PR, check this box
This PR has been generated by Mend Renovate. View repository job log here.
This PR contains the following updates:
1.8.2
->1.9.0
Release Notes
remix-run/remix
### [`v1.9.0`](https://togithub.com/remix-run/remix/releases/tag/remix%401.9.0): v1.9.0 [Compare Source](https://togithub.com/remix-run/remix/compare/1a5b6f03a7e81a51f37e8d7f979be06ffadeded3...8b09abb25b16a754ad71c2232d5dcfc616fcf61c) #### The New Stuff ##### Support for React Router's Optional Route Segments We shipped the latest minor version of 6.5.0 with support for [optional route segments](https://togithub.com/remix-run/react-router/issues/9546), and now Remix supports them as well. To do this, we've introduced a new convention for file-system routes. Route filenames surrounded by parenthesis will be converted into optional segments for React Router. For example `/($lang)/about` will be converted to `/:lang?/about`. This means `/($lang)/about` would match: /en/about /fr/about /about <-- $lang is optional! Another example: `/(one)/($two)/(three).($four)` route would match all of the following: / /one /one/param1 /one/param1/three /one/param1/three/param2 As with any of our conventions, you can escape the conversion by wrapping the route filename in square brackets. For example, `/[(one)]/two` would match the URL path `/(one)/two`. ##### Added Support for New TypeScript Syntax The Remix compiler now supports new TypeScript 4.9 syntax ([#4754](https://togithub.com/remix-run/remix/pull/4754)). There were several cool features that landed in the latest TypeScript release, and we're stoked that you can grab them today! 🤓 One of our favorites is the `satisfies` keyword, which lets you validate that an expression matches a given type—without changing the resulting type of that expression. ```ts // this example comes from the TypeScript 4.9 release notes type Colors = "red" | "green" | "blue"; type RGB = [red: number, green: number, blue: number]; const palette = { red: [255, 0, 0], green: "#00ff00", bleu: [0, 0, 255] // ~~~~ The typo is now caught! } satisfies RecordConfiguration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate. View repository job log here.