@jitsi/cf-ts-bundler-worker
v1.0.2
Published
A fast, lightweight Cloudflare Worker that runs esbuild on the edge to compile TypeScript to JavaScript with CDN imports support
Readme
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-workerThe package includes:
- Minified Worker code (~265 KB)
- esbuild-wasm module (~12 MB)
- Source maps for debugging
Quick Start
Option 1: Deploy using Wrangler (Recommended)
# Install the package
npm install @jitsi/cf-ts-bundler-worker
# Deploy to Cloudflare (no build needed!)
npx wrangler deploy node_modules/@jitsi/cf-ts-bundler-worker/worker-dist/index.js \
--name my-ts-bundler \
--compatibility-flag nodejs_compatOption 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 deployConfiguration
Environment Variables
The worker uses the following environment variables:
| Variable | Description | Required | Default |
|----------|-------------|----------|---------|
| 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.varsEdit
.dev.varswith 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:
# Enable authentication (recommended for production)
wrangler secret put AUTH_ENABLED
# When prompted, enter: true
# Set JWT configuration (required when AUTH_ENABLED=true)
wrangler secret put JWT_ISSUER
wrangler secret put PUBLIC_KEY
# Or set as regular environment variables
wrangler deploy --var AUTH_ENABLED:true --var JWT_ISSUER:https://your-auth-server.comAlternatively, use the Cloudflare dashboard to set environment variables in your worker settings.
For development/testing environments without authentication:
# Omit AUTH_ENABLED or set it to false
wrangler deploy
# Authentication will be disabled by defaultAPI 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 "[email protected]"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
# Local development
npm run dev
# Run tests
npm test
# Deploy
npm run deployTODO / Roadmap
- [ ] 📦 Multiple files support - Bundle entire TypeScript projects with multiple files and dependencies
- [ ] 📊 Compilation performance metrics and caching
- [ ] 🔧 Custom esbuild configuration options
- [ ] 🔐 JWKS or ASAP-style (Key by Hash Method) support to improve JWT authentication with key rotation
License
Apache License 2.0 - see LICENSE file for details.
