spiceflow 1.19.0 → 1.20.0-rsc.1
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.
- package/README.md +199 -49
- package/dist/any-spiceflow-types.test.js +16 -8
- package/dist/any-spiceflow-types.test.js.map +1 -1
- package/dist/context.d.ts +13 -7
- package/dist/context.d.ts.map +1 -1
- package/dist/federation.default.d.ts +1 -0
- package/dist/federation.default.d.ts.map +1 -1
- package/dist/federation.default.js +1 -0
- package/dist/federation.default.js.map +1 -1
- package/dist/federation.rsc.d.ts +2 -0
- package/dist/federation.rsc.d.ts.map +1 -1
- package/dist/federation.rsc.js +10 -0
- package/dist/federation.rsc.js.map +1 -1
- package/dist/react/context.d.ts +2 -1
- package/dist/react/context.d.ts.map +1 -1
- package/dist/react/context.js +4 -4
- package/dist/react/context.js.map +1 -1
- package/dist/react/entry.client.js +17 -8
- package/dist/react/entry.client.js.map +1 -1
- package/dist/react/entry.ssr.d.ts +1 -1
- package/dist/react/entry.ssr.d.ts.map +1 -1
- package/dist/react/entry.ssr.js +11 -9
- package/dist/react/entry.ssr.js.map +1 -1
- package/dist/react/errors.d.ts +1 -13
- package/dist/react/errors.d.ts.map +1 -1
- package/dist/react/errors.js.map +1 -1
- package/dist/react/flight-data-context.d.ts +6 -1
- package/dist/react/flight-data-context.d.ts.map +1 -1
- package/dist/react/flight-data-context.js.map +1 -1
- package/dist/react/flight-data-context.rsc.d.ts +6 -1
- package/dist/react/flight-data-context.rsc.d.ts.map +1 -1
- package/dist/react/flight-data-context.rsc.js.map +1 -1
- package/dist/react/link.d.ts +2 -2
- package/dist/react/link.d.ts.map +1 -1
- package/dist/react/router-ssr.test.js +17 -2
- package/dist/react/router-ssr.test.js.map +1 -1
- package/dist/react/router.d.ts +1 -1
- package/dist/react/router.d.ts.map +1 -1
- package/dist/react/router.js +10 -4
- package/dist/react/router.js.map +1 -1
- package/dist/react/router.rsc.d.ts +1 -1
- package/dist/react/router.rsc.d.ts.map +1 -1
- package/dist/react/router.rsc.js +3 -1
- package/dist/react/router.rsc.js.map +1 -1
- package/dist/router-context-conditions.test.d.ts +2 -0
- package/dist/router-context-conditions.test.d.ts.map +1 -0
- package/dist/router-context-conditions.test.js +20 -0
- package/dist/router-context-conditions.test.js.map +1 -0
- package/dist/router-context.d.ts +2 -7
- package/dist/router-context.d.ts.map +1 -1
- package/dist/router-context.js.map +1 -1
- package/dist/spiceflow.d.ts +9 -9
- package/dist/spiceflow.d.ts.map +1 -1
- package/dist/spiceflow.js.map +1 -1
- package/dist/type-repros/loader-data-context.test.d.ts +2 -0
- package/dist/type-repros/loader-data-context.test.d.ts.map +1 -0
- package/dist/type-repros/loader-data-context.test.js +86 -0
- package/dist/type-repros/loader-data-context.test.js.map +1 -0
- package/dist/type-repros/registered-app-circular.test.d.ts +2 -0
- package/dist/type-repros/registered-app-circular.test.d.ts.map +1 -0
- package/dist/type-repros/registered-app-circular.test.js +82 -0
- package/dist/type-repros/registered-app-circular.test.js.map +1 -0
- package/dist/types.d.ts +7 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +0 -16
- package/dist/vite.js.map +1 -1
- package/package.json +4 -4
- package/src/any-spiceflow-types.test.ts +16 -8
- package/src/context.ts +38 -11
- package/src/federation.default.ts +1 -0
- package/src/federation.rsc.ts +20 -0
- package/src/react/context.tsx +9 -7
- package/src/react/entry.client.tsx +26 -8
- package/src/react/entry.ssr.tsx +14 -20
- package/src/react/errors.tsx +2 -50
- package/src/react/flight-data-context.rsc.ts +9 -3
- package/src/react/flight-data-context.tsx +7 -1
- package/src/react/link.tsx +2 -2
- package/src/react/router-ssr.test.tsx +29 -5
- package/src/react/router.rsc.ts +5 -3
- package/src/react/router.tsx +13 -10
- package/src/router-context-conditions.test.ts +23 -0
- package/src/router-context.ts +2 -7
- package/src/spiceflow.tsx +47 -9
- package/src/type-repros/loader-data-context.test.ts +98 -0
- package/src/type-repros/registered-app-circular.test.ts +101 -0
- package/src/types.ts +9 -4
- package/src/vite.tsx +0 -16
package/README.md
CHANGED
|
@@ -851,6 +851,88 @@ The `preventProcessExitIfBusy` middleware prevents platforms like Fly.io from ki
|
|
|
851
851
|
|
|
852
852
|
Spiceflow has built-in OpenTelemetry tracing. Pass a `tracer` to the constructor and every request gets automatic spans for middleware, handlers, loaders, layouts, pages, and RSC serialization. Set `serverTiming: true` too if you want those spans exposed as a `Server-Timing` response header in Chrome DevTools, with nested descriptions like `handler - /users/:id > db.query`. Zero overhead when disabled. Handlers can also read `traceId` and `spanId` from `span.spanContext?.()` when the tracer supports it. See [Tracing docs](docs/tracing.md) for setup, span trees, custom spans, and examples.
|
|
853
853
|
|
|
854
|
+
## Observability with Strada
|
|
855
|
+
|
|
856
|
+
[Strada](https://strada.sh) is an OpenTelemetry backend with error tracking, logs, traces, metrics, analytics, and a SQL CLI. Use `@strada.sh/sdk` to configure OTel once, pass its tracer to Spiceflow, then use the same SDK for logs and handled exceptions.
|
|
857
|
+
|
|
858
|
+
Create a project first, or list existing projects to find the project ID:
|
|
859
|
+
|
|
860
|
+
```bash
|
|
861
|
+
strada database create
|
|
862
|
+
strada projects create my-api
|
|
863
|
+
|
|
864
|
+
# Later, find the project ID and ingest endpoint again
|
|
865
|
+
strada projects list
|
|
866
|
+
```
|
|
867
|
+
|
|
868
|
+
Install Strada in your Spiceflow app:
|
|
869
|
+
|
|
870
|
+
```bash
|
|
871
|
+
npm install @strada.sh/sdk
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
Then initialize Strada before creating the Spiceflow app:
|
|
875
|
+
|
|
876
|
+
```ts
|
|
877
|
+
import { Spiceflow } from 'spiceflow'
|
|
878
|
+
import {
|
|
879
|
+
SpanStatusCode,
|
|
880
|
+
captureException,
|
|
881
|
+
getLogger,
|
|
882
|
+
initStrada,
|
|
883
|
+
trace,
|
|
884
|
+
} from '@strada.sh/sdk'
|
|
885
|
+
|
|
886
|
+
initStrada({
|
|
887
|
+
projectId: process.env.STRADA_PROJECT_ID!,
|
|
888
|
+
service: 'api',
|
|
889
|
+
environment: process.env.NODE_ENV ?? 'development',
|
|
890
|
+
enabled: !import.meta.hot,
|
|
891
|
+
})
|
|
892
|
+
|
|
893
|
+
// enabled: false keeps OTel APIs local but sends nothing to ingest.
|
|
894
|
+
// In Vite/RSC dev servers, import.meta.hot is truthy during HMR.
|
|
895
|
+
|
|
896
|
+
const tracer = trace.getTracer('api')
|
|
897
|
+
const logger = getLogger('api')
|
|
898
|
+
|
|
899
|
+
export const app = new Spiceflow({ tracer, serverTiming: true })
|
|
900
|
+
.get('/api/users/:id', async ({ params, span, tracer }) => {
|
|
901
|
+
span.setAttribute('user.id', params.id)
|
|
902
|
+
logger.info({ message: 'loading user', userId: params.id })
|
|
903
|
+
|
|
904
|
+
return tracer.startActiveSpan('db.find-user', async (dbSpan) => {
|
|
905
|
+
try {
|
|
906
|
+
dbSpan.setAttribute('db.operation', 'SELECT')
|
|
907
|
+
return { id: params.id, name: 'Alice' }
|
|
908
|
+
} finally {
|
|
909
|
+
dbSpan.end()
|
|
910
|
+
}
|
|
911
|
+
})
|
|
912
|
+
})
|
|
913
|
+
.onError(({ error, path, span }) => {
|
|
914
|
+
captureException(error, { tags: { path } })
|
|
915
|
+
span.recordException(error)
|
|
916
|
+
span.setStatus({ code: SpanStatusCode.ERROR })
|
|
917
|
+
|
|
918
|
+
logger.error({
|
|
919
|
+
message: 'request failed',
|
|
920
|
+
path,
|
|
921
|
+
error: error instanceof Error ? error.message : String(error),
|
|
922
|
+
})
|
|
923
|
+
|
|
924
|
+
return new Response('An error occurred', { status: 500 })
|
|
925
|
+
})
|
|
926
|
+
```
|
|
927
|
+
|
|
928
|
+
The Spiceflow request spans, custom child spans, logs, and `captureException()` calls all flow to the same Strada project. Use the CLI to inspect them:
|
|
929
|
+
|
|
930
|
+
```bash
|
|
931
|
+
strada issues list -p my-api --since 24h
|
|
932
|
+
strada logs -p my-api --since 1h
|
|
933
|
+
strada query "SELECT count() FROM otel_traces" -p my-api
|
|
934
|
+
```
|
|
935
|
+
|
|
854
936
|
## React Framework (RSC)
|
|
855
937
|
|
|
856
938
|
Spiceflow includes a full-stack React framework built on React Server Components (RSC). It uses Vite with `@vitejs/plugin-rsc` under the hood. Server components run on the server by default, and you use `"use client"` to mark interactive components that need to run in the browser.
|
|
@@ -1261,12 +1343,15 @@ export function Counter() {
|
|
|
1261
1343
|
|
|
1262
1344
|
Loaders run on the server before page and layout handlers. They solve a common problem: when you need the same data in both server components and client components, or in both a layout and a page, without prop drilling or React context.
|
|
1263
1345
|
|
|
1346
|
+
Prefer putting route data in loaders when that data is shared by more than one part of the route tree. This keeps fetching in one place, avoids fetching the same data once in a layout and again in a page, and lets React components read the current route data directly instead of receiving long prop chains.
|
|
1347
|
+
|
|
1264
1348
|
Loaders only run for requests that also match a `.page()` or `.layout()`. They are not standalone endpoints. If you want to serve content without rendering a page or layout, use `.get()`, `.route()`, or another API handler instead.
|
|
1265
1349
|
|
|
1266
1350
|
```tsx
|
|
1267
1351
|
export const app = new Spiceflow()
|
|
1268
|
-
|
|
1269
|
-
|
|
1352
|
+
.page('/login', async () => <Login />)
|
|
1353
|
+
// Auth loader for the dashboard route
|
|
1354
|
+
.loader('/dashboard', async ({ request, redirect }) => {
|
|
1270
1355
|
const user = await getUser(request.headers.get('cookie'))
|
|
1271
1356
|
if (!user) throw redirect('/login')
|
|
1272
1357
|
return { user }
|
|
@@ -1276,8 +1361,8 @@ export const app = new Spiceflow()
|
|
|
1276
1361
|
const stats = await getStats()
|
|
1277
1362
|
return { stats }
|
|
1278
1363
|
})
|
|
1279
|
-
.layout('
|
|
1280
|
-
// loaderData.user is available here from the
|
|
1364
|
+
.layout('/dashboard', async ({ loaderData, children }) => {
|
|
1365
|
+
// loaderData.user is available here from the dashboard loader
|
|
1281
1366
|
return (
|
|
1282
1367
|
<html>
|
|
1283
1368
|
<body>
|
|
@@ -1288,14 +1373,57 @@ export const app = new Spiceflow()
|
|
|
1288
1373
|
)
|
|
1289
1374
|
})
|
|
1290
1375
|
.page('/dashboard', async ({ loaderData }) => {
|
|
1291
|
-
// Both loaders matched
|
|
1376
|
+
// Both loaders matched, data is merged by specificity
|
|
1292
1377
|
// loaderData = { user: ..., stats: ... }
|
|
1293
1378
|
return <Dashboard user={loaderData.user} stats={loaderData.stats} />
|
|
1294
1379
|
})
|
|
1295
1380
|
```
|
|
1296
1381
|
|
|
1382
|
+
A Remix-style dashboard can put shared shell data in a parent loader, then page data in loaders placed next to each page. The layout, page, and client components all read from the same request-scoped loader data:
|
|
1383
|
+
|
|
1384
|
+
```tsx
|
|
1385
|
+
export const app = new Spiceflow()
|
|
1386
|
+
.loader('/dashboard/*', async ({ request }) => {
|
|
1387
|
+
const user = await getUser(request)
|
|
1388
|
+
const projects = await getProjects(user.id)
|
|
1389
|
+
return { user, projects }
|
|
1390
|
+
})
|
|
1391
|
+
.layout('/dashboard/*', async ({ children, loaderData }) => {
|
|
1392
|
+
return <DashboardShell user={loaderData.user}>{children}</DashboardShell>
|
|
1393
|
+
})
|
|
1394
|
+
.loader('/dashboard/projects/:id', async ({ params }) => {
|
|
1395
|
+
const project = await getProject(params.id)
|
|
1396
|
+
return { project }
|
|
1397
|
+
})
|
|
1398
|
+
.page('/dashboard/projects/:id', async () => {
|
|
1399
|
+
return <ProjectPage />
|
|
1400
|
+
})
|
|
1401
|
+
|
|
1402
|
+
declare module 'spiceflow/react' {
|
|
1403
|
+
interface SpiceflowRegister { app: typeof app }
|
|
1404
|
+
}
|
|
1405
|
+
```
|
|
1406
|
+
|
|
1407
|
+
```tsx
|
|
1408
|
+
'use client'
|
|
1409
|
+
|
|
1410
|
+
import { useLoaderData } from 'spiceflow/react'
|
|
1411
|
+
|
|
1412
|
+
export function ProjectSwitcher() {
|
|
1413
|
+
const { projects } = useLoaderData('/dashboard/*')
|
|
1414
|
+
return projects.map((project) => <a href={project.href}>{project.name}</a>)
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
export function ProjectHeader() {
|
|
1418
|
+
const { user, project } = useLoaderData('/dashboard/projects/:id')
|
|
1419
|
+
return <h1>{project.name} for {user.name}</h1>
|
|
1420
|
+
}
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1297
1423
|
When multiple loaders match a route (e.g. `/*` and `/dashboard` both match `/dashboard`), their return values are merged into a single flat object. More specific loaders override less specific ones on key conflicts.
|
|
1298
1424
|
|
|
1425
|
+
Loader data is type safe when the app is registered globally with `SpiceflowRegister`. `useLoaderData('/dashboard/projects/:id')` and `router.getLoaderData('/dashboard/projects/:id')` infer the merged object returned by every matching loader, so renaming a loader field or removing it becomes a TypeScript error in every component that reads it.
|
|
1426
|
+
|
|
1299
1427
|
**Serialization**: loader return values are serialized through the React RSC flight format, not JSON. You can return JSX (including server components and client component elements with their props), `Promise`, async iterators, `Map`, `Set`, `Date`, `BigInt`, typed arrays, and any client component reference — all deserialized faithfully on the client. This means a loader can return a fully rendered `<Sidebar user={user} />` element and another component can receive it as `loaderData.sidebar` and drop it into the tree.
|
|
1300
1428
|
|
|
1301
1429
|
**Reading loader data in client components** uses the `useLoaderData` hook from `spiceflow/react`:
|
|
@@ -1364,11 +1492,33 @@ Spiceflow already parallelizes at the framework level — all matched loaders ru
|
|
|
1364
1492
|
|
|
1365
1493
|
Forms use React 19's `<form action>` with server functions marked `"use server"`. They work before JavaScript loads (progressive enhancement).
|
|
1366
1494
|
|
|
1495
|
+
Forms also support normal browser submissions when `action` is a string URL. This is standard HTML behavior in Spiceflow: the browser submits the form to the URL and performs a full document navigation.
|
|
1496
|
+
|
|
1497
|
+
```tsx
|
|
1498
|
+
.page('/search', async () => {
|
|
1499
|
+
return (
|
|
1500
|
+
<form method="get" action="/results">
|
|
1501
|
+
<input name="q" />
|
|
1502
|
+
<button type="submit">Search</button>
|
|
1503
|
+
</form>
|
|
1504
|
+
)
|
|
1505
|
+
})
|
|
1506
|
+
```
|
|
1507
|
+
|
|
1508
|
+
Prefer a server or client action when the form should feel app-like. Passing a function to `action` lets React handle submission in a transition instead of doing a full browser reload. A server action can mutate data, then automatically re-render the current page with fresh server data or throw the handler context `redirect` to navigate. A client action can update local state, call APIs, or schedule a client navigation with `router.push()` / `router.replace()`.
|
|
1509
|
+
|
|
1510
|
+
```tsx
|
|
1511
|
+
<form action={saveSettings}>
|
|
1512
|
+
<input name="name" />
|
|
1513
|
+
<Button type="submit">Save</Button>
|
|
1514
|
+
</form>
|
|
1515
|
+
```
|
|
1516
|
+
|
|
1367
1517
|
**Every server action call automatically re-renders the current page with fresh server data.** This applies to forms, client wrapper functions, and direct imported server action calls. The re-render happens via React reconciliation, so client component state is preserved. No manual `router.refresh()` needed after a server action.
|
|
1368
1518
|
|
|
1369
1519
|
Every submit button should show a loading state while its form action is in progress. Use `useFormStatus` from `react-dom` in your Button component to auto-detect pending forms — the button shows a spinner automatically when it's inside a `<form>` with a pending action:
|
|
1370
1520
|
|
|
1371
|
-
Prefer file-level `"use server"` (a dedicated file like `src/actions.tsx`) over inline `"use server"` inside function bodies. Inline is fine for simple form actions defined directly in a server component page,
|
|
1521
|
+
Prefer file-level `"use server"` (a dedicated file like `src/actions.tsx`) over inline `"use server"` inside function bodies. Inline is fine for simple form actions defined directly in a server component page, or when the action needs the handler context `redirect`. If you find yourself passing actions as props to client components, import them from a `"use server"` file instead — it keeps action logic centralized and reusable.
|
|
1372
1522
|
|
|
1373
1523
|
```tsx
|
|
1374
1524
|
// src/app/button.tsx
|
|
@@ -1390,13 +1540,14 @@ Then use it in forms — no manual loading state needed. Use `parseFormData` to
|
|
|
1390
1540
|
|
|
1391
1541
|
```tsx
|
|
1392
1542
|
import { z } from 'zod'
|
|
1393
|
-
import {
|
|
1543
|
+
import { parseFormData } from 'spiceflow'
|
|
1394
1544
|
import { Button } from './app/button'
|
|
1395
1545
|
|
|
1396
1546
|
const subscribeSchema = z.object({ email: z.string().email() })
|
|
1397
1547
|
const fields = subscribeSchema.keyof().enum
|
|
1398
1548
|
|
|
1399
|
-
.page('/
|
|
1549
|
+
.page('/thank-you', async () => <ThankYou />)
|
|
1550
|
+
.page('/subscribe', async ({ redirect }) => {
|
|
1400
1551
|
async function subscribe(formData: FormData) {
|
|
1401
1552
|
'use server'
|
|
1402
1553
|
const { email } = parseFormData(subscribeSchema, formData)
|
|
@@ -1640,43 +1791,37 @@ function DeleteButton({ id }: { id: string }) {
|
|
|
1640
1791
|
|
|
1641
1792
|
### Redirecting After Actions
|
|
1642
1793
|
|
|
1643
|
-
When a server action needs to navigate to a different page (e.g. after creating a resource), use `
|
|
1794
|
+
When a server action needs to navigate to a different page (e.g. after creating a resource), use the handler context `redirect` inside the action instead of `router.push()` on the client. Since every server action triggers a page re-render, calling `router.push()` after the action would briefly flash the re-rendered current page before navigating away.
|
|
1644
1795
|
|
|
1645
1796
|
```tsx
|
|
1646
|
-
|
|
1647
|
-
'use server'
|
|
1648
|
-
|
|
1797
|
+
import { Spiceflow, parseFormData } from 'spiceflow'
|
|
1649
1798
|
import { z } from 'zod'
|
|
1650
|
-
import { redirect, parseFormData } from 'spiceflow'
|
|
1651
|
-
|
|
1652
|
-
export const projectSchema = z.object({ name: z.string().min(1) })
|
|
1653
|
-
|
|
1654
|
-
export async function createProject(orgId: string, formData: FormData) {
|
|
1655
|
-
const { name } = parseFormData(projectSchema, formData)
|
|
1656
|
-
const project = await db.projects.create({ name, orgId })
|
|
1657
|
-
throw redirect(`/orgs/${orgId}/projects/${project.id}`)
|
|
1658
|
-
}
|
|
1659
|
-
```
|
|
1660
|
-
|
|
1661
|
-
```tsx
|
|
1662
|
-
// src/app/create-project.tsx
|
|
1663
|
-
'use client'
|
|
1664
|
-
|
|
1665
|
-
import { ErrorBoundary } from 'spiceflow/react'
|
|
1666
|
-
import { createProject, projectSchema } from '../actions'
|
|
1667
1799
|
|
|
1800
|
+
const projectSchema = z.object({ name: z.string().min(1) })
|
|
1668
1801
|
const fields = projectSchema.keyof().enum
|
|
1669
1802
|
|
|
1670
|
-
export
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1803
|
+
export const app = new Spiceflow()
|
|
1804
|
+
.page('/orgs/:orgId/projects/:projectId', async ({ params }) => {
|
|
1805
|
+
const project = await db.projects.find(params.projectId)
|
|
1806
|
+
return <ProjectPage project={project} />
|
|
1807
|
+
})
|
|
1808
|
+
.page('/orgs/:orgId/projects/new', async ({ params, redirect }) => {
|
|
1809
|
+
async function createProject(formData: FormData) {
|
|
1810
|
+
'use server'
|
|
1811
|
+
const { name } = parseFormData(projectSchema, formData)
|
|
1812
|
+
const project = await db.projects.create({ name, orgId: params.orgId })
|
|
1813
|
+
throw redirect('/orgs/:orgId/projects/:projectId', {
|
|
1814
|
+
params: { orgId: params.orgId, projectId: project.id },
|
|
1815
|
+
})
|
|
1816
|
+
}
|
|
1817
|
+
|
|
1818
|
+
return (
|
|
1819
|
+
<form action={createProject}>
|
|
1674
1820
|
<input name={fields.name} required />
|
|
1675
1821
|
<button type="submit">Create</button>
|
|
1676
1822
|
</form>
|
|
1677
|
-
|
|
1678
|
-
)
|
|
1679
|
-
}
|
|
1823
|
+
)
|
|
1824
|
+
})
|
|
1680
1825
|
```
|
|
1681
1826
|
|
|
1682
1827
|
`router.push()`, `router.replace()`, `router.back()`, `router.forward()`, and `router.go()` are still the right choice for pure client-side navigation that doesn't involve a server action (e.g. tab switches, select dropdowns, back buttons). These APIs are all fire-and-forget — do not build awaitable wrappers around navigation commits and then call them inside a React client form action.
|
|
@@ -1872,7 +2017,7 @@ declare module 'spiceflow/react' {
|
|
|
1872
2017
|
}
|
|
1873
2018
|
```
|
|
1874
2019
|
|
|
1875
|
-
After this, **all typed APIs** are fully typed everywhere
|
|
2020
|
+
After this, **all typed APIs** are fully typed everywhere, no generics needed:
|
|
1876
2021
|
|
|
1877
2022
|
```tsx
|
|
1878
2023
|
// spiceflow/react exports
|
|
@@ -2023,12 +2168,13 @@ Each yielded element — whether a text paragraph, a weather card, or a stock ch
|
|
|
2023
2168
|
|
|
2024
2169
|
### Redirects and Not Found
|
|
2025
2170
|
|
|
2026
|
-
Use `redirect
|
|
2171
|
+
Use the handler context `redirect` and `response.status` inside `.page()` and `.layout()` handlers to control navigation and HTTP status codes:
|
|
2027
2172
|
|
|
2028
2173
|
```tsx
|
|
2029
|
-
import { Spiceflow
|
|
2174
|
+
import { Spiceflow } from 'spiceflow'
|
|
2030
2175
|
|
|
2031
2176
|
export const app = new Spiceflow()
|
|
2177
|
+
.page('/login', async () => <Login />)
|
|
2032
2178
|
.layout('/*', async ({ children, request }) => {
|
|
2033
2179
|
// When no page matches, children is null — render a custom 404
|
|
2034
2180
|
return (
|
|
@@ -2037,7 +2183,7 @@ export const app = new Spiceflow()
|
|
|
2037
2183
|
</AppLayout>
|
|
2038
2184
|
)
|
|
2039
2185
|
})
|
|
2040
|
-
.page('/dashboard', async ({ request }) => {
|
|
2186
|
+
.page('/dashboard', async ({ request, redirect }) => {
|
|
2041
2187
|
const user = await getUser(request)
|
|
2042
2188
|
if (!user) {
|
|
2043
2189
|
throw redirect('/login')
|
|
@@ -2054,7 +2200,7 @@ export const app = new Spiceflow()
|
|
|
2054
2200
|
})
|
|
2055
2201
|
// Layouts can throw redirect — useful for auth guards that protect
|
|
2056
2202
|
// an entire section of your app
|
|
2057
|
-
.layout('/admin/*', async ({ children, request }) => {
|
|
2203
|
+
.layout('/admin/*', async ({ children, request, redirect }) => {
|
|
2058
2204
|
const user = await getUser(request)
|
|
2059
2205
|
if (!user?.isAdmin) {
|
|
2060
2206
|
throw redirect('/login')
|
|
@@ -2065,15 +2211,19 @@ export const app = new Spiceflow()
|
|
|
2065
2211
|
export type App = typeof app
|
|
2066
2212
|
```
|
|
2067
2213
|
|
|
2068
|
-
`redirect()` accepts an optional second argument for custom status codes and headers:
|
|
2214
|
+
Context `redirect()` accepts an optional second argument for custom status codes and headers:
|
|
2069
2215
|
|
|
2070
2216
|
```tsx
|
|
2071
2217
|
// 301 permanent redirect
|
|
2072
|
-
|
|
2218
|
+
.page('/old-login', async ({ redirect }) => {
|
|
2219
|
+
throw redirect('/login', { status: 301 })
|
|
2220
|
+
})
|
|
2073
2221
|
|
|
2074
2222
|
// Redirect with custom headers
|
|
2075
|
-
|
|
2076
|
-
|
|
2223
|
+
.page('/logout', async ({ redirect }) => {
|
|
2224
|
+
throw redirect('/login', {
|
|
2225
|
+
headers: { 'set-cookie': 'session=; Max-Age=0' },
|
|
2226
|
+
})
|
|
2077
2227
|
})
|
|
2078
2228
|
```
|
|
2079
2229
|
|
|
@@ -2084,25 +2234,25 @@ throw redirect('/login', {
|
|
|
2084
2234
|
|
|
2085
2235
|
**Correct HTTP status codes.** Unlike Next.js, where redirects always return a 200 status with client-side handling, Spiceflow returns the actual HTTP status code in the response — `307` for redirects (with a `Location` header) and whatever you set via `response.status` for pages. This works even when the throw happens after an `await`, because the SSR layer intercepts the error from the RSC stream before flushing the HTML response. Search engines see correct status codes, and `fetch()` calls with `redirect: "manual"` get the real `307` response.
|
|
2086
2236
|
|
|
2087
|
-
**Client-side navigation.** When a user clicks a `<Link>` that navigates to a page throwing `redirect()`, the router performs the redirect client-side without a full page reload.
|
|
2237
|
+
**Client-side navigation.** When a user clicks a `<Link>` that navigates to a page throwing context `redirect()`, the router performs the redirect client-side without a full page reload.
|
|
2088
2238
|
|
|
2089
2239
|
</details>
|
|
2090
2240
|
|
|
2091
2241
|
<details>
|
|
2092
2242
|
<summary>Authentication: pages vs API routes</summary>
|
|
2093
2243
|
|
|
2094
|
-
Pages and layouts should always `throw redirect('/login')` when the user is not authenticated. API routes (`.get()`, `.post()`, etc.) should return a JSON error with a 401 status instead. This keeps the experience clean: users visiting a protected page get redirected to login instead of seeing a raw JSON blob, while API consumers get a proper typed error response they can handle programmatically.
|
|
2244
|
+
Pages and layouts should always `throw redirect('/login')` from handler context when the user is not authenticated. API routes (`.get()`, `.post()`, etc.) should return a JSON error with a 401 status instead. This keeps the experience clean: users visiting a protected page get redirected to login instead of seeing a raw JSON blob, while API consumers get a proper typed error response they can handle programmatically.
|
|
2095
2245
|
|
|
2096
2246
|
```tsx
|
|
2097
2247
|
// Page — redirect to login
|
|
2098
|
-
.page('/dashboard', async ({ request }) => {
|
|
2248
|
+
.page('/dashboard', async ({ request, redirect }) => {
|
|
2099
2249
|
const user = await getUser(request)
|
|
2100
2250
|
if (!user) throw redirect('/login')
|
|
2101
2251
|
return <Dashboard user={user} />
|
|
2102
2252
|
})
|
|
2103
2253
|
|
|
2104
2254
|
// Layout — redirect to login (protects all nested pages)
|
|
2105
|
-
.layout('/app/*', async ({ children, request }) => {
|
|
2255
|
+
.layout('/app/*', async ({ children, request, redirect }) => {
|
|
2106
2256
|
const user = await getUser(request)
|
|
2107
2257
|
if (!user) throw redirect('/login')
|
|
2108
2258
|
return <AppLayout>{children}</AppLayout>
|
|
@@ -353,14 +353,28 @@ test('Link: typed app validates href paths and requires params', () => {
|
|
|
353
353
|
// @ts-expect-error - wrong param key rejected
|
|
354
354
|
expectLink({ href: '/users/:id', params: { slug: '1' } });
|
|
355
355
|
});
|
|
356
|
-
test('redirect is typed
|
|
356
|
+
test('exported redirect accepts plain strings while context redirect is typed', () => {
|
|
357
357
|
const diagnostics = getDiagnosticsForSnippet(`
|
|
358
358
|
import { Spiceflow } from './spiceflow.tsx'
|
|
359
359
|
import { redirect } from './react/index.ts'
|
|
360
360
|
|
|
361
361
|
const app = new Spiceflow()
|
|
362
362
|
.page('/login', async () => 'login')
|
|
363
|
-
.page('/users/:id', async () =>
|
|
363
|
+
.page('/users/:id', async ({ redirect: routeRedirect }) => {
|
|
364
|
+
routeRedirect('/login')
|
|
365
|
+
routeRedirect('/users/:id', { params: { id: '42' } })
|
|
366
|
+
|
|
367
|
+
// @ts-expect-error missing params
|
|
368
|
+
routeRedirect('/users/:id')
|
|
369
|
+
|
|
370
|
+
// @ts-expect-error wrong param key
|
|
371
|
+
routeRedirect('/users/:id', { params: { slug: '1' } })
|
|
372
|
+
|
|
373
|
+
// @ts-expect-error invalid literal path
|
|
374
|
+
routeRedirect('/missing')
|
|
375
|
+
|
|
376
|
+
return 'user'
|
|
377
|
+
})
|
|
364
378
|
|
|
365
379
|
declare module './react/router.js' {
|
|
366
380
|
interface SpiceflowRegister {
|
|
@@ -373,14 +387,8 @@ redirect('/users/:id', { params: { id: '42' } })
|
|
|
373
387
|
const id = '42'
|
|
374
388
|
redirect(\`/users/\${id}\`)
|
|
375
389
|
redirect('https://example.com')
|
|
376
|
-
|
|
377
|
-
// @ts-expect-error missing params
|
|
378
390
|
redirect('/users/:id')
|
|
379
|
-
|
|
380
|
-
// @ts-expect-error wrong param key
|
|
381
391
|
redirect('/users/:id', { params: { slug: '1' } })
|
|
382
|
-
|
|
383
|
-
// @ts-expect-error invalid path
|
|
384
392
|
redirect('/missing')
|
|
385
393
|
`);
|
|
386
394
|
expect(diagnostics).toEqual([]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"any-spiceflow-types.test.js","sourceRoot":"","sources":["../src/any-spiceflow-types.test.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAQ,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE3F,OAAO,EAAgB,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAA;AAGrE,SAAS,wBAAwB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAA;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAA;IAEpE,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAElC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnE,MAAM,YAAY,GAAG,EAAE,CAAC,0BAA0B,CAChD,UAAU,CAAC,MAAM,EACjB,EAAE,CAAC,GAAG,EACN,OAAO,CAAC,YAAY,CAAC,EACrB,EAAE,MAAM,EAAE,IAAI,EAAE,EAChB,YAAY,CACb,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;YAC/B,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,OAAO,EAAE,YAAY,CAAC,OAAO;SAC9B,CAAC,CAAA;QAEF,OAAO,EAAE;aACN,qBAAqB,CAAC,OAAO,CAAC;aAC9B,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC;aACjE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,4BAA4B,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;IACvF,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,gFAAgF;IAChF,0EAA0E;IAC1E,0DAA0D;IAC1D,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC;SACnC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC;SAC3C,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzE,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;SACtC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;SACzC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAA;IAElE,MAAM,WAAW,GAAG,SAAS,EAAc,CAAA;IAE3C,wBAAwB;IACxB,2CAA2C;IAC3C,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAEhC,sDAAsD;IACtD,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAE9B,8CAA8C;IAC9C,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAE7C,uBAAuB;IACvB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACzD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACvD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACtE,MAAM,CACJ,WAAW,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CACrF,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;AAC9B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;SACvC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;SACpE,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,MAAM,GAAiB,GAAG,CAAA;IAEhC,yEAAyE;IACzE,MAAM,WAAW,GAAG,oBAAoB,CAAC,uBAAuB,CAAC,CAAA;IACjE,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,qBAAqB,CAAC,uBAAuB,CAAC,CAAA;IAClE,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;IAE7B,SAAS,wBAAwB;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;YACzB,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;SACpB,CAAC,CAAA;QACF,MAAM,WAAW,GAAkC,IAAI,CAAA;QACvD,KAAK,WAAW,CAAA;QAEhB,KAAK,UAAU,UAAU;YACvB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAA;YAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAA;QACrB,CAAC;QAED,UAAU,CAAA;IACZ,CAAC;IAED,SAAS,+BAA+B;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,EAAE;YAC5C,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAChC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;YAClB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SACzB,CAAC,CAAA;QACF,MAAM,WAAW,GAAkC,IAAI,CAAA;QACvD,KAAK,WAAW,CAAA;QAEhB,KAAK,UAAU,UAAU;YACvB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAA;YAC1B,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAA;QACvB,CAAC;QAED,UAAU,CAAA;IACZ,CAAC;IAED,SAAS,8BAA8B;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAC/C,EAAE,SAAS,EAAE,IAAI,EAAE,EACnB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAC/B,CAAA;QACD,MAAM,SAAS,GAA0C,IAAI,CAAA;QAC7D,KAAK,SAAS,CAAA;QAEd,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;YACxB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAA;QACpC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,qCAAqC;QAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACtD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;SAC3B,CAAC,CAAA;QACF,MAAM,SAAS,GAA0C,IAAI,CAAA;QAC7D,KAAK,SAAS,CAAA;QAEd,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,yBAAyB;QAChC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAA;QAC5B,MAAM,SAAS,GAAuB,IAAI,CAAA;QAC1C,KAAK,SAAS,CAAA;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,uBAAuB;QAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAA;QAC5C,MAAM,SAAS,GAAuB,IAAI,CAAA;QAC1C,KAAK,SAAS,CAAA;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,2BAA2B;QAClC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAA;QAC9B,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,gCAAgC;QAC7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAA;QAC5C,MAAM,SAAS,GAAuB,IAAI,CAAA;QAC1C,KAAK,SAAS,CAAA;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;IACxB,CAAC;IAED,KAAK,UAAU,wCAAwC;QACrD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;QAC5D,MAAM,SAAS,GAAuB,IAAI,CAAA;QAC1C,KAAK,SAAS,CAAA;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;IACxB,CAAC;IAED,wBAAwB,CAAA;IACxB,+BAA+B,CAAA;IAC/B,8BAA8B,CAAA;IAC9B,qCAAqC,CAAA;IACrC,yBAAyB,CAAA;IACzB,uBAAuB,CAAA;IACvB,2BAA2B,CAAA;IAC3B,gCAAgC,CAAA;IAChC,wCAAwC,CAAA;IAExC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5D,iCAAiC,CAClC,CAAA;IACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACnE,iCAAiC,CAClC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;IAC/C,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzE,IAAI,CAAC;QACJ,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC/C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;KAC5B,CAAC,CAAA;IAEJ,MAAM,WAAW,GAAG,IAAI,SAAS,EAAE,CAAC,IAAI,CAAC;QACvC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;KAC7B,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,SAAS,EAAc,CAAA;IAC5C,MAAM,cAAc,GAAG,SAAS,EAAsB,CAAA;IAEtD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CACvE,sBAAsB,CACvB,CAAA;IACD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7D,qBAAqB,CACtB,CAAA;IAED,8DAA8D;IAC9D,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAE9C,2EAA2E;IAC3E,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAE7C,+EAA+E;IAC/E,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAE/B,SAAS,yBAAyB;QAChC,MAAM,IAAI,GAAG,aAAa,CAAa,YAAY,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QACZ,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,qBAAqB;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAqB,QAAQ,CAAC,CAAA;QACxD,4DAA4D;QAC5D,IAAI,CAAC,QAAQ,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,0BAA0B;QACjC,MAAM,KAAK,GAAG,cAAc,EAAc,CAAA;QAC1C,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,kEAAkE;QAClE,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACxC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,yBAAyB;QACtC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;QAC3D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QACZ,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;QAEjB,YAAY,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,UAAU,2BAA2B;QACxC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACzD,4DAA4D;QAC5D,IAAI,CAAC,QAAQ,CAAA;IACf,CAAC;IAED,SAAS,4CAA4C;QACnD,wEAAwE;QACxE,MAAM,aAAa,GAAG,SAAS,EAAgB,CAAA;QAC/C,aAAa,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9D,KAAK,aAAa,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAA;IAC1D,CAAC;IAED,yBAAyB,CAAA;IACzB,qBAAqB,CAAA;IACrB,0BAA0B,CAAA;IAC1B,yBAAyB,CAAA;IACzB,2BAA2B,CAAA;IAC3B,4CAA4C,CAAA;AAC9C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,yEAAyE;IACzE,yEAAyE;IACzE,0DAA0D;IAC1D,EAAE;IACF,wEAAwE;IACxE,uEAAuE;IACvE,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC;SACnC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC7B,4DAA4D;QAC5D,MAAM,MAAM,GAAG,SAAS,EAAc,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC,CAAC;SACD,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzC,oEAAoE;QACpE,MAAM,MAAM,GAAG,SAAS,EAAc,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAA;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;SACtC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;SACzC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACnD,iEAAiE;QACjE,MAAM,MAAM,GAAG,SAAS,EAAc,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEJ,MAAM,MAAM,GAAG,SAAS,EAAc,CAAA;IAEtC,gCAAgC;IAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAC1F,oBAAoB,CACrB,CAAA;IAED,qEAAqE;IACrE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAC,wCAAwC;IACpE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA,CAAC,wCAAwC;IAE3E,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEzB,qDAAqD;IACrD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,yEAAyE;IACzE,sFAAsF;IACtF,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC;SACnC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC;SAC3C,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzE,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;SACtC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;SACzC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAA;IAGlE,MAAM,MAAM,GAAG,SAAS,EAAO,CAAA;IAE/B,gDAAgD;IAChD,qDAAqD;IACrD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAE3B,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEzB,wDAAwD;IACxD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAExC,wBAAwB;IACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAIF,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;SAClE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC5E,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,CAAA;IAEzC,MAAM,MAAM,GAAG,SAAS,EAAc,CAAA;IAEtC,SAAS,yBAAyB;QAChC,MAAM,IAAI,GAAG,aAAa,CAAa,YAAY,CAAC,CAAA;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QACf,yDAAyD;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,yBAAyB;QACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QACf,yDAAyD;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAA;IACzB,CAAC;IAED,yBAAyB,CAAA;IACzB,yBAAyB,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,wEAAwE;IACxE,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAC1C,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAA;IAClE,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACvC,MAAM,CAAC,GAAc,EAAE,CAAA;IACvB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE;SACxB,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC;SACnC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC;SAC3C,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;SACtC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAA;IAKlE,oFAAoF;IACpF,SAAS,UAAU,CAAgC,MAAgC,IAAG,CAAC;IAEvF,qBAAqB;IACrB,UAAU,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAA;IACvC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,CAAC,CAAA;IAE3C,iDAAiD;IACjD,UAAU,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACjE,UAAU,CAAC,EAAE,IAAI,EAAE,kCAA2C,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAEzG,2CAA2C;IAC3C,UAAU,CAAC,EAAE,IAAI,EAAE,cAAuB,EAAE,CAAC,CAAA;IAE7C,sDAAsD;IACtD,UAAU,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,CAAC,CAAA;IAE3C,8CAA8C;IAC9C,UAAU,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;AACpE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,WAAW,GAAG,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B9C,CAAC,CAAA;IAEA,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"any-spiceflow-types.test.js","sourceRoot":"","sources":["../src/any-spiceflow-types.test.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import type { RouteSchema, Prettify, ResolvePath, SingletonBase, GetRequestSchema } from './types.js';
|
|
1
|
+
import type { RouteSchema, Prettify, ResolvePath, SingletonBase, GetRequestSchema, AllHrefPaths, ExtractParamsFromPath, PathParamsProp } from './types.js';
|
|
2
2
|
import { SpiceflowRequest, WaitUntil } from './spiceflow.js';
|
|
3
3
|
import type { SpiceflowSpan, SpiceflowTracer } from './instrumentation.js';
|
|
4
|
-
type
|
|
4
|
+
type RedirectOptions = {
|
|
5
5
|
status?: number;
|
|
6
6
|
headers?: Record<string, string>;
|
|
7
|
+
};
|
|
8
|
+
type RedirectArgs<Path extends string> = [ExtractParamsFromPath<Path>] extends [undefined] ? [options?: RedirectOptions & PathParamsProp<Path>] : [options: RedirectOptions & PathParamsProp<Path>];
|
|
9
|
+
type RedirectAnyOptions = RedirectOptions & {
|
|
7
10
|
params?: Record<string, string | number | boolean>;
|
|
8
|
-
}
|
|
11
|
+
};
|
|
12
|
+
type ExternalRedirectLocation = `${string}://${string}` | `//${string}` | `?${string}` | `#${string}`;
|
|
13
|
+
type DynamicStringRedirect = <Location extends string>(location: string extends Location ? Location : never, options?: RedirectAnyOptions) => Response;
|
|
14
|
+
type Redirect<Paths extends string = string> = string extends Paths ? (location: string, options?: RedirectAnyOptions) => Response : (<Location extends AllHrefPaths<Paths>>(location: Location, ...rest: RedirectArgs<Location>) => Response) & ((location: ExternalRedirectLocation, options?: RedirectOptions) => Response) & DynamicStringRedirect;
|
|
9
15
|
export interface ContextResponse {
|
|
10
16
|
headers: Headers;
|
|
11
17
|
status: number;
|
|
@@ -14,12 +20,12 @@ export type ErrorContext<Path extends string = '', in out Route extends RouteSch
|
|
|
14
20
|
state: {};
|
|
15
21
|
derive: {};
|
|
16
22
|
resolve: {};
|
|
17
|
-
}> = Prettify<{
|
|
23
|
+
}, RedirectPaths extends string = string> = Prettify<{
|
|
18
24
|
query: undefined extends Route['query'] ? Record<string, string> : Route['query'];
|
|
19
25
|
params: undefined extends Route['params'] ? Path extends `${string}/${':' | '*'}${string}` ? ResolvePath<Path> : {
|
|
20
26
|
[key in string]: string;
|
|
21
27
|
} : Route['params'];
|
|
22
|
-
redirect: Redirect
|
|
28
|
+
redirect: Redirect<RedirectPaths>;
|
|
23
29
|
/**
|
|
24
30
|
* Path extracted from incoming URL
|
|
25
31
|
*
|
|
@@ -45,10 +51,10 @@ export type SpiceflowContext<Path extends string = '', in out Route extends Rout
|
|
|
45
51
|
state: {};
|
|
46
52
|
derive: {};
|
|
47
53
|
resolve: {};
|
|
48
|
-
}, LoaderData = {}> = Prettify<{
|
|
54
|
+
}, LoaderData = {}, RedirectPaths extends string = string> = Prettify<{
|
|
49
55
|
query: undefined extends Route['query'] ? Record<string, string> : Route['query'];
|
|
50
56
|
params: undefined extends Route['params'] ? Path extends `${string}/${':' | '*'}${string}` ? ResolvePath<Path> : never : Route['params'];
|
|
51
|
-
redirect: Redirect
|
|
57
|
+
redirect: Redirect<RedirectPaths>;
|
|
52
58
|
path: string;
|
|
53
59
|
request: SpiceflowRequest<GetRequestSchema<Route>>;
|
|
54
60
|
state: Singleton['state'];
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EAEb,gBAAgB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const renderToReadableStream: any;
|
|
2
|
+
export declare const renderToStaticMarkup: (...args: any[]) => Promise<string>;
|
|
2
3
|
export declare const encodeFederationPayload: (...args: any[]) => Promise<Response>;
|
|
3
4
|
export declare const renderFlightPayload: (...args: any[]) => Promise<Response>;
|
|
4
5
|
export declare const renderComponentPayload: (...args: any[]) => Promise<Response>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.default.d.ts","sourceRoot":"","sources":["../src/federation.default.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,EAAE,GAAiB,CAAA;AACtD,eAAO,MAAM,uBAAuB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA;AACzF,eAAO,MAAM,mBAAmB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA;AACrF,eAAO,MAAM,sBAAsB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"federation.default.d.ts","sourceRoot":"","sources":["../src/federation.default.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,EAAE,GAAiB,CAAA;AACtD,eAAO,MAAM,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,MAAM,CAAe,CAAA;AACpF,eAAO,MAAM,uBAAuB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA;AACzF,eAAO,MAAM,mBAAmB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA;AACrF,eAAO,MAAM,sBAAsB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAe,CAAA"}
|
|
@@ -5,6 +5,7 @@ function unavailable() {
|
|
|
5
5
|
'encodeFederationPayload must be called from a spiceflow route handler inside a Vite RSC build.');
|
|
6
6
|
}
|
|
7
7
|
export const renderToReadableStream = unavailable;
|
|
8
|
+
export const renderToStaticMarkup = unavailable;
|
|
8
9
|
export const encodeFederationPayload = unavailable;
|
|
9
10
|
export const renderFlightPayload = unavailable;
|
|
10
11
|
export const renderComponentPayload = unavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.default.js","sourceRoot":"","sources":["../src/federation.default.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gCAAgC;AAEhC,SAAS,WAAW;IAClB,MAAM,IAAI,KAAK,CACb,kFAAkF;QAChF,gGAAgG,CACnG,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAQ,WAAW,CAAA;AACtD,MAAM,CAAC,MAAM,uBAAuB,GAA0C,WAAW,CAAA;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAA0C,WAAW,CAAA;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAA0C,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"federation.default.js","sourceRoot":"","sources":["../src/federation.default.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gCAAgC;AAEhC,SAAS,WAAW;IAClB,MAAM,IAAI,KAAK,CACb,kFAAkF;QAChF,gGAAgG,CACnG,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAQ,WAAW,CAAA;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAwC,WAAW,CAAA;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAA0C,WAAW,CAAA;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAA0C,WAAW,CAAA;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAA0C,WAAW,CAAA"}
|
package/dist/federation.rsc.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { renderToReadableStream } from '#rsc-runtime';
|
|
2
3
|
export { renderToReadableStream };
|
|
4
|
+
export declare function renderToStaticMarkup(value: React.ReactNode): Promise<string>;
|
|
3
5
|
/**
|
|
4
6
|
* Renders any Flight-serializable value to a federation Response in SSE format.
|
|
5
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.rsc.d.ts","sourceRoot":"","sources":["../src/federation.rsc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"federation.rsc.d.ts","sourceRoot":"","sources":["../src/federation.rsc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAIrD,OAAO,EAAE,sBAAsB,EAAE,CAAA;AA2CjC,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,mBAIhE;AA0KD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiE/E;AAED,eAAO,MAAM,mBAAmB,gCAA0B,CAAA;AAC1D,eAAO,MAAM,sBAAsB,gCAA0B,CAAA"}
|
package/dist/federation.rsc.js
CHANGED
|
@@ -28,6 +28,16 @@ async function streamToString({ stream, signal, }) {
|
|
|
28
28
|
reader.releaseLock();
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
async function renderFlightStreamToHtml({ stream, signal, }) {
|
|
32
|
+
const flightPayload = await streamToString({ stream, signal });
|
|
33
|
+
const ssrModule = await import.meta.viteRsc.loadModule('ssr', 'index');
|
|
34
|
+
return await ssrModule.renderFlightToHtml(flightPayload);
|
|
35
|
+
}
|
|
36
|
+
export async function renderToStaticMarkup(value) {
|
|
37
|
+
return await renderFlightStreamToHtml({
|
|
38
|
+
stream: renderToReadableStream(value),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
31
41
|
function formatSSEEvent(event, data) {
|
|
32
42
|
return `event: ${event}\ndata: ${data}\n\n`;
|
|
33
43
|
}
|