mirror of
https://github.com/Silentely/eSIM-Tools.git
synced 2026-09-03 14:30:18 +08:00
- 从 netlify.toml 中移除 `/giffgaff-legacy` 和 `/simyo-legacy` 重定向规则,清理不再使用的旧版页面路由 - 新增 runtime-common.sh 文件,提供跨语言(中英文)共享的运行时函数,包括 JSON 转义、安全检测、系统信息缓存等核心功能 - 更新 legacy-freeze.json,清空冻结文件列表,反映不再需要保护旧版页面文件的状态 - 修改多个脚本文件(pre-commit-check.js、pre-push-check.js、security-check.js),移除对已弃用页面的保护逻辑 - 调整服务入口文件(server.js、simyo_proxy_server.js)和 Service Worker(sw.js),删除对旧版 HTML 文件的引用和服务逻辑
176 lines
3.8 KiB
JavaScript
176 lines
3.8 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* pre-push 检查:
|
|
* 1) 先执行 pre-commit 级别检查,保证待推送内容格式与基础语法正确;
|
|
* 2) 快速模式仅执行相关测试,全量模式执行完整测试。
|
|
*/
|
|
|
|
const { execFileSync, spawnSync } = require('child_process');
|
|
|
|
const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
|
|
const RELATED_EXTENSIONS = new Set(['.js', '.mjs', '.cjs', '.json']);
|
|
const PROTECTED_FILES = [];
|
|
|
|
function runGit(args) {
|
|
return execFileSync('git', args, {
|
|
encoding: 'utf8',
|
|
stdio: ['ignore', 'pipe', 'pipe']
|
|
});
|
|
}
|
|
|
|
function resolveMode() {
|
|
const argMode = process.argv
|
|
.find(arg => arg.startsWith('--mode='))
|
|
?.split('=')[1];
|
|
const envMode = process.env.PREPUSH_MODE;
|
|
const mode = (argMode || envMode || 'full').toLowerCase();
|
|
return mode === 'fast' ? 'fast' : 'full';
|
|
}
|
|
|
|
function getDiffRange() {
|
|
try {
|
|
const upstream = runGit([
|
|
'rev-parse',
|
|
'--abbrev-ref',
|
|
'--symbolic-full-name',
|
|
'@{upstream}'
|
|
]).trim();
|
|
if (upstream) {
|
|
return `${upstream}...HEAD`;
|
|
}
|
|
} catch (_) {
|
|
// ignore and fallback
|
|
}
|
|
|
|
try {
|
|
runGit(['rev-parse', '--verify', 'HEAD~1']);
|
|
return 'HEAD~1..HEAD';
|
|
} catch (_) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function getRelatedFiles() {
|
|
const range = getDiffRange();
|
|
if (!range) {
|
|
return [];
|
|
}
|
|
|
|
const output = runGit([
|
|
'diff',
|
|
'--name-only',
|
|
'--diff-filter=ACMR',
|
|
'-z',
|
|
range
|
|
]);
|
|
const files = output.split('\0').filter(Boolean);
|
|
|
|
return files.filter(file => {
|
|
const lowerFile = file.toLowerCase();
|
|
for (const ext of RELATED_EXTENSIONS) {
|
|
if (lowerFile.endsWith(ext)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function getTouchedProtectedFiles() {
|
|
if (PROTECTED_FILES.length === 0) return [];
|
|
const range = getDiffRange();
|
|
if (!range) {
|
|
return [];
|
|
}
|
|
|
|
const output = runGit([
|
|
'diff',
|
|
'--name-only',
|
|
'--diff-filter=ACMR',
|
|
'-z',
|
|
range,
|
|
'--',
|
|
...PROTECTED_FILES
|
|
]);
|
|
|
|
return output.split('\0').filter(Boolean);
|
|
}
|
|
|
|
function buildSteps(mode) {
|
|
const steps = [
|
|
{
|
|
name: 'pre-commit 检查',
|
|
args: ['run', 'precommit:check']
|
|
}
|
|
];
|
|
|
|
if (mode === 'fast') {
|
|
const relatedFiles = getRelatedFiles();
|
|
if (relatedFiles.length > 0) {
|
|
steps.push({
|
|
name: `相关测试检查(${relatedFiles.length} 个文件)`,
|
|
args: [
|
|
'test',
|
|
'--',
|
|
'--bail',
|
|
'--findRelatedTests',
|
|
'--passWithNoTests',
|
|
...relatedFiles
|
|
]
|
|
});
|
|
} else {
|
|
steps.push({
|
|
name: '测试检查(未识别差异文件,回退全量测试)',
|
|
args: ['test', '--', '--bail']
|
|
});
|
|
}
|
|
return steps;
|
|
}
|
|
|
|
steps.push({
|
|
name: '全量测试检查',
|
|
args: ['test', '--', '--bail']
|
|
});
|
|
|
|
return steps;
|
|
}
|
|
|
|
function runStep(step) {
|
|
console.log(`\n🔎 执行 ${step.name}...`);
|
|
const result = spawnSync(npmCmd, step.args, {
|
|
stdio: 'inherit',
|
|
env: process.env
|
|
});
|
|
|
|
if (result.status !== 0) {
|
|
console.error(`\n❌ ${step.name}未通过,已阻止 push。`);
|
|
process.exit(result.status || 1);
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
const mode = resolveMode();
|
|
console.log(`\n🧭 pre-push 模式: ${mode}`);
|
|
|
|
const touchedProtectedFiles = getTouchedProtectedFiles();
|
|
if (touchedProtectedFiles.length > 0) {
|
|
console.error('\n❌ pre-push 检查失败:');
|
|
for (const relPath of touchedProtectedFiles) {
|
|
console.error(` - ${relPath}: 该文件受保护,禁止推送包含其改动的提交。`);
|
|
}
|
|
console.error(' - 如确需调整,请改为维护对应 modular 版本文件。');
|
|
process.exit(1);
|
|
}
|
|
|
|
const steps = buildSteps(mode);
|
|
|
|
for (const step of steps) {
|
|
runStep(step);
|
|
}
|
|
console.log('\n✅ pre-push 检查全部通过');
|
|
}
|
|
|
|
main();
|