Files
eSIM-Tools/scripts/build-static.js
Abner 49ac9e15ff ♻️ refactor: 废弃 Legacy 前端,统一使用 Modular 版本
- 删除 giffgaff_complete_esim.html 和 simyo_complete_esim.html
- 构建脚本自动排除 Legacy HTML 文件
- Netlify 添加 Legacy URL 301 重定向到 Modular 版本
- 移除 verify-legacy-frozen.js 构建检查
- 更新 6 个文档文件中的 Legacy 文件引用

修复 Issue #50: Legacy 前端缺少 simSwapMfaChallenge 步骤导致 500 错误
2026-05-17 23:25:47 +08:00

122 lines
3.6 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
const BuildLogger = require('./logger.js');
const transpileDistJs = require('./transpile-dist-js.js');
const fs = require('fs');
const path = require('path');
const projectRoot = path.join(__dirname, '..');
const distDir = path.join(projectRoot, 'dist');
const entries = [
'index.html',
'manifest.webmanifest',
'src'
];
// 需要额外复制到 dist 根目录的资源(浏览器默认请求 /favicon.ico
const rootAssets = [
{ from: 'src/assets/favicon.ico', to: 'favicon.ico' },
{ from: 'llms.txt', to: 'llms.txt' }
];
async function removeDist() {
await fs.promises.rm(distDir, { recursive: true, force: true });
}
async function copyEntry(entry) {
const from = path.join(projectRoot, entry);
const to = path.join(distDir, entry);
if (!fs.existsSync(from)) {
console.warn(`⚠️ 跳过不存在的入口: ${entry}`);
return;
}
try {
const stats = await fs.promises.stat(from);
if (stats.isDirectory()) {
await copyDirectory(from, to);
} else {
await fs.promises.mkdir(path.dirname(to), { recursive: true });
await fs.promises.copyFile(from, to);
}
} catch (err) {
console.error(`❌ 复制失败 ${entry}:`, err.message);
throw err;
}
}
async function copyDirectory(source, destination) {
try {
await fs.promises.mkdir(destination, { recursive: true });
const entries = await fs.promises.readdir(source, { withFileTypes: true });
for (const entry of entries) {
const srcPath = path.join(source, entry.name);
const destPath = path.join(destination, entry.name);
try {
if (entry.isDirectory()) {
await copyDirectory(srcPath, destPath);
} else if (entry.isFile()) {
await fs.promises.copyFile(srcPath, destPath);
}
} catch (fileErr) {
console.warn(`⚠️ 跳过文件 ${entry.name}:`, fileErr.message);
// 继续处理其他文件
}
}
} catch (err) {
throw new Error(`复制目录失败 ${source}: ${err.message}`);
}
}
(async () => {
BuildLogger.log('🧹 清理 dist 目录...');
await removeDist();
await fs.promises.mkdir(distDir, { recursive: true });
for (const entry of entries) {
BuildLogger.log(`📦 复制 ${entry} -> dist/${entry}`);
await copyEntry(entry);
}
// 复制根目录资源(如 favicon.ico
for (const { from, to } of rootAssets) {
const srcPath = path.join(projectRoot, from);
const destPath = path.join(distDir, to);
if (fs.existsSync(srcPath)) {
BuildLogger.log(`📎 复制 ${from} -> dist/${to}`);
await fs.promises.copyFile(srcPath, destPath);
} else {
console.warn(`⚠️ 根资源不存在: ${from}`);
}
}
// 删除 Legacy HTML 文件(已废弃,统一使用 Modular 版本)
const legacyHtmlFiles = [
path.join(distDir, 'src', 'giffgaff', 'giffgaff_complete_esim.html'),
path.join(distDir, 'src', 'simyo', 'simyo_complete_esim.html')
];
for (const f of legacyHtmlFiles) {
if (fs.existsSync(f)) {
await fs.promises.unlink(f);
BuildLogger.log(`🗑️ 已删除 Legacy 文件: ${path.relative(projectRoot, f)}`);
}
}
BuildLogger.log('🧩 转译 dist/src 下的 JSbrowserslist 目标)...');
await transpileDistJs();
// 注入 Sentry 配置
BuildLogger.log('🔧 注入 Sentry 配置...');
require('./inject-sentry-config.js');
// 生成 AI Agent 元数据文件
BuildLogger.log('🤖 生成 Agent 元数据...');
require('./generate-agent-metadata.js');
BuildLogger.success(' 静态资源构建完成,输出目录 dist/');
})().catch(err => {
console.error('构建静态资源失败:', err);
process.exitCode = 1;
});