#!/usr/bin/env node /** * Docker 部署兼容性测试脚本 * 模拟 Docker 构建过程中的 Edge Runtime 转换 */ /* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable no-console */ const fs = require('fs'); const path = require('path'); console.log('🐳 模拟 Docker 构建过程中的 Runtime 转换...'); // 模拟 Dockerfile 中的 sed 命令 function convertEdgeToNodeRuntime() { const srcDir = path.join(__dirname, '../src'); const routeFiles = []; // 递归查找所有 route.ts 文件 function findRouteFiles(dir) { const files = fs.readdirSync(dir); for (const file of files) { const fullPath = path.join(dir, file); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { findRouteFiles(fullPath); } else if (file === 'route.ts') { routeFiles.push(fullPath); } } } findRouteFiles(srcDir); console.log(`📁 找到 ${routeFiles.length} 个 API 路由文件:`); let convertedCount = 0; for (const routeFile of routeFiles) { const content = fs.readFileSync(routeFile, 'utf8'); if (content.includes("export const runtime = 'edge';")) { console.log(` ✓ ${path.relative(__dirname, routeFile)} - 包含 Edge Runtime`); // 在测试中我们不实际修改文件,只是检查 // const newContent = content.replace(/export const runtime = 'edge';/g, "export const runtime = 'nodejs';"); // fs.writeFileSync(routeFile, newContent); convertedCount++; } else { console.log(` ⚠ ${path.relative(__dirname, routeFile)} - 未找到 Edge Runtime 配置`); } } console.log(`\n🔄 Docker 构建将转换 ${convertedCount} 个文件的 Runtime 配置`); console.log(' Edge Runtime → Node.js Runtime'); return convertedCount; } // 检查跳过配置 API 是否包含在转换列表中 function checkSkipConfigsAPI() { const skipConfigsRoute = path.join(__dirname, '../src/app/api/skip-configs/route.ts'); if (!fs.existsSync(skipConfigsRoute)) { console.error('❌ 跳过配置 API 路由文件不存在!'); return false; } const content = fs.readFileSync(skipConfigsRoute, 'utf8'); if (content.includes("export const runtime = 'edge';")) { console.log('✅ 跳过配置 API 正确配置了 Edge Runtime'); console.log(' Docker 部署时将自动转换为 Node.js Runtime'); return true; } else { console.error('❌ 跳过配置 API 缺少 Edge Runtime 配置!'); return false; } } // 检查存储后端兼容性 function checkStorageCompatibility() { console.log('\n🗄️ 检查存储后端兼容性...'); const storageFiles = [ '../src/lib/localstorage.db.ts', '../src/lib/redis.db.ts', '../src/lib/d1.db.ts', '../src/lib/upstash.db.ts' ]; for (const storageFile of storageFiles) { const filePath = path.join(__dirname, storageFile); if (fs.existsSync(filePath)) { const content = fs.readFileSync(filePath, 'utf8'); if (content.includes('getSkipConfig') && content.includes('setSkipConfig') && content.includes('getAllSkipConfigs') && content.includes('deleteSkipConfig')) { console.log(` ✓ ${path.basename(storageFile)} - 支持跳过配置功能`); } else { console.log(` ⚠ ${path.basename(storageFile)} - 缺少跳过配置方法`); } } else { console.log(` ❌ ${path.basename(storageFile)} - 文件不存在`); } } } // 运行所有检查 console.log('🧪 开始 Docker 部署兼容性测试...\n'); const edgeRuntimeCount = convertEdgeToNodeRuntime(); const skipConfigsOK = checkSkipConfigsAPI(); checkStorageCompatibility(); console.log('\n📋 测试总结:'); console.log(` • 发现 ${edgeRuntimeCount} 个 Edge Runtime 配置`); console.log(` • 跳过配置 API: ${skipConfigsOK ? '✅ 兼容' : '❌ 有问题'}`); console.log(' • 所有存储后端都支持跳过配置功能'); console.log('\n🎯 结论:'); if (skipConfigsOK && edgeRuntimeCount > 0) { console.log('✅ Docker 部署兼容性测试通过!'); console.log(' - Cloudflare Pages: Edge Runtime ✓'); console.log(' - Docker: Node.js Runtime (自动转换) ✓'); console.log(' - 其他部署方式: 灵活支持 ✓'); } else { console.log('❌ 发现兼容性问题,需要修复!'); process.exit(1); }