/** * 查找所有使用 postgrest 函数的文件 * 使用方法: node scripts/find-postgrest-calls.js */ const fs = require('fs'); const path = require('path'); const postgrestFunctions = [ 'postgrestGet', 'postgrestPost', 'postgrestPut', 'postgrestDelete' ]; function findPostgrestCalls(dir, results = {}) { const files = fs.readdirSync(dir); for (const file of files) { const filePath = path.join(dir, file); const stat = fs.statSync(filePath); // 跳过 node_modules 和其他不相关目录 if (stat.isDirectory()) { if (!file.startsWith('.') && file !== 'node_modules' && file !== 'build') { findPostgrestCalls(filePath, results); } continue; } // 只检查 .ts 和 .tsx 文件 if (!file.endsWith('.ts') && !file.endsWith('.tsx')) { continue; } const content = fs.readFileSync(filePath, 'utf-8'); const lines = content.split('\n'); // 查找 postgrest 函数调用 const calls = []; lines.forEach((line, index) => { postgrestFunctions.forEach(fn => { if (line.includes(`${fn}(`)) { calls.push({ line: index + 1, code: line.trim(), function: fn }); } }); }); if (calls.length > 0) { const relativePath = path.relative(process.cwd(), filePath); results[relativePath] = calls; } } return results; } // 执行查找 console.log('🔍 正在查找所有 postgrest 调用...\n'); const appDir = path.join(process.cwd(), 'app'); const results = findPostgrestCalls(appDir); // 分类显示结果 const apiFiles = []; const routeFiles = []; const otherFiles = []; Object.keys(results).forEach(file => { if (file.includes('app/api/')) { apiFiles.push(file); } else if (file.includes('app/routes/')) { routeFiles.push(file); } else { otherFiles.push(file); } }); // 显示统计 console.log('📊 统计结果'); console.log('====================================='); console.log(`API 文件: ${apiFiles.length} 个`); console.log(`路由文件: ${routeFiles.length} 个`); console.log(`其他文件: ${otherFiles.length} 个`); console.log(`总计: ${Object.keys(results).length} 个文件\n`); // 显示 API 文件 if (apiFiles.length > 0) { console.log('📁 API 文件'); console.log('====================================='); apiFiles.forEach(file => { console.log(`\n${file}`); results[file].forEach(call => { console.log(` 行 ${call.line}: ${call.function}()`); }); }); } // 显示路由文件 if (routeFiles.length > 0) { console.log('\n\n📄 路由文件'); console.log('====================================='); routeFiles.forEach(file => { console.log(`\n${file}`); results[file].forEach(call => { console.log(` 行 ${call.line}: ${call.function}()`); }); }); } // 显示其他文件 if (otherFiles.length > 0) { console.log('\n\n📦 其他文件'); console.log('====================================='); otherFiles.forEach(file => { console.log(`\n${file}`); results[file].forEach(call => { console.log(` 行 ${call.line}: ${call.function}()`); }); }); } // 生成 Markdown 清单 const mdContent = `# PostgreSQL 调用清单 生成时间: ${new Date().toLocaleString('zh-CN')} ## 统计 - API 文件: ${apiFiles.length} 个 - 路由文件: ${routeFiles.length} 个 - 其他文件: ${otherFiles.length} 个 - **总计: ${Object.keys(results).length} 个文件** ## API 文件 ${apiFiles.map(file => `- [ ] \`${file}\` (${results[file].length} 处调用)`).join('\n')} ## 路由文件 ${routeFiles.map(file => `- [ ] \`${file}\` (${results[file].length} 处调用)`).join('\n')} ${otherFiles.length > 0 ? `## 其他文件\n\n${otherFiles.map(file => `- [ ] \`${file}\` (${results[file].length} 处调用)`).join('\n')}` : ''} ## 修改建议 ### 优先级 1:路由文件(高优先级) 路由文件直接处理用户请求,应优先修改: ${routeFiles.slice(0, 5).map((file, i) => `${i + 1}. \`${file}\``).join('\n')} ### 优先级 2:API 文件(中优先级) API 文件被路由调用,可以创建带 JWT 的封装: ${apiFiles.slice(0, 5).map((file, i) => `${i + 1}. \`${file}\``).join('\n')} ### 修改模板 \`\`\`typescript // 在 loader/action 中 import { getJwtFromRequest } from "~/api/jwt-helper.server"; export async function loader({ request }: LoaderFunctionArgs) { const jwt = await getJwtFromRequest(request); // 方式 1: 直接传递 const response = await postgrestGet('table_name', { token: jwt }); // 方式 2: 使用现有参数 const response = await postgrestGet('table_name', { ...otherParams, token: jwt }); return json(response); } \`\`\` `; fs.writeFileSync('POSTGREST_CALLS_CHECKLIST.md', mdContent); console.log('\n\n✅ 已生成清单文件: POSTGREST_CALLS_CHECKLIST.md'); console.log('\n💡 提示: 可以用这个文件追踪修改进度');