| Crates.io | deforge |
| lib.rs | deforge |
| version | 0.1.0 |
| created_at | 2025-11-13 09:45:01.760845+00 |
| updated_at | 2025-11-13 09:45:01.760845+00 |
| description | Universal Edge Function Compiler - Transform standard code to platform-specific deployables |
| homepage | https://github.com/deislet/deforge |
| repository | https://github.com/deislet/deforge |
| max_upload_size | |
| id | 1930759 |
| size | 189,925 |
标准代码到平台代码的纯粹翻译器 | Pure Translator from Standard to Platform-Specific Code
Deforge 是一个专注的代码编译器,将符合 deislet/spec 标准的 Edge Function 代码翻译为特定平台的可部署代码。
Deforge 只做一件事:翻译代码
输入:符合 deislet/spec 标准的代码库
输出:特定平台(Cloudflare/Deno/Tencent)的可部署代码
deforge/
├── crates/
│ ├── deforge/ # CLI 可执行文件 (validate + build)
│ ├── deforge-core/ # 核心类型定义
│ ├── deforge-parser/ # TypeScript/JavaScript 解析器 (SWC)
│ ├── deforge-compiler/ # 代码验证和转换
│ └── deforge-adapters/ # 平台适配器代码生成
# 克隆项目
git clone https://github.com/deislet/deforge.git
cd deforge
# 构建 (需要 Rust 1.70+)
cargo build --release
# 安装到系统
cargo install --path crates/deforge
检查代码是否符合标准,检测平台特定代码:
deforge validate [--strict]
输出示例:
✓ Validating functions/api/users.ts
✓ Validating functions/index.ts
✗ Error in functions/bad.ts:10:5
Platform-specific code detected: typeof Deno !== 'undefined'
2/3 files passed, 1 error
将标准代码翻译为特定平台代码:
# 构建所有平台
deforge build
# 构建特定平台
deforge build --vendor cloudflare
deforge build --vendor deno
deforge build --vendor tencent
# 监视模式(开发时使用)
deforge build --watch
输出目录结构:
dist/
├── cloudflare/
│ ├── index.ts # 自动生成的路由器
│ ├── wrangler.toml # Cloudflare 配置
│ ├── src/ # 转换后的 handlers
│ └── adapters/ # KV/Context 适配器
├── deno/
│ ├── index.ts # Deno.serve 入口点
│ ├── deno.json # Deno 配置
│ └── src/ # 转换后的代码
└── tencent/
├── index.ts # EdgeOne 路由器
├── edgeone.toml # EdgeOne 配置
└── src/ # 转换后的代码
Deforge 期望符合以下规范的代码:
your-project/
├── functions/ # 必须:函数目录
│ ├── index.ts # 根路由 /
│ ├── api/
│ │ ├── users.ts # /api/users
│ │ └── [id].ts # /api/:id (动态路由)
│ └── admin/
│ └── index.ts # /admin
└── denictl.toml # 可选:项目配置
// functions/api/users.ts
import type { Context } from '@denictl/types';
export default async function handler(context: Context): Promise<Response> {
const { kv } = context.services;
const userId = context.params.id;
// 使用统一的 KV 接口 (自动适配各平台)
const user = await kv.getJSON(`user:${userId}`);
if (!user) {
return new Response('User not found', { status: 404 });
}
return new Response(JSON.stringify(user), {
headers: { 'Content-Type': 'application/json' }
});
}
统一的运行时上下文:
interface Context {
request: Request; // 原始 Request 对象
env: Record<string, string>; // 环境变量
params: Record<string, string>; // 路由参数
query: URLSearchParams; // 查询参数
services: { // 统一服务接口
kv: KVStore;
database?: Database;
cache?: Cache;
};
log: Logger; // 结构化日志
waitUntil: (promise: Promise<any>) => void;
}
Deforge 会检测并禁止以下模式:
❌ 平台类型检测
if (typeof Deno !== 'undefined') { } // Error!
❌ 直接访问 context.raw
const cfEnv = context.raw.cloudflare.env; // Error!
❌ 平台特定 API
Deno.env.get('VAR'); // Error! 使用 context.env
process.env.VAR; // Error! 使用 context.env
✅ 正确的方式
const apiKey = context.env.API_KEY;
const kv = context.services.kv;
export default async function handler(context: Context): Promise<Response> {
const name = context.query.get('name') || 'World';
return new Response(`Hello, ${name}!`);
}
/**
* Cloudflare Workers Handler
* Generated from: functions/api/hello.ts
* Route: /api/hello
*/
import { createContextBuilder } from '../adapters/context-builder';
// Original handler code (保持不变)
export default async function handler(context: Context): Promise<Response> {
const name = context.query.get('name') || 'World';
return new Response(`Hello, ${name}!`);
}
// Cloudflare Workers export (自动生成)
export default {
async fetch(request, env, ctx) {
const buildContext = createContextBuilder(env, ctx);
const context = buildContext(request, '/api/hello');
return await handler(context);
}
};
import handler0 from './src/index';
import handler1 from './src/api/hello';
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (matchRoute(url.pathname, '/')) {
return handler0.fetch(request, env, ctx);
}
if (matchRoute(url.pathname, '/api/hello')) {
return handler1.fetch(request, env, ctx);
}
return new Response('Not Found', { status: 404 });
}
};
Deforge 专注于编译,可与其他工具配合使用:
# 1. 验证代码
deforge validate
# 2. 构建目标平台代码
deforge build --vendor cloudflare
# 3. 使用平台工具部署(不是 Deforge 的职责)
cd dist/cloudflare
npx wrangler deploy
可选的 denictl.toml 配置文件:
[project]
name = "my-edge-app"
version = "1.0.0"
[build]
minify = true
source_map = false
[cloudflare]
account_id = "your-account-id"
kv_namespaces = ["KV_STORE"]
[deno]
import_map = "import_map.json"
[tencent]
zone_id = "your-zone-id"
Deforge 不做的事情:
create-deislet-appdeislet-devdeislet-deployDeforge 专注于:
欢迎贡献!请查看 CONTRIBUTING.md
Apache-2.0 License
Deforge: Pure. Focused. Efficient.