Skip to content

Commit

Permalink
refactor: rename new_defineEntries to unstable_defineEntries and remo…
Browse files Browse the repository at this point in the history
…ve unused code (#1066)

following up #1043.

- [x] remove unused code
- [x] rename new_defineEntries
- [x] update docs
  • Loading branch information
dai-shi authored Dec 14, 2024
1 parent 8a54eab commit 4eb1bae
Show file tree
Hide file tree
Showing 53 changed files with 278 additions and 1,608 deletions.
4 changes: 2 additions & 2 deletions docs/guides/stream-intercept.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ import streamInterceptor from './src/middleware/stream-interceptor';
export default {
// ...
middleware: () => [
import('waku/middleware/context'),
import('./src/middleware/themePreload.js'), // + this is the one we just added
import('waku/middleware/dev-server'),
import('waku/middleware/rsc'),
import('waku/middleware/ssr'),
import('waku/middleware/handler'),
],
};
```
Expand Down
58 changes: 21 additions & 37 deletions docs/minimal-api.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,29 @@ description: The minimal Waku API for library authors.

### Server API

To use React Server Components in Waku, you need to create an `entries.tsx` file in the project root directory with a `renderEntries` function that returns a server component module.
To use React Server Components in Waku, you need to create an `entries.tsx` file in the project root directory and `defineEntries` to handle server requests.

```tsx
import { defineEntries } from 'waku/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import App from './components/App.js';

export default defineEntries(
// renderEntries
async (rscPath) => {
return {
App: <App name={rscPath || 'Waku'} />,
};
export default defineEntries({
handleRequest: async (input, { renderRsc, renderHtml }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
if (input.type === 'custom' && input.pathname === '/') {
return renderHtml({ App: <App name="Waku" /> }, <Slot id="App" />, '');
}
},
);
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});
```

The `id` parameter is the ID of the React Server Component that you want to load on the server. You specify the RSC ID from the client.
Tips for experimenting:

- `input.type === 'custom'` condition can be omitted if you don't need SSR.
- `getBuildConfig` can return `[]` if you don't need to build anything.

### Client API

Expand All @@ -34,7 +40,7 @@ This file should be `./src/main.tsx`.

```tsx
import { createRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand All @@ -61,30 +67,8 @@ const Component = () => {
};
```

### Additional Server API

In addition to the `renderEntries` function, you can also optionally specify `getBuildConfig` function in
`entries.tsx`.

```tsx
import { defineEntries } from 'waku/server';

export default defineEntries(
// renderEntries
async (rscPath) => {
return {
App: <App name={rscPath || 'Waku'} />,
};
},
// getBuildConfig
async () => {
return {
'/': {
entries: [['']],
},
};
},
);
```
### Examples

The `getBuildConfig` function is used for build-time optimization. It renders React Server Components during the build process to produce the output that will be sent to the client. Note that rendering here means to produce RSC payload not HTML content.
- [../examples/31_minimal](Minimal example)
- [../examples/34_functions](With server functions)
- [../examples/39_api](With custom API endpoints)
3 changes: 1 addition & 2 deletions docs/redirects.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ export default {
import('waku/middleware/context'),
import('./src/middleware/redirects.js'),
import('waku/middleware/dev-server'),
import('waku/middleware/rsc'),
import('waku/middleware/ssr'),
import('waku/middleware/handler'),
],
} satisfies Config;
```
Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/rsc-basic/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';

import App from './components/App.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
Expand All @@ -12,9 +12,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderRsc({ _value: value });
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/rsc-basic/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/rsc-css-modules/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';

import App from './components/App.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
Expand All @@ -12,9 +12,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderRsc({ _value: value });
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/rsc-css-modules/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
16 changes: 8 additions & 8 deletions e2e/fixtures/rsc-router/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { ReactNode } from 'react';
import { unstable_defineRouter } from 'waku/router/server';
import { unstable_defineRouter as defineRouter } from 'waku/router/server';
import { Slot, Children } from 'waku/minimal/client';
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';

import Layout from './routes/layout.js';
import Page from './routes/page.js';
Expand All @@ -13,7 +13,7 @@ const PATH_PAGE: Record<string, ReactNode> = {
'/foo': <FooPage />,
};

const router: ReturnType<typeof unstable_defineRouter> = unstable_defineRouter({
const router: ReturnType<typeof defineRouter> = defineRouter({
getPathConfig: async () =>
STATIC_PATHS.map((path) => ({
pattern: `^${path}$`,
Expand Down Expand Up @@ -62,15 +62,15 @@ const router: ReturnType<typeof unstable_defineRouter> = unstable_defineRouter({
},
});

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, utils) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, utils) => {
if (input.type === 'custom') {
return null; // no ssr
}
return router.unstable_handleRequest(input, utils);
return router.handleRequest(input, utils);
},
unstable_getBuildConfig: (utils) => {
return router.unstable_getBuildConfig(utils);
getBuildConfig: (utils) => {
return router.getBuildConfig(utils);
},
});

Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/ssr-basic/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import { Slot } from 'waku/minimal/client';

import App from './components/App.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc, renderHtml }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc, renderHtml }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
Expand All @@ -16,9 +16,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderHtml({ App: <App name="Waku" /> }, <Slot id="App" />, '');
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/ssr-basic/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot, hydrateRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/ssr-context-provider/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import { Slot } from 'waku/minimal/client';

import App from './components/app.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc, renderHtml }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc, renderHtml }) => {
if (input.type === 'component') {
return renderRsc({ App: <App /> });
}
Expand All @@ -16,9 +16,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderHtml({ App: <App /> }, <Slot id="App" />, '');
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/ssr-context-provider/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot, hydrateRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/ssr-swr/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import { Slot } from 'waku/minimal/client';

import App from './components/App.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc, renderHtml }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc, renderHtml }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
Expand All @@ -16,9 +16,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderHtml({ App: <App name="Waku" /> }, <Slot id="App" />, '');
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/ssr-swr/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot, hydrateRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
10 changes: 4 additions & 6 deletions e2e/fixtures/ssr-target-bundle/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import { Slot } from 'waku/minimal/client';

import App from './components/App.js';

const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
unstable_handleRequest: async (input, { renderRsc, renderHtml }) => {
const entries: ReturnType<typeof defineEntries> = defineEntries({
handleRequest: async (input, { renderRsc, renderHtml }) => {
if (input.type === 'component') {
return renderRsc({ App: <App name={input.rscPath || 'Waku'} /> });
}
Expand All @@ -16,9 +16,7 @@ const entries: ReturnType<typeof new_defineEntries> = new_defineEntries({
return renderHtml({ App: <App name="Waku" /> }, <Slot id="App" />, '');
}
},
unstable_getBuildConfig: async () => [
{ pathSpec: [], entries: [{ rscPath: '' }] },
],
getBuildConfig: async () => [{ pathSpec: [], entries: [{ rscPath: '' }] }],
});

export default entries;
2 changes: 1 addition & 1 deletion e2e/fixtures/ssr-target-bundle/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot, hydrateRoot } from 'react-dom/client';
import { Root, Slot } from 'waku/client';
import { Root, Slot } from 'waku/minimal/client';

const rootElement = (
<StrictMode>
Expand Down
12 changes: 6 additions & 6 deletions examples/12_nossr/src/entries.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
/// <reference types="vite/client" />

import { new_defineEntries } from 'waku/minimal/server';
import { unstable_defineEntries as defineEntries } from 'waku/minimal/server';
import { fsRouter } from 'waku/router/server';

const router = fsRouter(import.meta.url, (file) =>
import.meta.glob('./pages/**/*.tsx')[`./pages/${file}`]?.(),
);

export default new_defineEntries({
unstable_handleRequest: async (input, utils) => {
export default defineEntries({
handleRequest: async (input, utils) => {
if (input.type === 'custom') {
return null; // no ssr
}
return router.unstable_handleRequest(input, utils);
return router.handleRequest(input, utils);
},
unstable_getBuildConfig: (utils) => {
return router.unstable_getBuildConfig(utils);
getBuildConfig: (utils) => {
return router.getBuildConfig(utils);
},
});
4 changes: 2 additions & 2 deletions examples/22_define-router/src/entries.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { unstable_defineRouter } from 'waku/router/server';
import { unstable_defineRouter as defineRouter } from 'waku/router/server';
import { Slot, Children } from 'waku/minimal/client';

import Root from './components/Root';
Expand All @@ -8,7 +8,7 @@ import FooPage from './components/FooPage';
import BarPage from './components/BarPage';
import NestedBazPage from './components/NestedBazPage';

export default unstable_defineRouter({
export default defineRouter({
getPathConfig: async () => {
return [
{
Expand Down
Loading

0 comments on commit 4eb1bae

Please sign in to comment.