npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@saleandwin/cloudflare-api

v1.0.4

Published

Cloudflare API client library for framework-ts projects with Zone, DNS, and Pages management

Readme

@saleandwin/cloudflare-api

Cloudflare API client library for framework-ts projects with Zone, DNS, and Pages management.

🌟 特性

  • 完整的 Cloudflare API 支持: Zone、DNS、Pages 项目管理
  • 类型安全: 完整的 TypeScript 类型定义
  • 分层架构: Handler -> Service -> Client 清晰的架构模式
  • 数据验证: 内置的请求数据验证
  • 错误处理: 统一的错误处理机制
  • 分页支持: 完整的分页查询支持
  • 统计信息: 资源使用统计和监控

🏗️ 架构

该库遵循清晰的分层架构模式:

Handler -> Service -> Client
  • Handler: HTTP 请求处理层,提供统一的 API 接口给 Next.js 路由使用
  • Service: 业务逻辑层,处理验证和数据处理
  • Client: API 客户端层,直接与 Cloudflare API 交互

📦 安装

npm install @saleandwin/cloudflare-api
# 或
pnpm add @saleandwin/cloudflare-api
# 或
yarn add @saleandwin/cloudflare-api

🚀 快速开始

1. 基础配置

import { CloudflareHandler, type CloudflareConfig } from '@saleandwin/cloudflare-api';

const config: CloudflareConfig = {
  apiToken: 'your-cloudflare-api-token',
  accountId: 'your-account-id', // 可选
  enableLogging: true // 可选,开启日志
};

const cloudflareHandler = CloudflareHandler.createInstance(config);

2. Zone 管理

// 获取 Zone 列表
const zones = await cloudflareHandler.handleGetZones({
  page: 1,
  perPage: 20
});

// 创建新 Zone
const newZone = await cloudflareHandler.handleCreateZone({
  name: 'example.com',
  jumpStart: true
});

// 获取特定 Zone
const zone = await cloudflareHandler.handleGetZoneById('zone-id');

// 删除 Zone
const result = await cloudflareHandler.handleDeleteZone('zone-id');

3. DNS 记录管理

// 获取 DNS 记录列表
const dnsRecords = await cloudflareHandler.handleGetDnsRecords({
  zoneId: 'zone-id',
  page: 1,
  perPage: 20
});

// 创建 DNS 记录
const newRecord = await cloudflareHandler.handleCreateDnsRecord({
  zoneId: 'zone-id',
  type: 'A',
  name: 'www',
  content: '192.168.1.1',
  ttl: 3600,
  proxied: true
});

// 更新 DNS 记录
const updatedRecord = await cloudflareHandler.handleUpdateDnsRecord(
  'zone-id',
  'record-id',
  {
    content: '192.168.1.2',
    ttl: 7200
  }
);

// 删除 DNS 记录
const deleteResult = await cloudflareHandler.handleDeleteDnsRecord('zone-id', 'record-id');

4. Pages 项目管理

// 获取 Pages 项目列表
const projects = await cloudflareHandler.handleGetPagesProjects({
  page: 1,
  perPage: 20
});

// 创建 Pages 项目
const newProject = await cloudflareHandler.handleCreatePagesProject({
  name: 'my-project',
  productionBranch: 'main',
  buildConfig: {
    buildCommand: 'npm run build',
    destinationDir: 'dist'
  }
});

// 添加自定义域名
const customDomain = await cloudflareHandler.handleAddPagesCustomDomain({
  projectName: 'my-project',
  domainName: 'example.com'
});

// 删除项目
const deleteResult = await cloudflareHandler.handleDeletePagesProject('my-project');

5. Worker 脚本管理

// 获取 Worker 脚本列表
const scripts = await cloudflareHandler.handleGetWorkerScripts({
  page: 1,
  perPage: 20
});

// 创建新 Worker 脚本
const newScript = await cloudflareHandler.handleCreateWorkerScript({
  scriptName: 'my-worker',
  script: `
    addEventListener('fetch', event => {
      event.respondWith(handleRequest(event.request))
    })

    async function handleRequest(request) {
      return new Response('Hello World!', {
        headers: { 'content-type': 'text/plain' }
      })
    }
  `,
  compatibility_date: '2023-05-18',
  usage_model: 'bundled'
});

// 更新 Worker 脚本
const updatedScript = await cloudflareHandler.handleUpdateWorkerScript({
  scriptName: 'my-worker',
  script: 'updated script content...',
  bindings: [
    {
      name: 'MY_KV',
      type: 'kv_namespace',
      namespace_id: 'your-kv-namespace-id'
    }
  ]
});

// 删除 Worker 脚本
const deleteResult = await cloudflareHandler.handleDeleteWorkerScript('my-worker');

6. Worker 路由管理

// 获取 Worker 路由列表
const routes = await cloudflareHandler.handleGetWorkerRoutes({
  scriptName: 'my-worker',
  page: 1,
  perPage: 20
});

// 创建 Worker 路由
const newRoute = await cloudflareHandler.handleCreateWorkerRoute({
  pattern: 'example.com/api/*',
  script: 'my-worker',
  zone_id: 'your-zone-id'
});

// 删除 Worker 路由
const deleteRouteResult = await cloudflareHandler.handleDeleteWorkerRoute('route-id');

7. Worker 自定义域名管理

// 获取 Worker 自定义域名列表
const customDomains = await cloudflareHandler.handleGetWorkerCustomDomains('my-worker');

// 绑定 Worker 自定义域名
const bindResult = await cloudflareHandler.handleBindWorkerCustomDomain({
  scriptName: 'my-worker',
  hostname: 'api.example.com',
  zone_id: 'your-zone-id'
});

// 解绑 Worker 自定义域名
const unbindResult = await cloudflareHandler.handleUnbindWorkerCustomDomain(
  'my-worker',
  'domain-id'
);

8. 令牌管理

import { TokenHandler, TokenService, CloudflareTokenManager } from '@saleandwin/cloudflare-api';

// 创建令牌管理实例
const tokenHandler = await TokenHandler.createInstance();
const tokenService = await TokenService.createInstance();

// 创建新令牌
const newToken = await tokenService.createToken({
  account_id: 'your-account-id',
  account_name: 'My Account',
  api_token: 'your-cloudflare-api-token',
  email: '[email protected]',
  is_default: true,
  description: 'Production API token'
});

// 获取默认令牌
const defaultToken = await tokenService.getDefaultToken();

// 获取指定账户的令牌
const accountTokens = await tokenService.getTokensByAccountId('account-id');

// 自动选择最佳令牌
const tokenManager = await CloudflareTokenManager.createInstance();
const bestToken = await tokenManager.getBestToken('account-id');

// 使用中间件自动处理令牌
const zones = await withCloudflareToken(async (token) => {
  const client = new CloudflareApiClient({ apiToken: token });
  return await client.getZones();
}, 'account-id');

9. 用户和账号信息

// 获取当前用户信息
const user = await cloudflareHandler.handleGetCurrentUser();

// 获取账号列表
const accounts = await cloudflareHandler.handleGetAccounts();

// 验证配置
const validation = await cloudflareHandler.handleValidateConfiguration();

6. 统计信息

// 获取资源统计信息
const stats = await cloudflareHandler.handleGetStats();
console.log('Zones:', stats.data?.zones);
console.log('DNS Records:', stats.data?.dnsRecords);
console.log('Pages Projects:', stats.data?.pagesProjects);
console.log('Workers:', stats.data?.workers);

// 令牌统计
const tokenStats = await tokenService.getAllTokens();
console.log('Total Tokens:', tokenStats.pagination?.totalCount);

🔧 在 Next.js 中使用

API 路由示例

// app/api/cloudflare/zones/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { CloudflareHandler } from '@saleandwin/cloudflare-api';

const cloudflareHandler = CloudflareHandler.createInstance({
  apiToken: process.env.CLOUDFLARE_API_TOKEN!,
  accountId: process.env.CLOUDFLARE_ACCOUNT_ID
});

export async function GET(request: NextRequest) {
  try {
    const { searchParams } = new URL(request.url);
    const page = parseInt(searchParams.get('page') || '1');
    const perPage = parseInt(searchParams.get('perPage') || '20');

    const result = await cloudflareHandler.handleGetZones({ page, perPage });
    
    if (!result.success) {
      return NextResponse.json({ error: result.error }, { status: 400 });
    }

    return NextResponse.json(result);
  } catch (error) {
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}

export async function POST(request: NextRequest) {
  try {
    const data = await request.json();
    const result = await cloudflareHandler.handleCreateZone(data);
    
    if (!result.success) {
      return NextResponse.json({ error: result.error }, { status: 400 });
    }

    return NextResponse.json(result, { status: 201 });
  } catch (error) {
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}

📚 API 参考

CloudflareHandler

主要的处理器类,提供所有 Cloudflare API 操作的统一接口。

Zone 管理方法

  • handleGetZones(data: ZoneListRequest): Promise<PaginatedResponse<CloudflareZone>>
  • handleGetZoneById(zoneId: string): Promise<ServiceResponse<CloudflareZone>>
  • handleCreateZone(data: ZoneManagementRequest): Promise<ServiceResponse<CloudflareZone>>
  • handleDeleteZone(zoneId: string): Promise<ServiceResponse<boolean>>

DNS 记录管理方法

  • handleGetDnsRecords(data: DnsListRequest): Promise<PaginatedResponse<CloudflareDnsRecord>>
  • handleGetDnsRecordById(zoneId: string, recordId: string): Promise<ServiceResponse<CloudflareDnsRecord>>
  • handleCreateDnsRecord(data: DnsManagementRequest): Promise<ServiceResponse<CloudflareDnsRecord>>
  • handleUpdateDnsRecord(zoneId: string, recordId: string, data: Partial<DnsManagementRequest>): Promise<ServiceResponse<CloudflareDnsRecord>>
  • handleDeleteDnsRecord(zoneId: string, recordId: string): Promise<ServiceResponse<boolean>>

Pages 项目管理方法

  • handleGetPagesProjects(data: PagesListRequest): Promise<PaginatedResponse<CloudflarePagesProject>>
  • handleGetPagesProjectByName(projectName: string, accountId?: string): Promise<ServiceResponse<CloudflarePagesProject>>
  • handleCreatePagesProject(data: PagesProjectRequest): Promise<ServiceResponse<CloudflarePagesProject>>
  • handleDeletePagesProject(projectName: string, accountId?: string): Promise<ServiceResponse<boolean>>
  • handleGetPagesCustomDomains(projectName: string, accountId?: string): Promise<ServiceResponse<CloudflarePagesCustomDomain[]>>
  • handleAddPagesCustomDomain(data: PagesCustomDomainRequest): Promise<ServiceResponse<CloudflarePagesCustomDomain>>
  • handleRemovePagesCustomDomain(projectName: string, domainName: string, accountId?: string): Promise<ServiceResponse<boolean>>

🔒 环境变量

CLOUDFLARE_API_TOKEN=your-api-token
CLOUDFLARE_ACCOUNT_ID=your-account-id

📄 许可证

MIT

🤝 贡献

欢迎提交 Issue 和 Pull Request!