/** * 重复 API 调用审计脚本 * * 检测三类违规(违反 AGENTS.md「API 调用去重」规范): * A. 生命周期重复触发:同一个方法 / API 同时在 onLoad 和 onShow(或 onLoad+mounted 等 * 两个生命周期钩子)里被调用,首次进入页面时会双发。 * B. 同接口多封装:utils/api.js 里多个导出函数指向同一个后端 URL(params 不同算 * 合法变体,不算违规;纯重复封装算违规)。 * C. N+1 循环调用:在 .map / forEach / for 循环里调用 API 包装函数,N 个元素 → N 次请求。 * * 用法:node scripts/audit-duplicate-api-calls.js [--pages-dir=pages] * 退出码:0 = 无违规;1 = 发现违规(CI 可直接用作门禁) */ var fs = require('fs') var path = require('path') var root = path.resolve(__dirname, '..') var pagesDir = process.argv.slice(2).reduce(function (acc, a) { var m = a.match(/^--pages-dir=(.+)$/) return m ? m[1] : acc }, 'pages') var scanRoot = path.join(root, pagesDir) if (!fs.existsSync(scanRoot)) { console.error('[audit] pages dir not found: ' + scanRoot) process.exit(2) } // ---------- 工具:递归收集 .vue ---------- function walk(dir, out) { var entries = fs.readdirSync(dir) for (var i = 0; i < entries.length; i++) { var p = path.join(dir, entries[i]) var st = fs.statSync(p) if (st.isDirectory()) walk(p, out) else if (p.slice(-4) === '.vue') out.push(p) } return out } // ---------- 工具:取