remix 3.0.0-beta.1 → 3.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/headers/accept-encoding.d.ts +2 -0
  2. package/dist/headers/accept-encoding.d.ts.map +1 -0
  3. package/dist/headers/accept-encoding.js +2 -0
  4. package/dist/headers/accept-language.d.ts +2 -0
  5. package/dist/headers/accept-language.d.ts.map +1 -0
  6. package/dist/headers/accept-language.js +2 -0
  7. package/dist/headers/accept.d.ts +2 -0
  8. package/dist/headers/accept.d.ts.map +1 -0
  9. package/dist/headers/accept.js +2 -0
  10. package/dist/headers/cache-control.d.ts +2 -0
  11. package/dist/headers/cache-control.d.ts.map +1 -0
  12. package/dist/headers/cache-control.js +2 -0
  13. package/dist/headers/content-disposition.d.ts +2 -0
  14. package/dist/headers/content-disposition.d.ts.map +1 -0
  15. package/dist/headers/content-disposition.js +2 -0
  16. package/dist/headers/content-range.d.ts +2 -0
  17. package/dist/headers/content-range.d.ts.map +1 -0
  18. package/dist/headers/content-range.js +2 -0
  19. package/dist/headers/content-type.d.ts +2 -0
  20. package/dist/headers/content-type.d.ts.map +1 -0
  21. package/dist/headers/content-type.js +2 -0
  22. package/dist/headers/cookie.d.ts +2 -0
  23. package/dist/headers/cookie.d.ts.map +1 -0
  24. package/dist/headers/cookie.js +2 -0
  25. package/dist/headers/if-match.d.ts +2 -0
  26. package/dist/headers/if-match.d.ts.map +1 -0
  27. package/dist/headers/if-match.js +2 -0
  28. package/dist/headers/if-none-match.d.ts +2 -0
  29. package/dist/headers/if-none-match.d.ts.map +1 -0
  30. package/dist/headers/if-none-match.js +2 -0
  31. package/dist/headers/if-range.d.ts +2 -0
  32. package/dist/headers/if-range.d.ts.map +1 -0
  33. package/dist/headers/if-range.js +2 -0
  34. package/dist/headers/range.d.ts +2 -0
  35. package/dist/headers/range.d.ts.map +1 -0
  36. package/dist/headers/range.js +2 -0
  37. package/dist/headers/raw-headers.d.ts +2 -0
  38. package/dist/headers/raw-headers.d.ts.map +1 -0
  39. package/dist/headers/raw-headers.js +2 -0
  40. package/dist/headers/set-cookie.d.ts +2 -0
  41. package/dist/headers/set-cookie.d.ts.map +1 -0
  42. package/dist/headers/set-cookie.js +2 -0
  43. package/dist/headers/vary.d.ts +2 -0
  44. package/dist/headers/vary.d.ts.map +1 -0
  45. package/{src/node-serve.ts → dist/headers/vary.js} +1 -1
  46. package/package.json +102 -47
  47. package/src/csrf-middleware/README.md +5 -12
  48. package/src/data-schema/README.md +3 -9
  49. package/src/data-table/README.md +6 -14
  50. package/src/data-table-mysql/README.md +5 -11
  51. package/src/data-table-postgres/README.md +2 -4
  52. package/src/data-table-sqlite/README.md +2 -4
  53. package/src/fetch-proxy/README.md +1 -2
  54. package/src/file-storage/README.md +10 -4
  55. package/src/file-storage-s3/README.md +2 -3
  56. package/src/form-data-middleware/README.md +1 -2
  57. package/src/form-data-parser/README.md +7 -12
  58. package/src/headers/README.md +33 -1
  59. package/src/headers/accept-encoding.ts +2 -0
  60. package/src/headers/accept-language.ts +2 -0
  61. package/src/headers/accept.ts +2 -0
  62. package/src/headers/cache-control.ts +2 -0
  63. package/src/headers/content-disposition.ts +2 -0
  64. package/src/headers/content-range.ts +2 -0
  65. package/src/headers/content-type.ts +2 -0
  66. package/src/headers/cookie.ts +2 -0
  67. package/src/headers/if-match.ts +2 -0
  68. package/src/headers/if-none-match.ts +2 -0
  69. package/src/headers/if-range.ts +2 -0
  70. package/src/headers/range.ts +2 -0
  71. package/src/headers/raw-headers.ts +2 -0
  72. package/src/headers/set-cookie.ts +2 -0
  73. package/{dist/node-serve.js → src/headers/vary.ts} +1 -1
  74. package/src/node-fetch-server/README.md +1 -6
  75. package/src/node-tsx/README.md +3 -8
  76. package/src/route-pattern/README.md +18 -13
  77. package/src/session-storage-redis/README.md +1 -2
  78. package/src/test/README.md +2 -5
  79. package/src/ui/README.md +9 -7
  80. package/src/ui/anchor/README.md +11 -3
  81. package/src/ui/animation/README.md +7 -5
  82. package/src/ui/combobox/README.md +1 -1
  83. package/src/ui/menu/README.md +26 -2
  84. package/src/ui/server/README.md +4 -2
  85. package/dist/node-serve.d.ts +0 -2
  86. package/dist/node-serve.d.ts.map +0 -1
  87. package/src/node-serve/README.md +0 -253
@@ -1,253 +0,0 @@
1
- # node-serve
2
-
3
- Build high-performance Node.js servers with web-standard Fetch API primitives. Use this package when you want Remix-style `Request`/`Response` handlers with a managed server optimized for production throughput.
4
-
5
- ## Features
6
-
7
- - **Fetch API Handlers**: Serve standard [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) to [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) request handlers
8
- - **High-Performance Node.js Server**: Start a fast managed server for Fetch API application code
9
- - **HTTPS Support**: Start a TLS server with certificate and key file paths
10
- - **Managed Server Lifecycle**: Start a server with `serve()`, wait for `server.ready`, and close it with `server.close()`
11
- - **Custom Hostname**: Override the host and protocol used to construct incoming `request.url` values
12
- - **Client Info**: Access client IP address, address family, and remote port when your handler accepts a second argument
13
- - **uWebSockets.js Setup**: Register native WebSocket routes and connection filters before the Fetch fallback starts listening
14
- - **Existing uWebSockets.js App Adapter**: Use `createUwsRequestHandler()` when you already own a uWebSockets.js app
15
-
16
- ## Installation
17
-
18
- ```sh
19
- npm i remix
20
- ```
21
-
22
- `node-serve` includes uWebSockets.js as its native high-performance transport.
23
-
24
- ## Usage
25
-
26
- Use `serve()` to start a Node.js server that calls your fetch handler for every incoming request:
27
-
28
- ```ts
29
- import { serve } from 'remix/node-serve'
30
-
31
- let users = new Map([
32
- ['1', { id: '1', name: 'Alice', email: 'alice@example.com' }],
33
- ['2', { id: '2', name: 'Bob', email: 'bob@example.com' }],
34
- ])
35
-
36
- async function handler(request: Request) {
37
- let url = new URL(request.url)
38
-
39
- if (url.pathname === '/' && request.method === 'GET') {
40
- return new Response('Welcome to the User API! Try GET /api/users')
41
- }
42
-
43
- if (url.pathname === '/api/users' && request.method === 'GET') {
44
- return Response.json(Array.from(users.values()))
45
- }
46
-
47
- let userMatch = url.pathname.match(/^\/api\/users\/(\w+)$/)
48
- if (userMatch && request.method === 'GET') {
49
- let user = users.get(userMatch[1])
50
- if (user) return Response.json(user)
51
- return new Response('User not found', { status: 404 })
52
- }
53
-
54
- return new Response('Not Found', { status: 404 })
55
- }
56
-
57
- let server = serve(handler, { port: 3000 })
58
-
59
- await server.ready
60
- console.log(`Server running at http://localhost:${server.port}`)
61
- ```
62
-
63
- ### uWebSockets.js Setup
64
-
65
- Use `setup(app)` when `serve()` should still manage the server lifecycle and Fetch fallback, but you need to configure native uWebSockets.js transport features before the server starts listening. The hook runs after the app is created and before `node-serve` registers its catch-all Fetch route.
66
-
67
- This example adds a native WebSocket endpoint next to a normal Fetch handler on the same port:
68
-
69
- ```ts
70
- import { serve } from 'remix/node-serve'
71
-
72
- let server = serve(
73
- (request) => {
74
- let url = new URL(request.url)
75
-
76
- if (url.pathname === '/') {
77
- return new Response('Chat server')
78
- }
79
-
80
- return new Response('Not Found', { status: 404 })
81
- },
82
- {
83
- port: 3000,
84
- setup(app) {
85
- app.ws('/ws/chat', {
86
- open(ws) {
87
- ws.subscribe('chat')
88
- },
89
- message(ws, message, isBinary) {
90
- ws.publish('chat', message, isBinary)
91
- },
92
- })
93
- },
94
- },
95
- )
96
-
97
- await server.ready
98
- ```
99
-
100
- `app.ws(pattern, ...)` uses uWebSockets.js route patterns, not Remix `route-pattern` syntax. uWS supports simple path params such as `/rooms/:room`, and those params are available during `upgrade` through `req.getParameter('room')` or `req.getParameter(0)`. If WebSocket handlers need params, copy them into uWS user data during `upgrade`, then read them with `ws.getUserData()`:
101
-
102
- ```ts
103
- serve(handler, {
104
- setup(app) {
105
- app.ws<{ room: string }>('/rooms/:room', {
106
- upgrade(res, req, context) {
107
- res.upgrade(
108
- { room: req.getParameter('room') ?? 'general' },
109
- req.getHeader('sec-websocket-key'),
110
- req.getHeader('sec-websocket-protocol'),
111
- req.getHeader('sec-websocket-extensions'),
112
- context,
113
- )
114
- },
115
- open(ws) {
116
- ws.subscribe(`room:${ws.getUserData().room}`)
117
- },
118
- })
119
- },
120
- })
121
- ```
122
-
123
- uWS patterns do not support the full `route-pattern` feature set, including partial-segment params like `v:version`, split params like `:file.:ext`, optionals like `/api(/v:version)`, host/protocol/search matching, or named multi-segment wildcard captures like `*path`. You can use a uWS pattern like `/files/*` as a catch-all, but it does not provide Remix-style named wildcard params.
124
-
125
- You can also register connection filters for low-level transport metrics or limits:
126
-
127
- ```ts
128
- let activeConnections = 0
129
-
130
- serve(handler, {
131
- setup(app) {
132
- app.filter((_res, count) => {
133
- activeConnections = Number(count)
134
- })
135
- },
136
- })
137
- ```
138
-
139
- `app.filter()` observes low-level connection count changes. It is not Fetch response middleware and should not be used to mutate normal `Response` headers or bodies. Use Fetch handlers, middleware, or [`fetch-router`](https://github.com/remix-run/remix/tree/main/packages/fetch-router) for normal HTTP routing and response behavior; reserve `setup()` for uWebSockets.js transport features that must be configured before listening.
140
-
141
- ### Custom Request URLs
142
-
143
- Use `host` and `protocol` when your server runs behind a proxy or load balancer and you need stable incoming request URLs:
144
-
145
- ```ts
146
- import { serve } from 'remix/node-serve'
147
-
148
- let server = serve(handler, {
149
- host: process.env.HOST ?? 'api.example.com',
150
- protocol: 'https:',
151
- port: 3000,
152
- })
153
-
154
- await server.ready
155
- ```
156
-
157
- ### HTTPS
158
-
159
- Pass `tls` options to start an HTTPS server. `keyFile` and `certFile` are file paths, not PEM contents:
160
-
161
- ```ts
162
- import { serve } from 'remix/node-serve'
163
-
164
- let server = serve(handler, {
165
- port: 443,
166
- tls: {
167
- keyFile: './certs/server.key',
168
- certFile: './certs/server.crt',
169
- },
170
- })
171
-
172
- await server.ready
173
- console.log(`Server running at https://localhost:${server.port}`)
174
- ```
175
-
176
- When `tls` is present, `request.url` defaults to the `https:` protocol. You can still set `protocol` explicitly when the public URL differs from the local server transport.
177
-
178
- ### Client Information
179
-
180
- Handlers that accept a second argument receive the remote client address:
181
-
182
- ```ts
183
- import { type FetchHandler, serve } from 'remix/node-serve'
184
-
185
- let handler: FetchHandler = async (request, client) => {
186
- console.log(`Request from ${client.address}:${client.port}`)
187
-
188
- return Response.json({
189
- path: new URL(request.url).pathname,
190
- clientAddress: client.address,
191
- })
192
- }
193
-
194
- serve(handler, { port: 3000 })
195
- ```
196
-
197
- ### Existing uWebSockets.js Apps
198
-
199
- Most apps should use `serve()`. Use `createUwsRequestHandler()` when you already have a uWebSockets.js app and want only part of the app to use a Fetch API handler:
200
-
201
- This example assumes `uWebSockets.js` is also a direct dependency of your app.
202
-
203
- ```ts
204
- import { App } from 'uWebSockets.js'
205
- import { createUwsRequestHandler } from 'remix/node-serve'
206
-
207
- let app = App()
208
-
209
- async function handler(request: Request) {
210
- let url = new URL(request.url)
211
- return Response.json({ path: url.pathname })
212
- }
213
-
214
- app.get('/health', (res) => {
215
- res.end('ok')
216
- })
217
-
218
- app.any('/api/*', createUwsRequestHandler(handler))
219
-
220
- app.listen(3000, (socket) => {
221
- if (!socket) throw new Error('Could not listen on port 3000')
222
- })
223
- ```
224
-
225
- For HTTPS with an existing uWebSockets.js app, create the SSL app yourself and pass `protocol: 'https:'` when you create the request handler:
226
-
227
- ```ts
228
- import { SSLApp } from 'uWebSockets.js'
229
- import { createUwsRequestHandler } from 'remix/node-serve'
230
-
231
- let app = SSLApp({
232
- key_file_name: './certs/server.key',
233
- cert_file_name: './certs/server.crt',
234
- })
235
-
236
- app.any('/*', createUwsRequestHandler(handler, { protocol: 'https:' }))
237
- app.listen(443, (socket) => {
238
- if (!socket) throw new Error('Could not listen on port 443')
239
- })
240
- ```
241
-
242
- ## Related Packages
243
-
244
- - [`node-fetch-server`](https://github.com/remix-run/remix/tree/main/packages/node-fetch-server) - Adapt Fetch API handlers to existing `node:http`, `node:https`, and `node:http2` servers
245
- - [`fetch-router`](https://github.com/remix-run/remix/tree/main/packages/fetch-router) - Route incoming `Request` objects to Fetch API handlers
246
-
247
- ## Related Work
248
-
249
- - [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) - Web standard `Request` and `Response` primitives
250
-
251
- ## License
252
-
253
- See [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)