Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

breaking: string only waku.config.ts #1281

Draft
wants to merge 22 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/guides/cloudflare.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,4 @@ npm i --save-dev wrangler

When starting the Waku dev server, we need to first start a wrangler/miniflare server and then pass them into the Hono app fetch.

This can be done by creating a custom Waku plugin in your `waku.config.ts` file. Copy the `waku.cloudflare-dev-server.ts` and `waku.config.ts` to your project from [the Cloudflare example in the Waku GitHub repository](https://github.com/dai-shi/waku/tree/main/examples/07_cloudflare). Now when you run `waku dev`, you will be able to access Cloudflare env bindings and execution context on the Hono context.
This can be done by creating a custom Waku plugin in your `waku.config.ts` file. Copy the `waku.cloudflare-dev-server.ts`, `waku.hono-enhahcer.ts` and `waku.config.ts` to your project from [the Cloudflare example in the Waku GitHub repository](https://github.com/dai-shi/waku/tree/main/examples/07_cloudflare). Now when you run `waku dev`, you will be able to access Cloudflare env bindings and execution context on the Hono context.
10 changes: 5 additions & 5 deletions docs/guides/stream-intercept.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@ import { defineConfig } from 'waku/config';

export default defineConfig({
// ...
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/handler'),
middleware: [
'waku/middleware/context',
'./src/middleware/themePreload.js', // + this is the one we just added
'waku/middleware/dev-server',
'waku/middleware/handler',
],
});
```
Expand Down
10 changes: 5 additions & 5 deletions docs/redirects.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ export default redirectsMiddleware;
import type { Config } from 'waku/config';

export default {
middleware: () => [
import('waku/middleware/context'),
import('./src/middleware/redirects.js'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
middleware: [
'waku/middleware/context',
'./src/middleware/redirects.js',
'waku/middleware/dev-server',
'waku/middleware/handler',
],
} satisfies Config;
```
Expand Down
10 changes: 5 additions & 5 deletions e2e/fixtures/broken-links/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('./src/redirects.js'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
middleware: [
'waku/middleware/context',
'./src/redirects.js',
'waku/middleware/dev-server',
'waku/middleware/handler',
],
});
10 changes: 5 additions & 5 deletions e2e/fixtures/rsc-basic/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
import('waku/middleware/fallback'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
'waku/middleware/fallback',
],
});
10 changes: 5 additions & 5 deletions e2e/fixtures/rsc-css-modules/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
import('waku/middleware/fallback'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
'waku/middleware/fallback',
],
});
10 changes: 5 additions & 5 deletions e2e/fixtures/ssr-catch-error/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('./src/middleware/validator.js'),
import('waku/middleware/handler'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'./src/middleware/validator.js',
'waku/middleware/handler',
],
/**
* Base path for HTTP requests to indicate RSC requests.
Expand Down
43 changes: 8 additions & 35 deletions examples/07_cloudflare/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,11 @@
import type { Hono } from 'hono';
import { type Config, defineConfig } from 'waku/config';
import { defineConfig } from 'waku/config';

export default defineConfig({
...(import.meta.env && !import.meta.env.PROD
? {
unstable_honoEnhancer: ((createApp: (app: Hono) => Hono) => {
const handlerPromise = import('./waku.cloudflare-dev-server').then(
({ cloudflareDevServer }) =>
cloudflareDevServer({
// Optional config settings for the Cloudflare dev server (wrangler proxy)
// https://developers.cloudflare.com/workers/wrangler/api/#parameters-1
persist: {
path: '.wrangler/state/v3',
},
}),
);
return (appToCreate: Hono) => {
const app = createApp(appToCreate);
return {
fetch: async (req: Request) => {
const devHandler = await handlerPromise;
return devHandler(req, app);
},
};
};
}) as Config['unstable_honoEnhancer'],
}
: {}),
middleware: () => {
return [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('./waku.cloudflare-middleware'),
import('waku/middleware/handler'),
];
},
unstable_honoEnhancer: './waku.hono-enhancer',
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'./waku.cloudflare-middleware',
'waku/middleware/handler',
],
});
28 changes: 28 additions & 0 deletions examples/07_cloudflare/waku.hono-enhancer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import type { Hono } from 'hono';

const honoEnhancer = (createApp: (app: Hono) => Hono) => {
if (import.meta.env && !import.meta.env.PROD) {
const handlerPromise = import('./waku.cloudflare-dev-server').then(
({ cloudflareDevServer }) =>
cloudflareDevServer({
// Optional config settings for the Cloudflare dev server (wrangler proxy)
// https://developers.cloudflare.com/workers/wrangler/api/#parameters-1
persist: {
path: '.wrangler/state/v3',
},
}),
);
return (appToCreate: Hono) => {
const app = createApp(appToCreate);
return {
fetch: async (req: Request) => {
const devHandler = await handlerPromise;
return devHandler(req, app);
},
};
};
}
return createApp;
};

export default honoEnhancer;
10 changes: 5 additions & 5 deletions examples/12_nossr/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
import('waku/middleware/fallback'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
'waku/middleware/fallback',
],
});
10 changes: 5 additions & 5 deletions examples/38_cookies/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('./src/middleware/cookie.js'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
middleware: [
'waku/middleware/context',
'./src/middleware/cookie.js',
'waku/middleware/dev-server',
'waku/middleware/handler',
],
});
10 changes: 5 additions & 5 deletions examples/51_spa/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
import('waku/middleware/fallback'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
'waku/middleware/fallback',
],
});
10 changes: 5 additions & 5 deletions examples/52_tanstack-router/waku.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineConfig } from 'waku/config';

export default defineConfig({
middleware: () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
import('waku/middleware/fallback'),
middleware: [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
'waku/middleware/fallback',
],
});
20 changes: 16 additions & 4 deletions packages/waku/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ if (values.version) {

async function runDev() {
const config = await loadConfig();
const honoEnhancer =
config.unstable_honoEnhancer || ((createApp) => createApp);
const honoEnhancer: HonoEnhancer = config.unstable_honoEnhancer
? await loadHonoEnhancer(config.unstable_honoEnhancer)
: (fn) => fn;
const createApp = (app: Hono) => {
if (values['experimental-compress']) {
app.use(compress());
Expand Down Expand Up @@ -154,8 +155,9 @@ async function runBuild() {
async function runStart() {
const config = await loadConfig();
const { distDir = 'dist' } = config;
const honoEnhancer =
config.unstable_honoEnhancer || ((createApp) => createApp);
const honoEnhancer: HonoEnhancer = config.unstable_honoEnhancer
? await loadHonoEnhancer(config.unstable_honoEnhancer)
: (fn) => fn;
const loadEntries = () =>
import(pathToFileURL(path.resolve(distDir, DIST_ENTRIES_JS)).toString());
const createApp = (app: Hono) => {
Expand Down Expand Up @@ -236,3 +238,13 @@ async function loadConfig(): Promise<Config> {
const file = pathToFileURL(path.resolve(CONFIG_FILE)).toString();
return (await loadServerModule<{ default: Config }>(file)).default;
}

type HonoEnhancer = <Hono>(fn: (app: Hono) => Hono) => (app: Hono) => Hono;

async function loadHonoEnhancer(file: string): Promise<HonoEnhancer> {
const { loadServerModule } = await import('./lib/utils/vite-loader.js');
const fileUrl = pathToFileURL(
path.resolve(CONFIG_FILE, '..', file),
).toString();
return (await loadServerModule<{ default: HonoEnhancer }>(fileUrl)).default;
}
14 changes: 6 additions & 8 deletions packages/waku/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,18 @@ export interface Config {
/**
* Middleware to use
* Defaults to:
* () => [
* import('waku/middleware/context'),
* import('waku/middleware/dev-server'),
* import('waku/middleware/handler'),
* [
* 'waku/middleware/context',
* 'waku/middleware/dev-server',
* 'waku/middleware/handler',
* ]
*/
middleware?: () => Promise<{ default: Middleware }>[];
middleware?: string[];
/**
* Enhancer for Hono
* Defaults to `undefined`
*/
unstable_honoEnhancer?:
| (<Hono>(createApp: (app: Hono) => Hono) => (app: Hono) => Hono)
| undefined;
unstable_honoEnhancer?: string | undefined;
/**
* Vite configuration options.
* `common` can contains shared configs that are shallowly merged with other configs.
Expand Down
2 changes: 2 additions & 0 deletions packages/waku/src/lib/builder/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ const buildServerBundle = async (
rscEntriesPlugin({
basePath: config.basePath,
rscBase: config.rscBase,
middleware: config.middleware,
rootDir,
srcDir: config.srcDir,
ssrDir: DIST_SSR,
moduleMap: {
Expand Down
8 changes: 4 additions & 4 deletions packages/waku/src/lib/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import type { Config } from '../config.js';

export type ConfigDev = Required<Config>;

const DEFAULT_MIDDLEWARE = () => [
import('waku/middleware/context'),
import('waku/middleware/dev-server'),
import('waku/middleware/handler'),
const DEFAULT_MIDDLEWARE = [
'waku/middleware/context',
'waku/middleware/dev-server',
'waku/middleware/handler',
];

// Keep async function for future extension
Expand Down
Loading
Loading