feat: 初始化静态镜像站点仓库
This commit is contained in:
133
scripts/generate_site_sourcemaps.mjs
Normal file
133
scripts/generate_site_sourcemaps.mjs
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { spawnSync } from "node:child_process";
|
||||
|
||||
const ROOT = "/Users/yuanjiantsui/dev/05-work/site";
|
||||
const OUTPUT_ROOT = path.join(ROOT, "output", "sourcemaps");
|
||||
|
||||
const JOBS = [
|
||||
{
|
||||
name: "hc-pos-js",
|
||||
roots: [path.join(ROOT, "hc-pos.sqygj.cn", "static", "js")],
|
||||
exts: new Set([".js"])
|
||||
},
|
||||
{
|
||||
name: "hc-pos-css",
|
||||
roots: [path.join(ROOT, "hc-pos.sqygj.cn", "static", "css")],
|
||||
exts: new Set([".css"])
|
||||
},
|
||||
{
|
||||
name: "hc-etms-js",
|
||||
roots: [path.join(ROOT, "hc-etms.sqygj.cn", "static", "js")],
|
||||
exts: new Set([".js"])
|
||||
},
|
||||
{
|
||||
name: "hc-etms-css",
|
||||
roots: [path.join(ROOT, "hc-etms.sqygj.cn", "static", "css")],
|
||||
exts: new Set([".css"])
|
||||
},
|
||||
{
|
||||
name: "runtime-js",
|
||||
roots: [
|
||||
path.join(ROOT, "__mirror", "runtime", "hc-pos-dashboard", "runtime-bootstrap.js"),
|
||||
path.join(ROOT, "__mirror", "runtime", "hc-etms-dashboard", "runtime-bootstrap.js")
|
||||
],
|
||||
exts: new Set([".js"])
|
||||
}
|
||||
];
|
||||
|
||||
function walkFiles(targetPath, exts, bucket) {
|
||||
const stat = fs.statSync(targetPath);
|
||||
if (stat.isFile()) {
|
||||
if (exts.has(path.extname(targetPath))) {
|
||||
bucket.push(targetPath);
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (const entry of fs.readdirSync(targetPath, { withFileTypes: true })) {
|
||||
const entryPath = path.join(targetPath, entry.name);
|
||||
if (entry.isDirectory()) {
|
||||
walkFiles(entryPath, exts, bucket);
|
||||
continue;
|
||||
}
|
||||
if (entry.isFile() && exts.has(path.extname(entry.name))) {
|
||||
bucket.push(entryPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function collectFiles(roots, exts) {
|
||||
const files = [];
|
||||
for (const root of roots) {
|
||||
if (!fs.existsSync(root)) {
|
||||
continue;
|
||||
}
|
||||
walkFiles(root, exts, files);
|
||||
}
|
||||
return files.sort();
|
||||
}
|
||||
|
||||
function ensureDir(dir) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
function buildFile(inputPath) {
|
||||
const relativePath = path.relative(ROOT, inputPath);
|
||||
const outputPath = path.join(OUTPUT_ROOT, relativePath);
|
||||
ensureDir(path.dirname(outputPath));
|
||||
|
||||
const args = [
|
||||
"--yes",
|
||||
"esbuild",
|
||||
inputPath,
|
||||
`--outfile=${outputPath}`,
|
||||
"--sourcemap=external",
|
||||
"--sources-content=true",
|
||||
"--charset=utf8",
|
||||
"--log-level=error"
|
||||
];
|
||||
|
||||
const result = spawnSync("npx", args, {
|
||||
cwd: ROOT,
|
||||
encoding: "utf8"
|
||||
});
|
||||
|
||||
if (result.status !== 0) {
|
||||
throw new Error(`esbuild 失败: ${relativePath}\n${result.stderr || result.stdout}`);
|
||||
}
|
||||
|
||||
return {
|
||||
input: relativePath,
|
||||
output: path.relative(ROOT, outputPath),
|
||||
map: path.relative(ROOT, `${outputPath}.map`)
|
||||
};
|
||||
}
|
||||
|
||||
function main() {
|
||||
ensureDir(OUTPUT_ROOT);
|
||||
const manifest = {
|
||||
generated_at: new Date().toISOString(),
|
||||
root: ROOT,
|
||||
output_root: path.relative(ROOT, OUTPUT_ROOT),
|
||||
jobs: []
|
||||
};
|
||||
|
||||
for (const job of JOBS) {
|
||||
const files = collectFiles(job.roots, job.exts);
|
||||
const outputs = files.map((file) => buildFile(file));
|
||||
manifest.jobs.push({
|
||||
name: job.name,
|
||||
count: outputs.length,
|
||||
outputs
|
||||
});
|
||||
console.log(`${job.name}: ${outputs.length} 个文件`);
|
||||
}
|
||||
|
||||
const manifestPath = path.join(OUTPUT_ROOT, "manifest.json");
|
||||
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
||||
console.log(`manifest: ${manifestPath}`);
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user