cf-ts-bundler-worker
A fast, lightweight Cloudflare Worker that runs esbuild on the edge to compile TypeScript to JavaScript with CDN imports support.

Features
- ⚡ Dynamic TypeScript compilation with esbuild-wasm running on the edge
- 🌐 Automatic CDN imports resolution
- 📡 REST API with OpenAPI documentation
- 📁 File upload support
- ☁️ Low-latency compilation powered by Cloudflare's global network
Installation
This package provides a pre-built, production-ready Cloudflare Worker bundle. No build step required!
npm install @jitsi/cf-ts-bundler-worker
The package includes:
- Minified Worker code (~265 KB)
- esbuild-wasm module (~12 MB)
- Source maps for debugging
Quick Start
Option 1: Deploy using Wrangler (Recommended)
npm install @jitsi/cf-ts-bundler-worker
npx wrangler deploy node_modules/@jitsi/cf-ts-bundler-worker/worker-dist/index.js \
--name my-ts-bundler \
--compatibility-flag nodejs_compat
Option 2: Deploy from Source
Clone and customize the Worker:
git clone https://github.com/jitsi/cloudflare-ts-bundler-worker.git
cd cloudflare-ts-bundler-worker
npm install
npm run deploy
Configuration
Environment Variables
The worker uses the following environment variables:
AUTH_ENABLED | Enable/disable JWT authentication. Set to 'true' to enable. | No | false (disabled) |
JWT_ISSUER | Expected issuer claim in JWT tokens | Only when AUTH_ENABLED=true | - |
PUBLIC_KEY | RSA public key in PEM format (SPKI) for JWT signature verification | Only when AUTH_ENABLED=true | - |
Note: The PUBLIC_KEY is a public key and is not sensitive data. Only the corresponding private key (used to sign tokens) needs to be kept secret.
Security Consideration: By default, authentication is disabled for easier development and testing. For production deployments, it's recommended to set AUTH_ENABLED=true to protect your endpoints.
Local Development
-
Copy the example environment file:
cp .dev.vars.example .dev.vars
-
Edit .dev.vars with your actual values:
JWT_ISSUER=https://your-auth-server.com
PUBLIC_KEY=-----BEGIN PUBLIC KEY-----
Your actual RSA public key here
-----END PUBLIC KEY-----
-
Start the dev server (it will automatically load .dev.vars):
npm run dev
Production Deployment
Set environment variables using Wrangler CLI:
wrangler secret put AUTH_ENABLED
wrangler secret put JWT_ISSUER
wrangler secret put PUBLIC_KEY
wrangler deploy --var AUTH_ENABLED:true --var JWT_ISSUER:https://your-auth-server.com
Alternatively, use the Cloudflare dashboard to set environment variables in your worker settings.
For development/testing environments without authentication:
wrangler deploy
API Reference
Base URL: https://your-worker.your-subdomain.workers.dev
Interactive Documentation:
- Swagger UI:
/_cfw/cf-ts-bundler-worker/docs
- OpenAPI JSON:
/_cfw/cf-ts-bundler-worker/openapi.json
Usage Examples
Basic Compilation (cURL)
curl -X POST https://your-worker.your-subdomain.workers.dev/_cfw/cf-ts-bundler-worker/compile \
-H "Content-Type: application/json" \
-d '{"code": "const message: string = \"Hello!\"; console.log(message);"}'
Response:
{
"success": true,
"compiledCode": "var o=\"Hello!\";console.log(o);\n"
}
File Upload Compilation (cURL)
curl -X POST https://your-worker.your-subdomain.workers.dev/_cfw/cf-ts-bundler-worker/compile-file \
-F "file=@example.ts"
Note: Currently supports single file uploads only. Multi-file project bundling is planned for future releases.
Response: Returns the compiled JavaScript file for download.
Example TypeScript File (example.ts)
import { Hono } from 'hono';
import { z } from 'zod';
import { zValidator } from '@hono/zod-validator';
const userSchema = z.object({
name: z.literal("John"),
age: z.number().min(18),
email: z.email().optional(),
});
type User = z.infer<typeof userSchema> & {
id: string;
};
const app = new Hono();
app.get('/', (c) => c.json({ message: 'Hello World!' }));
app.post('/users', zValidator('json', userSchema), (c) => {
const userData = c.req.valid('json');
const user: User = {
id: `user-${crypto.randomUUID().slice(0, 8)}`,
...userData,
};
return c.json({ message: 'User created!', user }, 201);
});
export default app;
Development
npm run dev
npm test
npm run deploy
TODO / Roadmap
License
Apache License 2.0 - see LICENSE file for details.