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

feat: adapter-cloudflare #23

Merged
merged 11 commits into from
Aug 29, 2024
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,6 @@ dist

# turbo
.turbo

# cloudflare
.wrangler
6 changes: 6 additions & 0 deletions .idea/universal-handler.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ export default defineConfig({
],
},
title: "universal-middleware",
description: "Write middleware once, target Hono, Express, Fastify, and more",
description:
"Write middleware once, target Hono, Express, Cloudflare, and more",
themeConfig: {
logo: {
light: "/logo.png",
Expand Down Expand Up @@ -73,6 +74,10 @@ export default defineConfig({
{ text: "Supported adapters", link: "/reference/supported-adapters" },
],

search: {
provider: "local",
},

socialLinks: [
{
icon: "github",
Expand Down
44 changes: 39 additions & 5 deletions docs/examples/context-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ After bundling and publishing this middleware, one can then use this middleware

::: code-group

```ts twoslash [hono-entry.ts]
```ts twoslash [hono.ts]
import { Hono } from "hono";
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-hono";
import { getContext } from "@universal-middleware/hono";
Expand All @@ -29,7 +29,7 @@ app.get("/", (honoCtx) => {
export default app;
```

```ts twoslash [h3-entry.ts]
```ts twoslash [h3.ts]
import { createApp, createRouter, defineEventHandler } from "h3";
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-h3";
import { getContext, universalOnBeforeResponse } from "@universal-middleware/h3";
Expand Down Expand Up @@ -57,7 +57,7 @@ app.use(router);
export default app;
```

```ts twoslash [hattip-entry.ts]
```ts twoslash [hattip.ts]
import { createRouter } from "@hattip/router";
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-hattip";
import { getContext } from "@universal-middleware/hattip";
Expand All @@ -79,7 +79,41 @@ const hattipHandler = app.buildHandler();
export default hattipHandler;
```

```ts twoslash [express-entry.ts]
```ts twoslash [cloudflare-worker.ts]
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware";
import { createHandler } from "@universal-middleware/cloudflare";
import { pipe } from "@universal-middleware/core";

// Cloudflare Workers have no internal way of representing a middleware
// Instead, we use the universal `pipe` operator
const wrapped = pipe(
contextMiddleware("world"),
(request, context) => {
return new Response(`Hello ${context.hello}`);
}
);

export default createHandler(() => wrapped)();
```

```ts [cloudflare-pages]
// functions/index.ts
import { getContext } from "@universal-middleware/cloudflare";

export const onRequest = (request, env, ctx) => {
const universalCtx = getContext<{ hello: string }>(env)!;
return new Response(`Hello ${universalCtx.hello}`);
};

// functions/_middlewares.ts
// See https://developers.cloudflare.com/pages/functions/middleware/

import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-cloudflare-pages";

export const onRequest = contextMiddleware("world");
```

```ts twoslash [express.ts]
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-express";
import express from "express";
import { getContext } from "@universal-middleware/express";
Expand All @@ -99,7 +133,7 @@ app.get("/", (req, res) => {
export default app;
```

```ts twoslash [fastify-entry.ts]
```ts twoslash [fastify.ts]
import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-fastify";
import fastify from "fastify";
import { getContext } from "@universal-middleware/fastify";
Expand Down
36 changes: 31 additions & 5 deletions docs/examples/guard-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ After bundling and publishing this middleware, one can then use this middleware

::: code-group

```ts twoslash [hono-entry.ts]
```ts twoslash [hono.ts]
import { Hono } from "hono";
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-hono";

Expand All @@ -19,7 +19,7 @@ app.use(guardMiddleware());
export default app;
```

```ts twoslash [h3-entry.ts]
```ts twoslash [h3.ts]
import { createApp } from "h3";
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-h3";
import { universalOnBeforeResponse } from "@universal-middleware/h3";
Expand All @@ -34,7 +34,7 @@ app.use(guardMiddleware());
export default app;
```

```ts twoslash [hattip-entry.ts]
```ts twoslash [hattip.ts]
import { createRouter } from "@hattip/router";
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-hattip";

Expand All @@ -47,7 +47,33 @@ const hattipHandler = app.buildHandler();
export default hattipHandler;
```

```ts twoslash [express-entry.ts]
```ts twoslash [cloudflare-worker.ts]
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware";
import { createHandler } from "@universal-middleware/cloudflare";
import { pipe } from "@universal-middleware/core";

// Cloudflare Workers have no internal way of representing a middleware
// Instead, we use the universal `pipe` operator
const wrapped = pipe(
guardMiddleware(),
() => {
return new Response("OK");
}
);

export default createHandler(() => wrapped)();
```

```ts twoslash [cloudflare-pages]
// functions/_middlewares.ts
// See https://developers.cloudflare.com/pages/functions/middleware/

import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-cloudflare-pages";

export const onRequest = guardMiddleware();
```

```ts twoslash [express.ts]
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-express";
import express from "express";

Expand All @@ -58,7 +84,7 @@ app.use(guardMiddleware());
export default app;
```

```ts twoslash [fastify-entry.ts]
```ts twoslash [fastify.ts]
import guardMiddleware from "@universal-middleware-examples/tool/middlewares/guard-middleware-fastify";
import fastify from "fastify";

Expand Down
18 changes: 18 additions & 0 deletions docs/examples/headers-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ After bundling and publishing this middleware, one can then use this middleware

<<< @/../tests-examples/tests-tool/src/hattip-entry.ts

<<< @/../tests-examples/tests-tool/src/cloudflare-worker-entry.ts

```ts [cloudflare-pages]
// functions/index.ts

import handler from "@universal-middleware-examples/tool/dummy-handler-cloudflare-pages";

export const onRequest = handler();

// functions/_middlewares.ts
// See https://developers.cloudflare.com/pages/functions/middleware/

import contextMiddleware from "@universal-middleware-examples/tool/middlewares/context-middleware-cloudflare-pages";
import headersMiddleware from "@universal-middleware-examples/tool/middlewares/headers-middleware-cloudflare-pages";

export const onRequest = [contextMiddleware("World!!!"), headersMiddleware()];
```

<<< @/../tests-examples/tests-tool/src/express-entry.ts

<<< @/../tests-examples/tests-tool/src/fastify-entry.ts
Expand Down
2 changes: 1 addition & 1 deletion docs/guide/packaging.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ The bundler plugin also accepts the following options:
```ts
universalMiddleware({
// Only generate files for selected servers. All enabled by default
servers?: ('hono' | 'express' | 'hattip' | 'fastify' | 'h3' | 'webroute')[];
servers?: ('hono' | 'express' | 'hattip' | 'fastify' | 'h3' | 'webroute' | 'cloudflare')[];
// akin to esbuild `entryNames` for generated "exports" in package.json
serversExportNames?: string;
// akin to ebsuild `entryNames` for generated "exports" in package.json
Expand Down
4 changes: 2 additions & 2 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ layout: home
hero:
name: "universal-middleware"
text:
tagline: "Write middleware once, target Hono, Express, Fastify, and more!"
tagline: "Write middleware once, target Hono, Express, Cloudflare, and more!"
actions:
- theme: brand
text: Guide
Expand All @@ -19,7 +19,7 @@ features:
details: Automatically generate compatible middlewares for popular servers, from a single codebase
link: /guide/introduction
- title: Support for popular servers
details: Bundle your middlewares for Hono, Express, Fastify, h3, Hattip and Webroute
details: Bundle your middlewares for Hono, Express, Fastify, Cloudflare, h3, Hattip and Webroute
link: /reference/supported-adapters
- title: Web Standards Compliance
details: Write middlewares following established web standards (WinterCG, WHATWG) to ensure consistency and future-proofing
Expand Down
2 changes: 2 additions & 0 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
"@universal-middleware/h3": "workspace:*",
"@universal-middleware/hattip": "workspace:*",
"@universal-middleware/hono": "workspace:*",
"@universal-middleware/core": "workspace:*",
"@universal-middleware/cloudflare": "workspace:*",
"fastify": "^4.28.1",
"typescript": "^5.5.4",
"universal-middleware": "workspace:*",
Expand Down
1 change: 1 addition & 0 deletions docs/reference/supported-adapters.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ Supports the following server adapters:
- [Webroute](https://github.com/magne4000/universal-middleware/tree/main/packages/adapter-webroute)
- [Fastify](https://github.com/magne4000/universal-middleware/tree/main/packages/adapter-fastify)
- [h3](https://github.com/magne4000/universal-middleware/tree/main/packages/adapter-h3)
- [Cloudflare](https://github.com/magne4000/universal-middleware/tree/main/packages/adapter-cloudflare)
- TODO: elysia
63 changes: 62 additions & 1 deletion examples/tool/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,66 @@
"types": "./dist/middlewares/universal-h3-middleware-guard.middleware.d.ts",
"import": "./dist/middlewares/universal-h3-middleware-guard.middleware.js",
"default": "./dist/middlewares/universal-h3-middleware-guard.middleware.js"
},
"./dummy-handler-cloudflare": {
"types": "./dist/handlers/universal-cloudflare-handler-handler.d.ts",
"import": "./dist/handlers/universal-cloudflare-handler-handler.js",
"default": "./dist/handlers/universal-cloudflare-handler-handler.js"
},
"./middlewares/context-middleware-cloudflare": {
"types": "./dist/middlewares/universal-cloudflare-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-middleware-context.middleware.js"
},
"./middlewares/headers-middleware-cloudflare": {
"types": "./dist/middlewares/universal-cloudflare-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-middleware-headers.middleware.js"
},
"./middlewares/guard-middleware-cloudflare": {
"types": "./dist/middlewares/universal-cloudflare-middleware-guard.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-middleware-guard.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-middleware-guard.middleware.js"
},
"./dummy-handler-cloudflare-worker": {
"types": "./dist/handlers/universal-cloudflare-worker-handler-handler.d.ts",
"import": "./dist/handlers/universal-cloudflare-worker-handler-handler.js",
"default": "./dist/handlers/universal-cloudflare-worker-handler-handler.js"
},
"./dummy-handler-cloudflare-pages": {
"types": "./dist/handlers/universal-cloudflare-pages-handler-handler.d.ts",
"import": "./dist/handlers/universal-cloudflare-pages-handler-handler.js",
"default": "./dist/handlers/universal-cloudflare-pages-handler-handler.js"
},
"./middlewares/context-middleware-cloudflare-worker": {
"types": "./dist/middlewares/universal-cloudflare-worker-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-worker-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-worker-middleware-context.middleware.js"
},
"./middlewares/context-middleware-cloudflare-pages": {
"types": "./dist/middlewares/universal-cloudflare-pages-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-pages-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-pages-middleware-context.middleware.js"
},
"./middlewares/headers-middleware-cloudflare-worker": {
"types": "./dist/middlewares/universal-cloudflare-worker-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-worker-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-worker-middleware-headers.middleware.js"
},
"./middlewares/headers-middleware-cloudflare-pages": {
"types": "./dist/middlewares/universal-cloudflare-pages-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-pages-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-pages-middleware-headers.middleware.js"
},
"./middlewares/guard-middleware-cloudflare-worker": {
"types": "./dist/middlewares/universal-cloudflare-worker-middleware-guard.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-worker-middleware-guard.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-worker-middleware-guard.middleware.js"
},
"./middlewares/guard-middleware-cloudflare-pages": {
"types": "./dist/middlewares/universal-cloudflare-pages-middleware-guard.middleware.d.ts",
"import": "./dist/middlewares/universal-cloudflare-pages-middleware-guard.middleware.js",
"default": "./dist/middlewares/universal-cloudflare-pages-middleware-guard.middleware.js"
}
},
"author": "Joël Charles <[email protected]>",
Expand All @@ -171,7 +231,8 @@
"@universal-middleware/hono": "^0",
"@universal-middleware/webroute": "^0",
"@universal-middleware/fastify": "^0",
"@universal-middleware/h3": "^0"
"@universal-middleware/h3": "^0",
"@universal-middleware/cloudflare": "^0"
},
"sideEffects": false,
"peerDependencies": {
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@
"@hattip/router": "^0.0.47",
"@hono/node-server": "^1.12.0",
"express": "^4.19.2",
"h3": "~1.12.0",
"h3": "^1.12.0",
"hattip": "^0.0.33",
"helmet": "^7.1.0",
"hono": "^4.5.6",
"serve-static": "^1.15.0",
"tsx": "^4.17.0",
"tsx": "^4.19.0",
"vite": "^5.4.1"
},
"pnpm": {
Expand All @@ -63,6 +63,7 @@
"@universal-middleware/webroute": "link:./packages/adapter-webroute",
"@universal-middleware/fastify": "link:./packages/adapter-fastify",
"@universal-middleware/h3": "link:./packages/adapter-h3",
"@universal-middleware/cloudflare": "link:./packages/adapter-cloudflare",
"universal-middleware": "link:./packages/universal-middleware",
"@webroute/middleware": "^0.9.0",
"esbuild": "^0.23.1"
Expand Down
10 changes: 10 additions & 0 deletions packages/adapter-cloudflare/deno.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"imports": {
"@universal-middleware/tests": "../tests/dist",
"@universal-middleware/core": "../core/dist",
"mri": "npm:mri",
"zx": "npm:zx",
"wait-port": "npm:wait-port"
},
"lock": false
}
8 changes: 8 additions & 0 deletions packages/adapter-cloudflare/functions/_middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { middlewares } from "@universal-middleware/tests/utils";
import { createPagesFunction } from "../src/index.js";

export const onRequest = [
createPagesFunction(middlewares[0])(),
createPagesFunction(middlewares[1])(),
createPagesFunction(middlewares[2])(),
];
4 changes: 4 additions & 0 deletions packages/adapter-cloudflare/functions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { createPagesFunction } from "../src/index.js";
import { handler } from "@universal-middleware/tests/utils";

export const onRequest = createPagesFunction(handler)();
Loading